18 MySQL 用户管理

MySQL 用户管理

1. 用户

1. 查看用户信息

MySQL 8 的用户信息主要在 mysql.user 表里。常用几种方式:

  • 查所有用户:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
mysql> SELECT user, host FROM mysql.user;
+------------------+-----------+
| user | host |
+------------------+-----------+
| debian-sys-maint | localhost |
| mysql.infoschema | localhost |
| mysql.session | localhost |
| mysql.sys | localhost |
| root | localhost |
+------------------+-----------+

# User: 用户名,Host: 允许连接的主机(localhost 仅本地,% 代表任意远程主机),authentication_string: 加密后的密码
# plugin: 认证插件(8.0 默认为 caching_sha2_password,旧版常为 mysql_native_password,Ubuntu 默认 root 可能是 auth_socket)
mysql> SELECT User, Host, authentication_string FROM mysql.user;
+------------------+-----------+------------------------------------------------------------------------+
| User | Host | authentication_string |
+------------------+-----------+------------------------------------------------------------------------+
| debian-sys-maint | localhost | $A$005$.jarSGO!%fGBfH;TQqh0FhsZDhnC.YmUZizXdelJjijX5KZByDoVBEVOrv53 |
| mysql.infoschema | localhost | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED |
| mysql.session | localhost | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED |
| mysql.sys | localhost | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED |
| root | localhost | $A$005\%\edJyya#8
8LNG1iQRA8rDooI7hqR4WXALFsQyflNpH0co7rTJs3kEC |
+------------------+-----------+------------------------------------------------------------------------+
  • 查指定用户的详细信息:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
mysql> SELECT * FROM mysql.user\G
# ……
mysql> SELECT * FROM mysql.user WHERE user='root'\G
*************************** 1. row ***************************
Host: localhost
User: root
Select_priv: Y
Insert_priv: Y
Update_priv: Y
Delete_priv: Y
Create_priv: Y
Drop_priv: Y
Reload_priv: Y
Shutdown_priv: Y
Process_priv: Y
File_priv: Y
Grant_priv: Y
References_priv: Y
Index_priv: Y
Alter_priv: Y
Show_db_priv: Y
Super_priv: Y
Create_tmp_table_priv: Y
Lock_tables_priv: Y
Execute_priv: Y
Repl_slave_priv: Y
Repl_client_priv: Y
Create_view_priv: Y
Show_view_priv: Y
Create_routine_priv: Y
Alter_routine_priv: Y
Create_user_priv: Y
Event_priv: Y
Trigger_priv: Y
Create_tablespace_priv: Y
ssl_type:
ssl_cipher: 0x
x509_issuer: 0x
x509_subject: 0x
max_questions: 0
max_updates: 0
max_connections: 0
max_user_connections: 0
plugin: caching_sha2_password
authentication_string: $A$005\%\edJyya#8
8LNG1iQRA8rDooI7hqR4WXALFsQyflNpH0co7rTJs3kEC
password_expired: N
password_last_changed: 2026-01-04 15:54:39
password_lifetime: NULL
account_locked: N
Create_role_priv: Y
Drop_role_priv: Y
Password_reuse_history: NULL
Password_reuse_time: NULL
Password_require_current: NULL
User_attributes: NULL
  • SHOW GRANTS 看用户权限:
1
2
3
4
5
6
7
8
9
SHOW GRANTS FOR '用户名'@'主机';

mysql> show grants for 'root'@'localhost'\G
*************************** 1. row ***************************
Grants for root@localhost: GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD, SHUTDOWN, 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, CREATE ROLE, DROP ROLE ON *.* TO `root`@`localhost` WITH GRANT OPTION
*************************** 2. row ***************************
Grants for root@localhost: GRANT APPLICATION_PASSWORD_ADMIN,AUDIT_ABORT_EXEMPT,AUDIT_ADMIN,AUTHENTICATION_POLICY_ADMIN,BACKUP_ADMIN,BINLOG_ADMIN,BINLOG_ENCRYPTION_ADMIN,CLONE_ADMIN,CONNECTION_ADMIN,ENCRYPTION_KEY_ADMIN,FIREWALL_EXEMPT,FLUSH_OPTIMIZER_COSTS,FLUSH_STATUS,FLUSH_TABLES,FLUSH_USER_RESOURCES,GROUP_REPLICATION_ADMIN,GROUP_REPLICATION_STREAM,INNODB_REDO_LOG_ARCHIVE,INNODB_REDO_LOG_ENABLE,PASSWORDLESS_USER_ADMIN,PERSIST_RO_VARIABLES_ADMIN,REPLICATION_APPLIER,REPLICATION_SLAVE_ADMIN,RESOURCE_GROUP_ADMIN,RESOURCE_GROUP_USER,ROLE_ADMIN,SENSITIVE_VARIABLES_OBSERVER,SERVICE_CONNECTION_ADMIN,SESSION_VARIABLES_ADMIN,SET_USER_ID,SHOW_ROUTINE,SYSTEM_USER,SYSTEM_VARIABLES_ADMIN,TABLE_ENCRYPTION_ADMIN,TELEMETRY_LOG_ADMIN,XA_RECOVER_ADMIN ON *.* TO `root`@`localhost` WITH GRANT OPTION
*************************** 3. row ***************************
Grants for root@localhost: GRANT PROXY ON ``@`` TO `root`@`localhost` WITH GRANT OPTION

2. 创建用户

1
2
3
4
5
6
7
8
CREATE USER '用户名'@'主机' IDENTIFIED BY '密码';

