zoukankan      html  css  js  c++  java
  • MySQL管理和配置

    10. optimize table

    命令:optimize [ NO_WRITE_TO_BINLOG | LOCAL ] table「tbl_name」,「tbl_name」...

    功能: 重新组织表数据和相关索引数据的物理存储,减少存储空间,并提高表的I/O访问效率。

    应用场景:

            ① InnoDB表在创建的时候,若开启了innodb_file_per_table选项,该表将拥有属于自己的.idb文件。对这种InnoDB表做了大量的insert, update, delete操作后,可以使用optimize table命令重组表和索引,并归还磁盘空间以供操作系统使用;

            ② 对MyISAM和ARCHIVE表做了大量删除操作,或者对具有可变长度行的MyISAM和ARCHIVE表(即拥有VARCHAR, VARBINARY, BLOB或TEXT类型字段的表)做了大量修改后,删除掉的行被维护在一个链表中,后续insert操作可以重用旧行的位置,此时你可以使用optimize table命令回收未使用的空间并对数据文件进行碎片整理。在对表做了大量修改后,此命令可能会显著提高使用该表的语句的性能;


    权限:要求对表具有select和insert权限

    适用范围:存储引擎为InnoDB, MyISAM, ARCHIVE的表和分区表,不支持视图

    日志记录:默认情况下,服务器将optimize table语句写入二进制日志,以便它们复制到slave。要禁止日志记录,请指定NO_WRITE_TO_BINLOG或LOCAL关键字


    输出格式:


    见下图


    InnoDB说明:

    对于InnoDB表,optimize table被映射为alter table,此操作会重建表以更新索引统计信息,并释放聚簇索引中未使用的空间。它无法使用快速索引创建。同时辅助索引也无法被高效地创建,因为辅助索引的键是按照它们在主键中出现的顺序插入的。

    在考虑是否运行优化时,请考虑以下几点:

    ◇ 一定程度的碎片是可取的。InnoDB仅填充页面容积的93%(填充因子15/16),留下少量空间,从而使得更新操作无需分页;

    ◇ 删除操作会在页面内留下间隙,从而使得页面填充不完全,此时可以考虑运行优化;

    ◇ 当有足够的空间可用时,对行的更新通常只是重写同一页面中的数据,具体取决于数据类型和行格式;

    ◇ 随着时间的推移,高并发的工作负载可能会在索引中留下间隙,因为InnoDB使用MVCC机制保存相同数据的多个版本;



    说明:

    ① optimize table对一个表所做的修改,取决于该表使用的存储引擎

    ② 请注意,在optimize table执行期间,MySQL会锁住整张表



    9. flush privileges

    功能:命令服务器重新加载权限表,从而使设置生效

    说明:

    ① 服务器每次启动时,读取权限表的内容,到内存

    ② 如在服务器运行过程中,修改了权限,为使设置生效,需执行该命令

    ③ 否则服务器重启,设置方可生效

    ④ 只有直接修改权限表,如mysql.user,的情况下,才需重新加载

    ⑤ 使用账号管理命令,如「create user」「grant」「revoke」「rename」「drop user」「set password」的情况下,无需重载权限表



    8. 字符编码

    萨达



    7. 连接验证

    连接验证,是MySQL根据你发起连接的client主机和你指定的用户名,与mysql.user表中的「Host」「User」「Password」三个字段,进行匹配的过程


    7.1 验证过程

    无论何时MySQL将user表中的内容读入内存,都会对其排序

    当一个client尝试连接时,MySQL按序查找内存中已排序的记录行

    匹配client主机名和用户名的第一个条目,即为结果


    7.2 排序规则

    字段的排序优先级为:「Host」>「User」,即先按「Host」排,「Host」相同的然后按照「User」排

    同一字段,按照字段值识别度由高到低的顺序排列,即:

    「Host」为主机名或者IP地址字面值的条目,排在最前;「%」代表任意主机,识别度最低,排在最后;「''」空字符串同样代表任意主机,但排在「%」之后;对于「Host」值相同的条目,「User」识别度最高的排在最前;「User」为空时,可以匹配任意用户,识别度最低,排在最后;对于「Host」和「User」识别度相同的两个条目,两者顺序不确定


    示例

    假设user表中数据如下图所示


    经过排序后如下图所示



    7.3 要点

    ◇ 如果一个client最终匹配的是,user表中「User」字段为空的条目,那么无论client实际指定的用户名为甚,该client均以匿名用户的身份登录

    ◇ 登录成功后,如果你发现当前账号权限与你期望的不同,那么有一种可能是你被作为其它账号而登录,此时,你可以使用CURRENT_USER()函数查看当前账号



    6. user

    mysql库的user表,负责存储账号相关的所有信息,包括「主机」+「用户」+「密码」+「账号权限」,分别对应字段「Host」「User」「Password」「Opt_priv」


    6.1 描述

    ◇ MySQL中的账号,全部存储于mysql库的user表中,每一个账号都对应有一个条目,其中的用户名和主机名分开存储,分别对应字段「User」和「Host」

    「User」若为空(空字符串),则匹配所有用户名,例如,假设user表中的一个账号,它的「User」字段为空,则从特定主机「Host」连接的所有用户,都可以匹配该条目

    ◇ 「User」不同,「Password」字段为空,并不意味着能够匹配任意密码,而是要求client连接时,一定不能指定密码,否则无法匹配

    「Host」既可以是真正的主机名,也可以是主机IP,它们都支持通配符「百分号%」和「下划线_」,用法和运算符「LIKE」中的用法相同,例如,若「Host」为'%',则可以匹配所有主机;若「Host」为'%.mysql.com',则可以匹配mysql.com域名下的所有主机;若「Host」为'192.168.1.%',则将匹配'192.168.1'网段下的所有主机

    ◇ 使用名字格式的主机名,具有不确定性,建议「Host」字段值使用「ip」


    注意,对user表的任何修改,都要执行「FLUSH PRIVILEGES」命令,让服务器重新加载权限表,从而使设置生效


    6.2 操作

    通过user表,可以对账号进行操作,但是一旦误操作,后果极为严重,因此不建议直接操作user表,以下仅供参考


    添加

    insert into mysql.user(Host, User, Password) values('host', 'user', password('some_pass'));



    查看

    select Host, User, Password from mysql.user;



    更新

    update mysql.user set「column」= 'new_value' where「column_other」= 'some_value';



    删除

    delete from mysql.user where「column」= 'value'




    5. 账号

    ◇ MySQL的账号由「用户名」和「主机名」两部分构成,所以相同的「用户名」、不同的「主机名」属于两个不同的账号

    ◇ 账号名的格式为:'user_name'@'host_name',一个仅包含「用户名」的账号,实际上相当于'user_name'@'%',即账号'me'等价于'me'@'%'

    ◇「用户名」和「主机名」可以不加引号,但是当

            ① 「用户名」中含有特殊字符,如「空格 」、「减号-」

            ② 「主机名」中含有特殊字符或通配符,如「点号.」、「百分号%」

    时,必须加引号,可以使用的有「反引号`」、「单引号'」和「双引号"」

    ◇ MySQL在连接验证时,「用户名」大小写敏感,「主机名」大小写不敏感


    5.1 账号管理

    ☆ 添加

    命令:create user「Accountidentified by「Password

    功能:创建账号「Account」,密码为「Password

    示例:创建新账号"test"@"%",密码为"test"


    说明:

    ① 若账号只包含用户名,则主机名默认为%

    ② 新创建的账号,需调用GRANT命令赋予权限,否则无任何权限

    ③ 该命令会在mysql.user表中插入一条无任何权限的新记录,对应于新创建的账号

    ④ identified by 指定的密码经过hash加密后,存入mysql.user表的Password字段


    ☆ 授权

    命令:grant「Privs」on「Database.Table」toAccount

    功能:赋予账号「Account」对数据库「Database」的「Table」表的「Privs」权限

    选项和参数:

    all privileges代表所有权限

    usage表示无任何权限,或不改变任何权限,即在保留当前权限不变的前提下,只修改特定权限

    with grant option赋予账号权限,允许该账号将其在特定级别下所拥有的权限,赋予其它账号


    示例:赋予账号"test"@"%"对所有数据库和所有表的全部权限,以及grant option权限



    ☆ 撤销权限

    命令:

    ① revoke「Privs」on「Database.Table」from「Account」

    ② revoke all privileges, grant option from「Account」

    功能:

    ① 撤销账号「Account」对数据库「Database」的「Table」表的「Privs」权限

    ② 撤销账号「Account」在所有级别下的全部权限,全局,数据库,表,列,例程

    示例:

    撤销账号的插入权限


    撤销账号的全部权限



    查看权限

    命令:show grants for「Account

    功能:查看账号「Account」的权限

    示例:查看"test"@"localhost"的权限


    查看当前用户的权限


    说明:

    ① 查看当前用户权限:show grants; show grants for current_user; show grants for current_user();

    ② all privileges代表所有权限,usage表示不具有任何权限


    ☆ 重命名

    命令:rename user「Old_Account」to「New_Account

    功能:将账号「Old_Account」重命名为「New_Account

    示例:



    ☆ 密码

    命令:set password for「Account」= password("some_pass")

    功能:设置或修改密码

    示例:


    修改当前用户的密码



    ☆ 删除

    命令:drop user「Account

    功能:删除账号「Account

    说明:对于当前已打开的会话,不受影响;会话关闭后重连,或者使用该账号的新连接,登录失败

    示例:



    5.2 安全问题

    账号操作过程中,如「create user「grant「set password」,可能在日志文件~/.mysql_history里面留下敏感信息,如密码明文,需要加以留意



    4. mysqladmin

    mysqladmin是管理工具,用于执行管理性操作

    命令:mysqladmin -h [Host] -P [port] -u [UserName] -pPwd [Cmd]

    使用:

    每秒捕获一次SHOW GLOBAL STATUS    :    mysqladmin ext -i1



    3. mysql

    mysql是命令行工具,用于执行sql语句

    命令:mysql -h「Host」-P「port」-u「User」-pPwd  -e "Cmd"「Database」

    说明:如果没有指定User」,默认为「root」

    示例:





    安全问题

    该工具,会将用户在使用它的过程中执行过的所有语句,都记录到日志文件中,默认为~/.mysql_history,这将导致一些敏感信息,如密码明文,都存在于该文件里面,如下图所示

    如果你不想维护该历史文件,你可以手动删除它,然后使用下列两种方式之一来防止它再次生成:

    ① 将环境变量「MYSQL_HISTFILE」设置为「/dev/null」,为了每次登陆时总生效,可以将该设置放入shell的启动文件

    ② 创建符号链接「$HOME/.mysql_history」,指向「/dev/null



    2. 查看配置文件

    ① 查看命令行选项--defaults-file

    ps -ef | grep mysqld


    ② 查看默认配置文件

    /path/mysqld --verbose --help 2>/dev/null | grep -A 1 "Default options" --color=always

    mysql按上述顺序查找配置文件



    1. 运行MySQL

    命令:mysqld_safe --user=mysql &



    MySQL的账号由「用户名」和「主机名」两部分构成,所以相同的「用户名」、不同的「主机名」属于两个不同的账号

    账号名的格式为:'user_name'@'host_name'

  • 相关阅读:
    Entity Framework with NOLOCK
    读取的XML节点中带有冒号怎么办?
    一道数学运算题
    mock基本使用
    json-server基本使用
    axios、ajax、fetch三者的区别
    深入响应式原理
    vue组件传值
    递归与循环的区别
    undefined 和null的区别
  • 原文地址:https://www.cnblogs.com/chaikefusibushiji/p/7475574.html
Copyright © 2011-2022 走看看