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;45案例2:使用 INSERT语句创建名为test的用户,主机名是 localhost,密码也是 test6INSERT 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 即可910案例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 用户登录 MySQL2#5.7版本命令3mysql> update mysql.user set authentication_string=password('root') where user='root';4mysql> flush privileges;56#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.cnf32.在[mysqld]下添加skip-grant-tables,然后保存并退出43.重启mysql服务:service mysqld restart54.更改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 restart13好了,下面就可以用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.table3TO 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.table4FROM user [, user]...56REVOKE 语句中的参数与 GRANT 语句的参数意思相同。其中:7priv_type 参数表示权限的类型;8column_list 参数表示权限作用于哪些列上,没有该参数时作用于整个表上;9user 参数由用户名和主机名构成,格式为“username'@'hostname'”