目录
[1. 认识 MySQL 用户](#1. 认识 MySQL 用户)
[2. 创建用户](#2. 创建用户)
[3. 删除用户](#3. 删除用户)
[4. 修改用户登录密码](#4. 修改用户登录密码)
[5. 数据库的权限](#5. 数据库的权限)
[5.1 常见权限与权限作用范围](#5.1 常见权限与权限作用范围)
[5.2 授予用户权限:GRANT](#5.2 授予用户权限:GRANT)
[5.3 查看权限:SHOW GRANTS](#5.3 查看权限:SHOW GRANTS)
[5.4 回收权限:REVOKE](#5.4 回收权限:REVOKE)
本文内容概要
本文主要介绍 MySQL 用户管理与权限控制的基础知识,包括用户的创建、删除与登录密码修改,以及数据库权限的授予、查看和回收。通过本文的学习,掌握 MySQL 用户管理的常用操作,理解权限控制的基本原理。
1. 认识 MySQL 用户
对于 MySQL 的初学者来说,可能一直使用 root 用户进行数据库的学习与操作。
但是,在实际项目开发过程中,一个 MySQL 服务器可能承载多个数据库,并由不同的开发人员或应用程序共同访问。如果所有人都使用 root 账户连接数据库,并对数据库、数据表进行 CRUD 等操作,显然是不合理的。
一方面,root 账户通常拥有较高的管理权限,误操作可能造成严重后果;另一方面,不同用户的工作职责不同,对数据库的操作需求也不相同。因此,我们需要对不同用户进行权限隔离。
为了解决这些问题,MySQL 提供了用户管理与权限控制机制。管理员可以创建不同的用户账户,并根据实际需求为其分配相应的操作权限,从而提高数据库的安全性。
那么,MySQL 是如何管理用户信息的呢?
MySQL 的用户账户与权限信息由系统数据库 mysql 中的授权表进行管理,其中 mysql.user 是一张重要的授权表,保存了用户账户及其全局权限等相关信息。
sql
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| mysql_blog |
| performance_schema |
| sys |
| test |
+--------------------+
6 rows in set (0.00 sec)
mysql> use mysql;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> show tables;
+---------------------------+
| Tables_in_mysql |
+---------------------------+
| columns_priv |
| db |
| engine_cost |
| event |
| func |
| general_log |
| gtid_executed |
| help_category |
| help_keyword |
| help_relation |
| help_topic |
| innodb_index_stats |
| innodb_table_stats |
| ndb_binlog_index |
| plugin |
| proc |
| procs_priv |
| proxies_priv |
| server_cost |
| servers |
| slave_master_info |
| slave_relay_log_info |
| slave_worker_info |
| slow_log |
| tables_priv |
| time_zone |
| time_zone_leap_second |
| time_zone_name |
| time_zone_transition |
| time_zone_transition_type |
| user |
+---------------------------+
31 rows in set (0.01 sec)
可以通过desc user 查看表结构:
sql
mysql> desc user \G;
*************************** 1. row ***************************
Field: Host
Type: char(60)
Null: NO
Key: PRI
Default:
Extra:
*************************** 2. row ***************************
Field: User
Type: char(32)
Null: NO
Key: PRI
Default:
Extra:
*************************** 3. row ***************************
Field: Select_priv
Type: enum('N','Y')
Null: NO
Key:
Default: N
Extra:
*************************** 4. row ***************************
Field: Insert_priv
Type: enum('N','Y')
Null: NO
Key:
Default: N
Extra:
*************************** 5. row ***************************
Field: Update_priv
Type: enum('N','Y')
Null: NO
Key:
Default: N
Extra:
*************************** 6. row ***************************
Field: Delete_priv
Type: enum('N','Y')
Null: NO
Key:
Default: N
Extra:
*************************** 7. row ***************************
Field: Create_priv
Type: enum('N','Y')
Null: NO
Key:
Default: N
Extra:
*************************** 8. row ***************************
Field: Drop_priv
Type: enum('N','Y')
Null: NO
Key:
Default: N
Extra:
*************************** 9. row ***************************
Field: Reload_priv
Type: enum('N','Y')
Null: NO
Key:
Default: N
Extra:
*************************** 10. row ***************************
Field: Shutdown_priv
Type: enum('N','Y')
Null: NO
Key:
Default: N
Extra:
*************************** 11. row ***************************
Field: Process_priv
Type: enum('N','Y')
Null: NO
Key:
Default: N
Extra:
*************************** 12. row ***************************
Field: File_priv
Type: enum('N','Y')
Null: NO
Key:
Default: N
Extra:
*************************** 13. row ***************************
Field: Grant_priv
Type: enum('N','Y')
Null: NO
Key:
Default: N
Extra:
*************************** 14. row ***************************
Field: References_priv
Type: enum('N','Y')
Null: NO
Key:
Default: N
Extra:
*************************** 15. row ***************************
Field: Index_priv
Type: enum('N','Y')
Null: NO
Key:
Default: N
Extra:
*************************** 16. row ***************************
Field: Alter_priv
Type: enum('N','Y')
Null: NO
Key:
Default: N
Extra:
*************************** 17. row ***************************
Field: Show_db_priv
Type: enum('N','Y')
Null: NO
Key:
Default: N
Extra:
*************************** 18. row ***************************
Field: Super_priv
Type: enum('N','Y')
Null: NO
Key:
Default: N
Extra:
*************************** 19. row ***************************
Field: Create_tmp_table_priv
Type: enum('N','Y')
Null: NO
Key:
Default: N
Extra:
*************************** 20. row ***************************
Field: Lock_tables_priv
Type: enum('N','Y')
Null: NO
Key:
Default: N
Extra:
*************************** 21. row ***************************
Field: Execute_priv
Type: enum('N','Y')
Null: NO
Key:
Default: N
Extra:
*************************** 22. row ***************************
Field: Repl_slave_priv
Type: enum('N','Y')
Null: NO
Key:
Default: N
Extra:
*************************** 23. row ***************************
Field: Repl_client_priv
Type: enum('N','Y')
Null: NO
Key:
Default: N
Extra:
*************************** 24. row ***************************
Field: Create_view_priv
Type: enum('N','Y')
Null: NO
Key:
Default: N
Extra:
*************************** 25. row ***************************
Field: Show_view_priv
Type: enum('N','Y')
Null: NO
Key:
Default: N
Extra:
*************************** 26. row ***************************
Field: Create_routine_priv
Type: enum('N','Y')
Null: NO
Key:
Default: N
Extra:
*************************** 27. row ***************************
Field: Alter_routine_priv
Type: enum('N','Y')
Null: NO
Key:
Default: N
Extra:
*************************** 28. row ***************************
Field: Create_user_priv
Type: enum('N','Y')
Null: NO
Key:
Default: N
Extra:
*************************** 29. row ***************************
Field: Event_priv
Type: enum('N','Y')
Null: NO
Key:
Default: N
Extra:
*************************** 30. row ***************************
Field: Trigger_priv
Type: enum('N','Y')
Null: NO
Key:
Default: N
Extra:
*************************** 31. row ***************************
Field: Create_tablespace_priv
Type: enum('N','Y')
Null: NO
Key:
Default: N
Extra:
*************************** 32. row ***************************
Field: ssl_type
Type: enum('','ANY','X509','SPECIFIED')
Null: NO
Key:
Default:
Extra:
*************************** 33. row ***************************
Field: ssl_cipher
Type: blob
Null: NO
Key:
Default: NULL
Extra:
*************************** 34. row ***************************
Field: x509_issuer
Type: blob
Null: NO
Key:
Default: NULL
Extra:
*************************** 35. row ***************************
Field: x509_subject
Type: blob
Null: NO
Key:
Default: NULL
Extra:
*************************** 36. row ***************************
Field: max_questions
Type: int(11) unsigned
Null: NO
Key:
Default: 0
Extra:
*************************** 37. row ***************************
Field: max_updates
Type: int(11) unsigned
Null: NO
Key:
Default: 0
Extra:
*************************** 38. row ***************************
Field: max_connections
Type: int(11) unsigned
Null: NO
Key:
Default: 0
Extra:
*************************** 39. row ***************************
Field: max_user_connections
Type: int(11) unsigned
Null: NO
Key:
Default: 0
Extra:
*************************** 40. row ***************************
Field: plugin
Type: char(64)
Null: NO
Key:
Default: mysql_native_password
Extra:
*************************** 41. row ***************************
Field: authentication_string
Type: text
Null: YES
Key:
Default: NULL
Extra:
*************************** 42. row ***************************
Field: password_expired
Type: enum('N','Y')
Null: NO
Key:
Default: N
Extra:
*************************** 43. row ***************************
Field: password_last_changed
Type: timestamp
Null: YES
Key:
Default: NULL
Extra:
*************************** 44. row ***************************
Field: password_lifetime
Type: smallint(5) unsigned
Null: YES
Key:
Default: NULL
Extra:
*************************** 45. row ***************************
Field: account_locked
Type: enum('N','Y')
Null: NO
Key:
Default: N
Extra:
45 rows in set (0.00 sec)
我们可以看到 MySQL 存储的用户信息是很详细的,我们重点认识下列三个:
sql
mysql> select user, host, authentication_string from user;
+---------------+-----------+-------------------------------------------+
| user | host | authentication_string |
+---------------+-----------+-------------------------------------------+
| root | localhost | *6139268A2A4C6063AC8C36B107244E54376C0555 |
| mysql.session | localhost | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
| mysql.sys | localhost | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
+---------------+-----------+-------------------------------------------+
3 rows in set (0.01 sec)
- host:表示这个用户可以从哪个主机登录,如果是 'localhost',表示只能从本机登录,如果是 '%',表示可以从任何主机登录
- user:用户名
- authentication_string:用户通过 password 函数加密后的密码
2. 创建用户
基本语法:
sql
create user '用户名'@'登录主机/IP地址' identified by '密码';
示例:
sql
mysql> select user, host, authentication_string from user;
+---------------+-----------+-------------------------------------------+
| user | host | authentication_string |
+---------------+-----------+-------------------------------------------+
| root | localhost | *90C5E6E0540F56439FDBD84142A681F92A9A1004 |
| mysql.session | localhost | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
| mysql.sys | localhost | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
+---------------+-----------+-------------------------------------------+
3 rows in set (0.00 sec)
mysql> create user 'lt'@'localhost' identified by '123456';
Query OK, 0 rows affected (0.00 sec)
mysql> select user, host, authentication_string from user;
+---------------+-----------+-------------------------------------------+
| user | host | authentication_string |
+---------------+-----------+-------------------------------------------+
| root | localhost | *90C5E6E0540F56439FDBD84142A681F92A9A1004 |
| mysql.session | localhost | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
| mysql.sys | localhost | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
| lt | localhost | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
+---------------+-----------+-------------------------------------------+
4 rows in set (0.00 sec)
3. 删除用户
基本语法:
sql
drop user '用户名'@'登录主机/IP地址';
示例:
sql
mysql> drop user 'lt'@'localhost';
Query OK, 0 rows affected (0.00 sec)
mysql> select user, host, authentication_string from user;
+---------------+-----------+-------------------------------------------+
| user | host | authentication_string |
+---------------+-----------+-------------------------------------------+
| root | localhost | *90C5E6E0540F56439FDBD84142A681F92A9A1004 |
| mysql.session | localhost | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
| mysql.sys | localhost | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
+---------------+-----------+-------------------------------------------+
3 rows in set (0.00 sec)
4. 修改用户登录密码
方案一:设置自己的密码
sql
set password=password('新的密码');
方案二:root 用户修改指定用户密码
sql
set password for '用户名'@'主机名'=password('新的密码');
5. 数据库的权限
5.1 常见权限与权限作用范围

5.2 授予用户权限:GRANT
基本语法:
sql
grant 权限列表 on 库.对象名 to '用户名'@'登陆主机/IP地址';
示例:
sql
-- 给用户赋予指定数据库中指定数据表的查询条件
grant select on db_name.table_name to 'lt'@'localhost';
-- 给用户赋予指定数据库的所有表的查询条件
grant select on db_name.* to 'lt'@'localhost';
5.3 查看权限:SHOW GRANTS
基本语法:
sql
show grants for '用户名'@'登录主机/IP地址';
示例:
sql
mysql> show grants for 'lt'@'localhost';
+----------------------------------------+
| Grants for lt@localhost |
+----------------------------------------+
| GRANT USAGE ON *.* TO 'lt'@'localhost' |
+----------------------------------------+
1 row in set (0.00 sec)
mysql> grant select on test.student to 'lt'@'localhost';
Query OK, 0 rows affected (0.00 sec)
mysql> show grants for 'lt'@'localhost';
+------------------------------------------------------+
| Grants for lt@localhost |
+------------------------------------------------------+
| GRANT USAGE ON *.* TO 'lt'@'localhost' |
| GRANT SELECT ON `test`.`student` TO 'lt'@'localhost' |
+------------------------------------------------------+
2 rows in set (0.00 sec)
5.4 回收权限:REVOKE
基本语法:
sql
revoke 权限列表 on 库.对象名 from '用户名'@'登陆主机/IP地址';
示例:
sql
mysql> show grants for 'lt'@'localhost';
+------------------------------------------------------+
| Grants for lt@localhost |
+------------------------------------------------------+
| GRANT USAGE ON *.* TO 'lt'@'localhost' |
| GRANT SELECT ON `test`.`student` TO 'lt'@'localhost' |
+------------------------------------------------------+
2 rows in set (0.00 sec)
mysql> revoke select on test.student from 'lt'@'localhost';
Query OK, 0 rows affected (0.00 sec)
mysql> show grants for 'lt'@'localhost';
+----------------------------------------+
| Grants for lt@localhost |
+----------------------------------------+
| GRANT USAGE ON *.* TO 'lt'@'localhost' |
+----------------------------------------+
1 row in set (0.00 sec)