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访问控制与用户管理
 
CentOS系统下磁盘分区CentOS系统下磁盘分区

KingHu
KingHu
Linux运维工程师,会点MySQL/MongoDB/Redis/Python/shell
公告
type
Notice
status
Published
date
Jul 2, 2021
slug
#
summary
类型为Notice的文章将被显示为公告,仅 hexo和next支持;仅限一个公告
tags
category
icon
password
🎉敬请期待!🎉