type
Post
status
Published
date
Mar 16, 2019
slug
MySQL-User-and-Privileges-Management
summary
MySQL 5.X 账户与权限的管理。
tags
MySQL
category
技术分享
icon
password
在连接MySQL时,用户认证是如何进行的,权限如何分配,忘记root密码了怎么办?我们一起来看看。
📝 主旨内容
权限认证的过程
- 从mysql.user表中验证host(连接主机)、user(连接用户名)和password(连接密码)
- 验证通过后,按照以下顺序获取权限:mysql.user → mysql.db → mysql.tables_priv → mysql.column_priv
mysql.user表中的权限代表对所有数据库的权限,而mysql.db表中的权限代表对对应database的权限。
账户、权限管理
# 创建u1@localhost账户,密码设置为123,默认只有USAGE权限,若要其他权限需用GRANT赋权 mysql> CREATE USER 'u1'@'localhost' IDENTIFIED BY '123'; # 赋予用户u1@localhost所有库的权限. mysql>GRANT ALL privileges ON *.* to 'u1'@'localhost'; # 赋予用户u1@localhost所有库的权限,且赋予grant权限. mysql>GRANT ALL privileges ON *.* to 'u1'@'localhost' WITH GRANT OPTION; # 赋予用户u1@localhost所有库的权限,且赋予grant权限,密码为123. mysql>GRANT ALL privileges ON *.* to 'u1'@'localhost' IDENTIFIED BY '123' WITH GRANT OPTION; # 创建账户u2,可以从任意IP登陆,只对test1库有SELECT、UPDATE权限,且密码为123 mysql>GRANT SELECT,UPDATE ON test1.* to 'u2'@'%' IDENTIFIED BY '123'; # 创建账户u3@%,赋予SUPER、PROCESS、FILE权限 mysql>GRANT SUPER,PROCESS,FILE ON *.* to 'u3'@'%'; # 修改账户密码 # 方法1:SET PASSWORD mysql> SET PASSWORD FOR 'u2'@'%' = PASSWORD('234'); # 方法2:UPDATE mysql> UPDATE mysql.user SET password=PASSWORD('123') WHERE USER='root' AND HOST='localhost'; mysql>FLUSH PRIVILEGES; # 方法3:ALTER mysql>ALTER USER 'u1'@'localhost' IDENTIFIED BY ‘123’; mysql>FLUSH PRIVILEGES; # 方法4:linux命令行修改密码 [root@localhost]# mysqladmin -uroot -p123(旧密码) password 234(新密码) # 方法5:修改user表(不建议) mysql> INSERT INTO mysql.user (Host,User,Password) VALUES('localhost', 'u1','PASSWORD(234)'); mysql> FLUSH PRIVILEGES; # 方法6:GRANT(不建议) mysql> GRANT USAGE ON *.* TO 'u1'@'localhost' IDENTIFIED BY 'xyz'; # 查看用户u1@localhost权限 mysql> SHOW GRANTS FOR 'u1'@'localhost'; # 回收账户u1@localhost权限 mysql>REVOKE SELECT ON *.* FROM 'u1'@'localhost'; # 删除账户 mysql>DROP USER 'u1'@'localhost';
重置root密码
步骤如下:
- 关闭mysql进程
shell> kill `pidof mysqld
- 修改mysql配置
shell> vim /path/to/my.cnf # default: /etc/my.cnf # 添加下面2行配置 skip-grant-tables #禁用权限认证 skip-networking #禁用网络认证
- 登录mysql,并刷新权限
shell> mysql mysql> FLUSH PRIVILEGES;
- 修改root密码
MySQL 5.7.6 and later: mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'MyNewPass'; MySQL 5.7.5 and earlier: mysql> SET PASSWORD FOR 'root'@'localhost' = PASSWORD('MyNewPass');
- 删除配置,重启mysql
shell> vim /path/to/my.cnf # default: /etc/my.cnf # 删除下面2行配置 skip-grant-tables #禁用权限认证 skip-networking #禁用网络认证 shell> /etc/init.d/mysqld restart
1. 管理权限属于全局权限,不能指定单个数据库。
2. host值可以为主机名或IP地址,或为localhost表示只允许本机登陆。
3. 支持通配符'%'和\_, %表示任意主机, \_表示匹配一个字符。
4. ''@localhost表示任意账户都可以从localhost登陆。
5. host为精确匹配的原则。
🤗 总结归纳
MySQL常用的用户以及权限管理就差不多这么多。高版本的会游戏变化,具体参看官方文档。
📎 参考文章
MySQL访问控制与用户管理- 作者:KingHu
- 链接:https://kingkingho.com/article/MySQL-User-and-Privileges-Management
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。