核心目标: 学习如何管理 MySQL 用户账户及其对数据库对象的访问权限,确保数据库安全。
主要命令: CREATE USER
, ALTER USER
, DROP USER
, GRANT
, REVOKE
.
前提: DCL 操作通常需要具有相应管理权限的用户(如 root
用户或拥有 CREATE USER
、GRANT
等权限的用户)来执行。
创建用户 (CREATE USER
)
作用: 创建新的 MySQL 用户账户。
语法:
CREATE USER 'username'@'host' IDENTIFIED BY 'password';
说明:
'username'
: 要创建的用户名。'host'
: 指定用户可以从哪个主机连接 ('localhost'
, '%'
, 特定 IP)。IDENTIFIED BY 'password'
: 设置用户的登录密码。务必使用强密码!示例:
-- 创建一个只能本地登录,密码为 'pass123' 的用户 'appuser'
CREATE USER 'appuser'@'localhost' IDENTIFIED BY 'pass123';
-- 创建一个可以从任何地方登录,密码为 'complex_Pwd!@#' 的用户 'remote_admin'
CREATE USER 'remote_admin'@'%' IDENTIFIED BY 'complex_Pwd!@#';
-- 创建一个只能从特定 IP 登录的用户
CREATE USER 'report_user'@'192.168.1.50' IDENTIFIED BY 'report_secret';
查看用户 作用: 列出 MySQL 中的用户账户。 语法 (查询系统表):
SELECT user, host FROM mysql.user;
修改用户 (ALTER USER
)
作用: 修改现有用户的属性,最常用的是修改密码。
语法 (修改密码 - 推荐方式):
ALTER USER 'username'@'host' IDENTIFIED BY 'new_password';
语法 (其他修改 - 不常用):
-- RENAME USER 'olduser'@'oldhost' TO 'newuser'@'newhost'; -- 重命名
-- ALTER USER 'username'@'host' ACCOUNT LOCK; -- 锁定
-- ALTER USER 'username'@'host' ACCOUNT UNLOCK; -- 解锁
示例:
-- 修改 'appuser'@'localhost' 的密码为 'newStrongPass456'
ALTER USER 'appuser'@'localhost' IDENTIFIED BY 'newStrongPass456';
删除用户 (DROP USER
)
作用: 永久删除一个用户账户。
语法:
DROP USER 'username'@'host';
!!! 警告:删除用户是不可逆的 !!!
示例:
-- 删除本地用户 'testuser'
DROP USER 'testuser'@'localhost';
-- 删除远程用户 'old_admin'
DROP USER 'old_admin'@'%';
权限概念:
定义用户能在数据库上执行的操作。常见权限:SELECT
, INSERT
, UPDATE
, DELETE
, CREATE
, DROP
, ALTER
, ALL PRIVILEGES
等。权限作用域:全局 (*.*
), 数据库 (database_name.*
), 表 (database_name.table_name
)。
授予权限 (GRANT
)
作用: 给用户分配操作数据库对象的权限。
语法:
GRANT privilege_list ON object_type TO 'username'@'host' [WITH GRANT OPTION];
说明:
privilege_list
: 权限列表 (如 SELECT, INSERT
) 或 ALL PRIVILEGES
。object_type
: 权限作用的对象 (如 db_name.*
, db_name.table_name
, *.*
)。WITH GRANT OPTION
: (可选) 允许该用户将权限授予他人(危险)。示例:
-- 授予 'appuser'@'localhost' 对 'company_db' 所有表的 select, insert, update 权限
GRANT SELECT, INSERT, UPDATE ON company_db.* TO 'appuser'@'localhost';
-- 授予 'report_user'@'192.168.1.50' 对 'sales_db.orders' 表的只读权限
GRANT SELECT ON sales_db.orders TO 'report_user'@'192.168.1.50';
-- 授予 'db_admin'@'localhost' 对 'inventory_db' 的所有权限并允许授权
GRANT ALL PRIVILEGES ON inventory_db.* TO 'db_admin'@'localhost' WITH GRANT OPTION;
-- 授予创建数据库的全局权限 (谨慎)
GRANT CREATE ON *.* TO 'developer'@'localhost';
查看权限 (SHOW GRANTS
)
作用: 显示指定用户拥有的权限。
语法:
SHOW GRANTS FOR 'username'@'host';
示例:
-- 查看 'appuser'@'localhost' 的权限
SHOW GRANTS FOR 'appuser'@'localhost';
-- 查看当前登录用户的权限
SHOW GRANTS;
-- 或者
-- SHOW GRANTS FOR CURRENT_USER();
撤销权限 (REVOKE
)
作用: 收回已授予用户的权限。
语法:
REVOKE privilege_list ON object_type FROM 'username'@'host';
注意: privilege_list
和 object_type
需与 GRANT
时匹配。撤销 GRANT OPTION
使用 REVOKE GRANT OPTION ON ... FROM ...
。
示例:
-- 从 'appuser'@'localhost' 收回对 'company_db' 的 update 权限
REVOKE UPDATE ON company_db.* FROM 'appuser'@'localhost';
-- 从 'report_user'@'192.168.1.50' 收回对 'sales_db.orders' 的 select 权限
REVOKE SELECT ON sales_db.orders FROM 'report_user'@'192.168.1.50';
-- 撤销 'db_admin'@'localhost' 对 'inventory_db' 的所有权限
REVOKE ALL PRIVILEGES ON inventory_db.* FROM 'db_admin'@'localhost';
-- 撤销 'db_admin'@'localhost' 的授权能力
REVOKE GRANT OPTION ON inventory_db.* FROM 'db_admin'@'localhost';
3. 重要说明与最佳实践
FLUSH PRIVILEGES;
: 通常不需要手动执行。仅在直接修改系统权限表(不推荐)后才需要。标准 DCL 命令会自动刷新权限。假设你以 root
用户或其他有足够权限的用户登录。
创建一个新用户 readonly_user
,只能从本地 (localhost
) 登录,密码设置为 ReadOnly123
。
答案:
CREATE USER 'readonly_user'@'localhost' IDENTIFIED BY 'ReadOnly123';
授予 readonly_user
对数据库 mydatabase
中所有表的只读权限 (SELECT
)。
答案:
GRANT SELECT ON mydatabase.* TO 'readonly_user'@'localhost';
查看 readonly_user
现在拥有的权限。
答案:
SHOW GRANTS FOR 'readonly_user'@'localhost';
创建一个新用户 webapp
,可以从任何主机 (%
) 登录,密码为 WebAppSecurePwd!
.
答案:
CREATE USER 'webapp'@'%' IDENTIFIED BY 'WebAppSecurePwd!';
授予 webapp
用户对 mydatabase
数据库中的 users
表和 orders
表执行 SELECT
, INSERT
, UPDATE
操作的权限。
答案:
GRANT SELECT, INSERT, UPDATE ON mydatabase.users TO 'webapp'@'%';
GRANT SELECT, INSERT, UPDATE ON mydatabase.orders TO 'webapp'@'%';
修改 readonly_user
的密码为 NewPass456
。
答案:
ALTER USER 'readonly_user'@'localhost' IDENTIFIED BY 'NewPass456';
撤销 webapp
用户对 mydatabase.users
表的 UPDATE
权限。
答案:
REVOKE UPDATE ON mydatabase.users FROM 'webapp'@'%';
查看 webapp
用户现在的权限,确认 UPDATE
on users
已被撤销。
答案:
SHOW GRANTS FOR 'webapp'@'%';
删除用户 readonly_user
。
答案:
DROP USER 'readonly_user'@'localhost';