前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >MySQL 用户与权限管理

MySQL 用户与权限管理

原创
作者头像
Power
发布2025-03-01 13:18:42
发布2025-03-01 13:18:42
50700
代码可运行
举报
运行总次数:0
代码可运行

一、创建用户

代码语言:javascript
代码运行次数:0
运行
复制
语法:CREATE USER '$user'@'% ' IDENTIFIED BY '$passwprd';

MySQL [(none)]> CREATE USER 'DB1'@'% ' IDENTIFIED BY 'starcto@163.com';
Query OK, 0 rows affected (0.00 sec)

MySQL [(none)]> select host,user from mysql.user;
+-----------+----------------+
| host      | user           |
+-----------+----------------+
| %         | DB1            |
| %         | root           |
+-----------+----------------+
5 rows in set (0.00 sec)

二、权限管理

2.1 给用户授权

MySQL 赋权原则:自己有什么权限,才能给别人什么权限。

(1)查看用户拥有的权限

代码语言:javascript
代码运行次数:0
运行
复制
MySQL [(none)]> show grants for 'root'@'%'\G 
*************************** 1. row ***************************
Grants for root@%: GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD, PROCESS, FILE, REFERENCES, INDEX, ALTER, SHOW DATABASES, SUPER, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER, CREATE TABLESPACE ON *.* TO 'root'@'%' WITH GRANT OPTION
1 row in set (0.01 sec)

(2)用户授权

代码语言:javascript
代码运行次数:0
运行
复制
MySQL [(none)]> GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, REFERENCES, ALTER, INDEX on *.* to 'DB1'@'%' WITH GRANT OPTION;  
Query OK, 0 rows affected (0.01 sec)

(3)root用户获取超级权限

代码语言:javascript
代码运行次数:0
运行
复制
update mysql.user set Super_priv='Y' where User='root'; 
flush privileges;

MySQL5.7官网介绍:https://dev.mysql.com/doc/refman/5.7/en/grant.html

2.2 查看用户权限

(1)查看user表权限信息

代码语言:javascript
代码运行次数:0
运行
复制
MySQL [(none)]> select * from mysql.user\G;
*************************** 4. row ***************************
                  Host: %
                  User: DB1
           Select_priv: Y
           Insert_priv: Y
           Update_priv: Y
           Delete_priv: Y
           Create_priv: Y
             Drop_priv: Y
           Reload_priv: N
         Shutdown_priv: N
          Process_priv: N
             File_priv: N
            Grant_priv: Y
       References_priv: Y
            Index_priv: Y
            Alter_priv: Y
          Show_db_priv: N
            Super_priv: N
 Create_tmp_table_priv: N
      Lock_tables_priv: N
          Execute_priv: N
       Repl_slave_priv: N
      Repl_client_priv: N
      Create_view_priv: N
        Show_view_priv: N
   Create_routine_priv: N
    Alter_routine_priv: N
      Create_user_priv: N
            Event_priv: N
          Trigger_priv: N
Create_tablespace_priv: N
              ssl_type: 
            ssl_cipher: 
           x509_issuer: 
          x509_subject: 
         max_questions: 0
           max_updates: 0
       max_connections: 0
  max_user_connections: 0
                plugin: mysql_native_password
 authentication_string: *9877A31BDC660A746D19727E947CDFBA34A1D0F7
      password_expired: N
 password_last_changed: 2021-06-26 00:00:32
     password_lifetime: NULL
        account_locked: N

(2)查看'DB1'@'%'用户拥有的权限

代码语言:javascript
代码运行次数:0
运行
复制
MySQL [(none)]> SHOW GRANTS FOR 'DB1'@'%';
+--------------------------------------------------------------------------------------------------------------------+
| Grants for DB1@%                                                                                                   |
+--------------------------------------------------------------------------------------------------------------------+
| GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, REFERENCES, INDEX, ALTER ON *.* TO 'DB1'@'%' WITH GRANT OPTION |
+--------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

(3)查看当前用户拥有的权限

代码语言:javascript
代码运行次数:0
运行
复制
MySQL [(none)]> show grants\G
*************************** 1. row ***************************
Grants for root@%: GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD, PROCESS, FILE, REFERENCES, INDEX, ALTER, SHOW DATABASES, SUPER, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER, CREATE TABLESPACE ON *.* TO 'root'@'%' WITH GRANT OPTION
1 row in set (0.00 sec)

