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)
相关推荐
小冯不疯1 小时前
物料主数据同步实战:从金蝶云星空到小满OKKICRM的单一策略深度拆解
java·大数据·数据库
Ivanqhz1 小时前
超参数考量与设计
数据库·人工智能·深度学习·算法·机器学习
张小姐的猫1 小时前
【MySQL】表的约束
android·linux·服务器·数据库·c++·mysql·adb
爱吃牛肉的大老虎1 小时前
Redis之分布式 Session问题
数据库·redis·分布式
guo_wen_qiang1 小时前
mongodb集群模式的原理
服务器·数据库·mongodb
captain3761 小时前
Spring Boot日志
java·数据库·spring boot
阿标在干嘛1 小时前
分布式锁的“场景适配“:我们为什么在部分链路中选择了数据库乐观锁?
数据库·分布式
jiidd1 小时前
关于SQL SERVICE数据库里换行问题
数据库·sql·oracle
java_nnnn2 小时前
数据库读写分离与 Redis 缓存:从 MySQL 查询压力到缓存机制
数据库·redis·缓存