第12章 MySQL高级管理

在本章中,我们将讨论关于MySQL的一些更高级话题,其中包括高级权限、安全和优化等问题。

本章将讨论的主要内容包括:

■深入理解权限系统

■提高数据库的安全性

■获取关于数据库的更多信息

■使用索引提高查询速度

■优化数据库

■备份和恢复

■实现复制

12.1 深入理解权限系统

在第9章,我们学习了如何创建用户,以及使用GRANT命令实现用户权限的授予。如果要管理一个MySQL数据库,那么准确地理解GRANT命令的作用及其工作原理是非常有意义的。

当执行一条GRANT语句的时候,它会影响一个名为mysql的特殊数据库。权限信息就是保存在这个数据库的6个表中。这样,当对数据库授予权限的时候,就应该注意是否授予了访问mysql数据库的访问权限。

以管理员身份登录后,输入如下命令,我们就可以看到mysql数据库的内容:


use mysql;


执行上述命令后,如果想查看该数据库中的表,可以输入如下命令:


show tables;


上述命令的执行结果如下所示:


+—————————————-+

|Tables_in_mysql|

+—————————————-+

|columns_priv|

|db|

|event|

|func|

|general_log|

|help_category|

|help_keyword|

|help_relation|

|help_topic|

|host|

|ndb_binlog_index|

|plugin|

|proc|

|procs_priv|

|servers|

|slow_log|

|tables_priv|

|time_zone|

|time_zone_leap_second|

|time_zone_name|

|time_zone_transition|

|time_zone_transition_type|

|user|

+—————————————-+


以上每个表都存储了关于系统的信息。保存权限信息的6个表分别是:user、host、db、tables_priv和columns_priv以及procs_priv。有时,这些表也称为授权表(grant tables)。

这些表的具体用途各不相同,但它们的基本用途都是相同的,都可以用来确定用户身份以及是否允许执行特定操作。这些表都包含两种类型的字段:范围字段,它可以指定用户、主机和数据库的一部分;权限字段,它可以指定该用户在该范围内可以执行哪些操作。

user表和host表用于确定一个用户是否可以连接MySQL服务器,以及该用户是否具有任何管理员权限。db表和host表确定用户可以访问哪些数据库。tables_priv表确定用户可以使用数据库中哪些表,而columns_priv表确定用户可以访问表中的哪些列,procs_priv表确定用户可以执行哪些过程。

12.1.1 user表

该表包含全局用户权限的详细信息。它可以确定一个用户是否有权连接MySQL数据库,是否具有全局级别的权限;即是否有使用系统中每个数据库的权限。

我们可以通过执行describe user;语句来浏览该表的结构。user表的模式如表12-1所示。

第12章 MySQL高级管理 - 图1

第12章 MySQL高级管理 - 图2

上表中的每一行对应于一组用户权限,该用户来自一个主机并用密码Password进行登录。

这些都是该表的范围字段(scope field),因为它们可以描述其他字段的范围,其他字段则称为权限字段(privilege field)。

该表(以及其他接下来的表)中列出的权限对应于我们在第9章中用GRANT语句授予的权限。例如,Select_priv对应于运行SELECT命令的权限。

如果一个用户具有特定的权限,该列中的值就应该是Y。相反,如果用户没有被授予该权限,其值就应该是N。

user表中列出的所有权限都是全局的,也就是说,它们适用于系统中(包括mysql数据库)所有数据库。因此,在这里,管理员的一些权限为Y,但是大部分用户应该全部为N。普通用户应该有一些访问适当数据库但不是所有表的权限。