MySQL 基础篇(十):用户管理

目录

本文内容概要

[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)
相关推荐
小科先生6 分钟前
Java springboot调用数据库的基本流程
java·数据库·spring boot
星恒随风9 分钟前
MySQL 从零入门(四):表的增删改查与基础查询详解
linux·服务器·数据库·笔记·mysql
Pniubi2 小时前
MySQL靠什么实现事务的?事务隔离级别有哪些?
java·数据库·mysql
数据库小学妹3 小时前
pgbouncer 事务池:prepared statement、临时表与会话状态
数据库·后端·postgresql
aiks_yuan3 小时前
MySQL 死锁怎么排查:看懂 INNODB STATUS 死锁日志,先查后插为什么必死锁(MySQL 8.2 实测)
mysql
Lucifer三思而后行4 小时前
最近折腾了一下金仓数据库的备份恢复
数据库·备份恢复
草莓熊Lotso5 小时前
【C++ 基于微服务的即时通讯系统】文件存储子服务实战:UUID生成、文件IO封装与全接口单元测试
开发语言·网络·数据库·c++·微服务·架构·单元测试
进击的荆棘6 小时前
MySQL——库的操作
数据库·mysql
2601_967980116 小时前
“小程序·云开发”上线 助力开发者的高效利器
数据库·存储管理·小程序云开发·云函数·开发者工具
zhangjw346 小时前
1-9 SELECT 查询基础:where、group by、having、order by、limit offset
数据库·postgresql·pg数据库