(4)查看当前连接的用户和访问域

代码语言:javascript
代码运行次数:0
运行
复制
MySQL [(none)]> select user() ,current_user();
+------------------+----------------+
| user()           | current_user() |
+------------------+----------------+
| root@10.25.25.25 | root@%         |
+------------------+----------------+
1 row in set (0.01 sec)

(5)经典案例分析

背景:创建了一个DB1用户,授予了create权限,但是业务创建表时扔报错权限不足,经排查发现DB1用户有两个访问域,即'DB1'@'%'和'DB1'@'10.%'。'DB1'@'%'访问域授予了create权限,'DB1'@'10.%'访问域没有授予create权限,'DB1'@'10.%'访问域的优先级比'DB1'@'%'访问域更高,所以导致业务出现了权限报错。如下:

代码语言:javascript
代码运行次数:0
运行
复制
# 'DB1'@'%'访问域有CREATE权限
MySQL [(none)]> show grants for DB1;  
+--------------------------------------------------------------------------------------------------------------------+
| Grants for DB1@%                                                                                                   |
+--------------------------------------------------------------------------------------------------------------------+
| GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, REFERENCES, INDEX, ALTER ON *.* TO 'DB1'@'%' WITH GRANT OPTION |
+--------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)


# 'DB1'@'10.%'访问域没有CREATE权限
MySQL [(none)]> show grants for 'DB1'@'10.%'; 
+---------------------------------------------------------------------------------------------------------------+
| Grants for DB1@10.%                                                                                           |
+---------------------------------------------------------------------------------------------------------------+
| GRANT SELECT, INSERT, UPDATE, DELETE, DROP, REFERENCES, INDEX, ALTER ON *.* TO 'DB1'@'10.%' WITH GRANT OPTION |
+---------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

访问域优先级参考官网:https://dev.mysql.com/doc/refman/5.7/en/connection-access.html

2.3. 移除授权

代码语言:javascript
代码运行次数:0
运行
复制
语法:
revoke SELECT on *.* from '$user'@'%' ;
revoke SELECT on *.* from '$user'@'x.x.%.%' ;

MySQL [(none)]> revoke SELECT on *.* from 'DB1'@'%';
Query OK, 0 rows affected (0.00 sec)

#select权限已经被回收
MySQL [(none)]> show grants for 'DB1'@'%';   
+------------------------------------------------------------------------------------------------------------+
| Grants for DB1@%                                                                                           |
+------------------------------------------------------------------------------------------------------------+
| GRANT INSERT, UPDATE, DELETE, CREATE, DROP, REFERENCES, INDEX, ALTER ON *.* TO 'DB1'@'%' WITH GRANT OPTION |
+------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

MySQL5.官网介绍:https://dev.mysql.com/doc/refman/5.7/en/revoke.html

三、更新操作

3.1 更新user访问源限制

(1)查询用户的访问域

代码语言:javascript
代码运行次数:0
运行
复制
MySQL [(none)]> select host,user from mysql.user;
+-----------+----------------+
| host      | user           |
+-----------+----------------+
| %         | DB1            |
| %         | root           |
| 10.%      | DB1            |
+-----------+----------------+
6 rows in set (0.00 sec)

(2)修改用户访问域

代码语言:javascript
代码运行次数:0
运行
复制
语法:
update user set host = 'xx.xx.%.%' where user = '$user';     #修改用户的访问域
flush privileges;

MySQL [(none)]> use mysql
MySQL [mysql]> update user set host = '10.25.25.25' where user = 'DB1';
Query OK, 1 row affected (0.00 sec)

MySQL [mysql]> flush privileges;
Query OK, 0 rows affected (0.00 sec)

3.2 修改用户密码

(1)MySQL 5.5/5.6

代码语言:javascript
代码运行次数:0
运行
复制
UPDATE mysql.user SET password=password('密码') WHERE user='ucloudbackup';
FLUSH PRIVILEGES;

(2)MySQL 5.7

代码语言:javascript
代码运行次数:0
运行
复制
UPDATE mysql.user SET authentication_string=password('密码') WHERE user='ucloudbackup';
FLUSH PRIVILEGES;

# 如果设置了密码过期时间,使用命令:
UPDATE mysql.user SET authentication_string=password('密码'),password_last_changed=now() WHERE user='root';
FLUSH PRIVILEGES;