mysql> create user 'minbit'@'127.0.0.1' identified by '123456';
mysql> create user hcc@localhost identified by '123456'; # 如果有像-这样的特殊字符千万不要省略单引号!
Query OK, 0 rows affected (0.00 sec)

# 注意:虽然 127.0.0.1 和 localhost 大多数情况是一样的,但是'127.0.0.1''localhost' 在 MySQL 里是两个完全不同的主机
# 登录必须指定:mysql -u minbit -p -h 127.0.0.1
  • 'localhost' 表示只能本机登录。
  • '%' 表示允许任何主机登录,通常用于 Windows,因为自己的 Windows IP 经过层层 NAT 、其他封装或公网 IP 动态变化等问题,导致无法确定一个固定的 IP 授权给 MySQL。所以通常使用 '%' 来解决连接问题。但请务必注意开放 '%' 时的密码强度和防火墙设置。
  • 可以加 PASSWORD EXPIREACCOUNT LOCK 等控制。

3. 删除用户

1
2
3
4
5
DROP USER '用户名'@'主机';
DROP USER IF EXISTS 'alice'@'localhost';

mysql> drop user 'hcc'@'localhost';
Query OK, 0 rows affected (0.00 sec)
  • 删除用户会自动删除它的权限。
  • 如果用户不存在,加上 IF EXISTS 防报错

4. 修改用户密码

Root 是老大,想改谁的密码都行,只要把 '用户名'@'主机' 写对就行。

1
2
3
4
5
6
7
ALTER USER '用户名'@'主机' IDENTIFIED BY '新密码';

mysql> alter user 'minbit'@'127.0.0.1' identified by '666666';
Query OK, 0 rows affected (0.01 sec)

# 刷新(权限),在 MySQL 8.0 中通常不需要,但执行一下也无妨)
FLUSH PRIVILEGES;
  • 也可以用 SET PASSWORD,不过 ALTER USER 更推荐。
  • 修改密码后不需要重启 MySQL。
  • 所有用户操作完成后可以执行 FLUSH PRIVILEGES;,不过 MySQL 8 里大部分命令已经自动刷新权限。

用户自己改自己的密码,有两种写法,最简单的是 不写用户名

方法一:不写用户名(推荐,最省事)

1
2
3
4
ALTER USER CURRENT_USER() IDENTIFIED BY '新密码';

mysql> alter user current_user identified by '123456';
Query OK, 0 rows affected (0.02 sec)

(注:MySQL 8.0 里 SET PASSWORD 默认就是改当前登录用户的,不用加 FOR 子句)。

方法二:写死自己的账号

1
2
3
4
ALTER USER '自己的用户名'@'localhost' IDENTIFIED BY '新密码';

mysql> alter user 'minbit'@'127.0.0.1' identified by '666666';
Query OK, 0 rows affected (0.01 sec)

必须确保现在的连接确实是用 '自己'@'localhost' 登进来的,写错了会报错说没权限。

2. 权限

1. 常用权限

权限名作用
SELECT读数据(查询)
INSERT插入数据
UPDATE更新数据
DELETE删除数据
CREATE创建表/数据库
DROP删除表/数据库
ALTER修改表结构
INDEX建/删索引
GRANT OPTION可以给别人授权
EXECUTE执行存储过程或函数
REFERENCES创建外键
SHOW DATABASES查看库列表
CREATE USER创建用户

除了这些,还有一些更细的控制,但常用就是上面这些。

2. 给用户授权

1
2
3
4
5
6
GRANT 权限列表 ON 数据库.对象 TO '用户名'@'主机';

mysql> grant select,insert, update on Compound_query.* to 'minbit'@'127.0.0.1';
Query OK, 0 rows affected (0.03 sec)
mysql> flush privileges; # MySQL 8 一般不必,自动生效
Query OK, 0 rows affected (0.00 sec)
  • Compound_query.*:表示数据库 Compound_query 下所有表。
  • *.*:表示所有数据库、所有表。
  • 授权后如果需要别人也能授权,要加 WITH GRANT OPTION
1
GRANT SELECT, INSERT ON testdb.* TO 'bob'@'%' WITH GRANT OPTION;

3. 回收用户权限

1
2
3
4
REVOKE 权限列表 ON 数据库.对象 FROM '用户名'@'主机';

mysql> revoke insert, update on Compound_query.* from 'minbit'@'127.0.0.1';
Query OK, 0 rows affected (0.01 sec)
  • REVOKE 只收回明确写的权限,其他权限不受影响。
  • 回收后可以同样 FLUSH PRIVILEGES,MySQL 8 自动生效。

小技巧:查用户权限

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
SHOW GRANTS FOR '用户名'@'主机';

mysql> show grants for 'minbit'@'127.0.0.1';
+------------------------------------------------------------+
| Grants for minbit@127.0.0.1 |
+------------------------------------------------------------+
| GRANT USAGE ON *.* TO `minbit`@`127.0.0.1` |
| GRANT SELECT ON `Compound_query`.* TO `minbit`@`127.0.0.1` |
+------------------------------------------------------------+

mysql> show grants for 'minbit'@'127.0.0.1'\G
*************************** 1. row ***************************
Grants for minbit@127.0.0.1: GRANT USAGE ON *.* TO `minbit`@`127.0.0.1`
*************************** 2. row ***************************
Grants for minbit@127.0.0.1: GRANT SELECT ON `Compound_query`.* TO `minbit`@`127.0.0.1`
  • 给全库权限:GRANT ALL PRIVILEGES ON testdb.* TO 'alice'@'localhost';
  • 给全局权限:GRANT ALL PRIVILEGES ON *.* TO 'alice'@'localhost';