目录
本文内容概要
1. 认识 MySQL 用户
2. 创建用户
3. 删除用户
4. 修改用户登录密码
5. 数据库的权限
5.1 常见权限与权限作用范围
5.2 授予用户权限:GRANT
5.3 查看权限:SHOW GRANTS
5.4 回收权限:REVOKE
本文内容概要
本文主要介绍 MySQL用户管理与权限控制的基础知识,包括用户的创建、删除与登录密码修改,以及数据库权限的授予、查看和回收。通过本文的学习,掌握 MySQL 用户管理的常用操作,理解权限控制的基本原理。
1. 认识 MySQL 用户
对于 MySQL 的初学者来说,可能一直使用 root 用户进行数据库的学习与操作。
但是,在实际项目开发过程中,一个 MySQL 服务器可能承载多个数据库,并由不同的开发人员或应用程序共同访问。如果所有人都使用 root 账户连接数据库,并对数据库、数据表进行 CRUD 等操作,显然是不合理的。
一方面,root 账户通常拥有较高的管理权限,误操作可能造成严重后果;另一方面,不同用户的工作职责不同,对数据库的操作需求也不相同。因此,我们需要对不同用户进行权限隔离。
为了解决这些问题,MySQL 提供了用户管理与权限控制机制。管理员可以创建不同的用户账户,并根据实际需求为其分配相应的操作权限,从而提高数据库的安全性。
那么,MySQL 是如何管理用户信息的呢?
MySQL 的用户账户与权限信息由系统数据库 mysql 中的授权表进行管理,其中 mysql.user 是一张重要的授权表,保存了用户账户及其全局权限等相关信息。
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 查看表结构:
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 存储的用户信息是很详细的,我们重点认识下列三个:
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. 创建用户
基本语法:
create user '用户名'@'登录主机/IP地址' identified by '密码';示例:
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. 删除用户
基本语法:
drop user '用户名'@'登录主机/IP地址';示例:
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. 修改用户登录密码
方案一:设置自己的密码
set password=password('新的密码');方案二:root 用户修改指定用户密码
set password for '用户名'@'主机名'=password('新的密码');5. 数据库的权限
5.1 常见权限与权限作用范围
5.2 授予用户权限:GRANT
基本语法:
grant 权限列表 on 库.对象名 to '用户名'@'登陆主机/IP地址';示例:
-- 给用户赋予指定数据库中指定数据表的查询条件 grant select on db_name.table_name to 'lt'@'localhost'; -- 给用户赋予指定数据库的所有表的查询条件 grant select on db_name.* to 'lt'@'localhost';5.3 查看权限:SHOW GRANTS
基本语法:
show grants for '用户名'@'登录主机/IP地址';示例:
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
基本语法:
revoke 权限列表 on 库.对象名 from '用户名'@'登陆主机/IP地址';示例:
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)