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'

posted on 2017-03-22 10:36  柴科夫斯不是基  阅读(144)  评论(0编辑  收藏  举报

导航