目录

4.4 用户管理


MySQL是一个多用户数据库,具有功能强大的访问控制系统,可以为不同用户指定允许的权限。MySQL权限可以分为普通用户和root用户。root用户是超级管理员,拥有所有权限,包括创建用户、删除用户和修改用户的密码等管理权限。普通用户只拥有被授予的各种权限,用户管理包括管理用户账户、权限等。


4.4.1 权限表

MySQL服务器通过权限表来控制用户对数据库的访问,权限表存放在MySQL数据库中,由MySQL_install_db脚本初始化。存储账户权限表主要有:user、db、tables_priv、columns_priv、procs_priv等。


4.4.2 账户管理

MySQL提供许多语句用来管理用户账号,这些语句可以用来管理包括登录和退出MySQL服务器、创建用户、删除用户、密码管理和权限管理等内容。MySQL数据库的安全性,需要通过账户管理来保证。

(1) 新建用户

MySQL在安装时,会默认创建一个名为root的用户,该用户拥有超级权限,可以控制整个MySQL服务器。在对MySQL的日常管理和操作中,为了避免有人恶意使用root用户控制数据库,我们通常创建一些具有适当权限的用户,尽可能地不用或少用root用户登录系统,以此来确保数据的安全访问。使用CREATE USER语句必须拥有MySQL数据库的INSERT权限或全局CREATE USER权限。

1案例1:使用CREATE USER创建一个用户,用户名是 test,密码是 test,主机名是 %
2mysql> create user test@'%' identified with mysql_native_password by 'test';
3mysql> flush privileges;
4
5案例2:使用 INSERT语句创建名为test的用户,主机名是 localhost,密码也是 test
6INSERT INTO mysql.user(Host, User, authentication_string, ssl_cipher, x509_issuer, x509_subject) VALUES ('localhost', 'test', 'test'), '', '', '');
7mysql> flush privileges;
8注:MySQL 5.7 的 user 表中的密码字段从 Password 变成了 authentication_string,如果你使用的是 MySQL 5.7 之前的版本,将 authentication_string 字段替换成 Password 即可
9
10案例3:使用GRANT创建名为test1的用户,主机名为%,密码为 test1,该用户对所有数据库的所有表都有SELECT权限
11mysql> grant SELECT ON *.* to test1@'%' identified by 'test1';
12mysql> flush privileges;
13注:其中,“*.*” 表示所有数据库下的所有表,此命令仅适合 5.7及之前的版本

(2) 用户密码修改

在使用数据库时,我们也许会遇到 MySQL 需要修改密码的情况,比如密码太简单需要修改等,同时也是为了安全考虑。

1步骤1;输入命令mysql -u root -p指定 root 用户登录 MySQL
2#5.7版本命令
3mysql> update mysql.user set authentication_string=password('root') where user='root';
4mysql> flush privileges;
5
6#8.0版本命令
7mysql> alter user root@'localhost' identified with mysql_native_password by 'root'; 
8mysql> flush privileges;

(3) 忘记root密码重置

对于root用户丢失密码这种特殊情况,MySQL实现了对应的处理机制。可以通过特殊方法登录到MySQL服务器,然后再root用户下重新设置密码。

1以下环境为Linux系统
21.用命令编辑/etc/my.cnf配置文件,即:vim /etc/my.cnf 或者 vi /etc/my.cnf
32.在[mysqld]下添加skip-grant-tables,然后保存并退出
43.重启mysql服务:service mysqld restart
54.更改root用户名
6重启以后,执行mysql命令进入mysql命令行
75.修改root用户密码,此处注意,有时候会报不允许修改,先flush privileges再执行即可
8mysql> alter user root@'localhost' identified with mysql_native_password by 'root'; 
9mysql> flush privileges;
10在这里,还有一种办法,只能去修改 mysql 的user表,将加密字段authentication_string 置空,
11但不能修改 authentication_string 为其他值,然后使用空密码登录。
126.把/etc/my.cnf中的skip-grant-tables注释掉,然后重启mysql,即:service mysqld restart
13好了,下面就可以用root新的密码登录了!

4.4.3 权限管理

权限管理主要是对登录到MySQL的用户进行权限验证。所有用户的权限都存储在MySQL的权限表中,不合理的权限规划会给MySQL服务器带来安全隐患。数据库管理员要对所有用户权限进行合理规划管理。

(1) 用户授权

权限信息被存储在MySQL数据库的user、db、host、tables_priv、columns_priv和procs_priv表中。在MySQL启动时,服务器会将这些数据库表中的权限信息的内容读入内存。

1在MySQL中,拥有GRANT权限的用户才可以执行 GRANT 语句,其语法格式如下:
2GRANT priv_type [(column_list)] ON database.table
3TO user [IDENTIFIED BY [PASSWORD] 'password']
4[, user[IDENTIFIED BY [PASSWORD] 'password']] ...
5[WITH with_option [with_option]...]

(2) 收回权限

收回权限就是取消已经赋予用户的某些权限。收回用户不必要的权限在一定程度上保证系统的安全性。MySQL中使用REVOKE语句取消用户的某些权限。使用REVOKE收回权限之后,用户账户的记录将从db、tables_priv和column_priv表中删除,但是用户账号记录仍然在user表中保存。要使用REVOKE语句,必须拥有MySQL数据库的全局CREATE USER权限或UPDATE权限。

1删除用户某些特定的权限,语法格式如下:
2REVOKE priv_type [(column_list)]...
3ON database.table
4FROM user [, user]...
5
6REVOKE 语句中的参数与 GRANT 语句的参数意思相同。其中:
7priv_type 参数表示权限的类型;
8column_list 参数表示权限作用于哪些列上,没有该参数时作用于整个表上;
9user 参数由用户名和主机名构成,格式为“username'@'hostname'”