(3)MySQL5.7/MySQL 8.0

代码语言:javascript
代码运行次数:0
运行
复制
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '密码';
FLUSH PRIVILEGES;

(4)MySQL密码密文校验

代码语言:javascript
代码运行次数:0
运行
复制
# 查询MySQL root用户密码密文
mysql> select * from mysql.user where user="root"\G;
*************************** 1. row ***************************
                  Host: %
                  User: root
                    ……
                plugin: mysql_native_password
 authentication_string: *1A48FEB61E6408357AF1C296B1D43987E2386EFD    # root密码密文
      password_expired: N
 password_last_changed: 2021-08-02 13:27:05
     password_lifetime: NULL
        account_locked: N
1 row in set (0.00 sec)

# 对MySQL root用户明文密码进行加密
mysql> select password("ucloud.cn");
+-------------------------------------------+
| password("ucloud.cn")                     |
+-------------------------------------------+
| *9C2987C998212139BD95E33BE0189FCD876F3967 |
+-------------------------------------------+
1 row in set, 1 warning (0.00 sec)

【注】对比密文相同,则说明密码是对的;密文不同,则说明密码是错的。

四、删除user

4.1 drop

代码语言:javascript
代码运行次数:0
运行
复制
语法:drop user 'XXX'@'%';

MySQL [mysql]> select host,user from mysql.user;
+-------------+----------------+
| host        | user           |
+-------------+----------------+
| %           | root           |
| 10.25.25.25 | DB1            |
+-------------+----------------+
5 rows in set (0.00 sec)

MySQL [mysql]> drop user 'DB1'@'10.25.25.25';
Query OK, 0 rows affected (0.00 sec)

MySQL [mysql]> select host,user from mysql.user;
+-----------+----------------+
| host      | user           |
+-----------+----------------+
| %         | root           |
+-----------+----------------+
4 rows in set (0.00 sec)

4.2 delete

代码语言:javascript
代码运行次数:0
运行
复制
语法:delete from user where user='XXX' and host='XXX';

区别:drop不仅会将user表中的数据删除,还会删除其他权限表的内容。而delete只删除user表中的内容,所以使用delete删除用户后需要执行FLUSH PRIVILEGES;刷新权限,否则下次使用create语句创建用户时会报错。

五、user表迁移技巧

代码语言:javascript
代码运行次数:0
运行
复制
mysql> select host,user from mysql.user;
+------+---------+
| host | user    |
+------+---------+
| %    | root    |
| %    | stargao |
+------+---------+
2 rows in set (0.00 sec)

5.1 mysqlpump工具介绍

官网介绍:https://dev.mysql.com/doc/refman/5.7/en/mysqlpump.html

MySQL5.7之后多了一个备份工具:mysqlpump。它是mysqldump的一个衍生和mysqldump一样,属于逻辑备份,备份以SQL形式的文本保存。逻辑备份相对物理备份的好处是不关心undo log的大小,直接备份数据即可。它最主要的特点是:

代码语言:javascript
代码运行次数:0
运行
复制
(1)并行备份数据库和数据库中的对象的,加快备份过程。
(2)更好的控制数据库和数据库对象(表,存储过程,用户帐户)的备份。
(3)备份用户账号作为帐户管理语句(CREATE USER,GRANT),而不是直接插入到MySQL的系统数据库。
(4)备份出来直接生成压缩后的备份文件。
(5)备份进度指示(估计值)。
(6)重新加载(还原)备份文件,先建表后插入数据最后建立索引,减少了索引维护开销,加快了还原速度。
(7)备份可以排除或则指定数据库。

5.2 mysqlpump备份演示

代码语言:javascript
代码运行次数:0
运行
复制
[root@ansible ~]# mysqlpump -h10.25.34.23 --exclude-databases=% --users -uroot -pUCloudcn --set-gtid-purged=OFF > user.log
Dump completed in 892 milliseconds

[root@ansible ~]# cat user.log 
-- Dump created by MySQL pump utility, version: 5.7.31, linux-glibc2.12 (x86_64)
-- Dump start time: Wed Aug 25 16:43:16 2021
-- Server version: 5.7.16

SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
SET @OLD_SQL_MODE=@@SQL_MODE;
SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
SET @@SESSION.SQL_LOG_BIN= 0;
SET @OLD_TIME_ZONE=@@TIME_ZONE;
SET TIME_ZONE='+00:00';
SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT;
SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS;
SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION;
SET NAMES utf8mb4;
CREATE USER 'root'@'%' IDENTIFIED WITH 'mysql_native_password' AS '*1A48FEB61E6408357AF1C296B1D43987E2386EFD' REQUIRE NONE PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK;
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD, PROCESS, FILE, REFERENCES, INDEX, ALTER, SHOW DATABASES, SUPER, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER, CREATE TABLESPACE ON *.* TO 'root'@'%' WITH GRANT OPTION;
CREATE USER 'stargao'@'%' IDENTIFIED WITH 'mysql_native_password' AS '*9C2987C998212139BD95E33BE0189FCD876F3967' REQUIRE NONE PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK;
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, FILE, INDEX, ALTER, CREATE TEMPORARY TABLES, EXECUTE, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, EVENT, TRIGGER ON *.* TO 'stargao'@'%' WITH GRANT OPTION;
SET TIME_ZONE=@OLD_TIME_ZONE;
SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT;
SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS;
SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;
SET SQL_MODE=@OLD_SQL_MODE;
-- Dump end time: Wed Aug 25 16:43:17 2021

5.3 pt-show-grants工具介绍

这个工具的主要作用就是能够规范的打印出授权的相关信息,方便对比不同MySQL数据库的权限是不是一样,通过这个工具我们可以轻松地将用户从一个服务器复制到另一个服务器,可以简单地从第一台服务器提取授权,并将输出管道直接导入另一台服务器,也可以做权限的版本控制。

官网介绍:https://www.percona.com/doc/percona-toolkit/LATEST/pt-show-grants.html

5.4 pt-show-grants备份演示

代码语言:javascript
代码运行次数:0
运行
复制
[root@ansible ~]# pt-show-grants -h10.25.34.23 -uroot -pUCloudcn > user.sql

[root@ansible ~]# cat user.sql 
-- Grants dumped by pt-show-grants
-- Dumped from server 10.25.34.23 via TCP/IP, MySQL 5.7.16-ucloudrel1-log at 2021-08-25 16:54:55
-- Grants for 'root'@'%'
CREATE USER IF NOT EXISTS 'root'@'%';
ALTER USER 'root'@'%' IDENTIFIED WITH 'mysql_native_password' AS '*1A48FEB61E6408357AF1C296B1D43987E2386EFD' REQUIRE NONE PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK;
GRANT ALTER, ALTER ROUTINE, CREATE, CREATE ROUTINE, CREATE TABLESPACE, CREATE TEMPORARY TABLES, CREATE USER, CREATE VIEW, DELETE, DROP, EVENT, EXECUTE, FILE, INDEX, INLOCK TABLES, PROCESS, REFERENCES, RELOAD, REPLICATION CLIENT, REPLICATION SLAVE, SELECT, SHOW DATABASES, SHOW VIEW, SUPER, TRIGGER, UPDATE ON *.* TO 'root'@'%' WITH GRTION;
-- Grants for 'stargao'@'%'
CREATE USER IF NOT EXISTS 'stargao'@'%';
ALTER USER 'stargao'@'%' IDENTIFIED WITH 'mysql_native_password' AS '*9C2987C998212139BD95E33BE0189FCD876F3967' REQUIRE NONE PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK;
GRANT ALTER, ALTER ROUTINE, CREATE, CREATE ROUTINE, CREATE TEMPORARY TABLES, CREATE VIEW, DELETE, EVENT, EXECUTE, FILE, INDEX, INSERT, SELECT, SHOW VIEW, TRIGGER, UPDA*.* TO 'stargao'@'%' WITH GRANT OPTION;

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、创建用户
  • 二、权限管理
    • 2.1 给用户授权
    • 2.2 查看用户权限
    • 2.3. 移除授权
  • 三、更新操作
    • 3.1 更新user访问源限制
    • 3.2 修改用户密码
  • 四、删除user
    • 4.1 drop
    • 4.2 delete
  • 五、user表迁移技巧
    • 5.1 mysqlpump工具介绍
    • 5.2 mysqlpump备份演示
    • 5.3 pt-show-grants工具介绍
    • 5.4 pt-show-grants备份演示
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档