在 MySQL 中创建用户并管理其权限是一项核心的数据库管理任务。下面我将详细讲解如何创建用户、授予权限以及相关的安全最佳实践。
核心概念
在 MySQL 中,一个用户身份由两部分唯一确定:'username'@'hostname'。
'user'@'localhost'
: 只能从数据库服务器本机连接。 * 'user'@'192.168.1.%'
: 可以从 192.168.1.0/24
网段连接。 * 'user'@'%'
: 可以从任何主机连接(生产环境慎用)。一、 创建用户 (CREATE USER)
创建用户的基本命令是 CREATE USER
。创建后,新用户几乎没有任何权限。
语法
CREATE USER 'username'@'hostname' IDENTIFIED BY 'password';
示例
sql CREATE USER 'myapp'@'localhost' IDENTIFIED BY 'a_strong_password_123!';
sql CREATE USER 'readonly_user'@'192.168.1.%' IDENTIFIED BY 'another_password'; -- % 是通配符,代表整个子网
sql CREATE USER 'admin'@'%' IDENTIFIED BY 'very_complex_password';
二、 授予权限 (GRANT)
创建用户后,必须使用 GRANT
语句为其授予特定的权限。
语法
GRANT privilege1, privilege2 ON database_name.table_name TO 'username'@'hostname';
privilege
: 权限类型,如 SELECT
, INSERT
, UPDATE
, DELETE
, ALL PRIVILEGES
等。ON database_name.table_name
: 指定权限应用于哪个数据库的哪个表。 * *.*
: 所有数据库的所有表(通常只给超级管理员此权限)。 * mydb.*
: mydb
数据库的所有表。 * mydb.users
: mydb
数据库的 users
表。常用权限列表
权限 |
说明 |
|
所有权限(除了 |
|
创建数据库和表 |
|
删除数据库和表 |
|
删除表中的数据 |
|
向表中插入数据 |
|
查询表中的数据 |
|
更新表中的数据 |
|
允许用户将其权限授予其他用户 |
示例
sql GRANT ALL PRIVILEGES ON myapp_db.* TO 'myapp'@'localhost'; -- 现在 'myapp'@'localhost' 用户可以完全管理 `myapp_db` 数据库
sql GRANT SELECT ON analytics_db.* TO 'readonly_user'@'192.168.1.%'; -- 该用户只能查询 `analytics_db` 下的所有表,不能修改数据
sql GRANT SELECT, INSERT ON myapp_db.logs TO 'logger'@'localhost';
sql GRANT ALL PRIVILEGES ON *.* TO 'admin'@'%' WITH GRANT OPTION; -- `WITH GRANT OPTION` 允许该用户将其权限授予其他用户
重要: 执行 GRANT
语句后,必须使用 FLUSH PRIVILEGES;
命令刷新权限,使更改立即生效。但是,如果使用 CREATE USER
和 GRANT
语句(如上所示),MySQL 会自动刷新权限。如果直接修改权限表(如使用 INSERT
, UPDATE
),则必须手动执行 FLUSH PRIVILEGES;
。
三、 查看与撤销权限
SHOW GRANTS FOR 'username'@'hostname';
例如:
SHOW GRANTS FOR 'readonly_user'@'192.168.1.%';
语法与 GRANT
类似。
REVOKE privilege_type ON database_name.table_name FROM 'username'@'hostname';
例如,撤销插入权限:
REVOKE INSERT ON myapp_db.logs FROM 'logger'@'localhost';
四、 修改用户
ALTER USER 'username'@'hostname' IDENTIFIED BY 'new_strong_password';
这是 MySQL 5.7+ 及 8.0 版本推荐的修改密码方式。
DROP USER 'username'@'hostname';
注意: 必须同时指定用户名和主机名。
五、 完整工作流与最佳实践示例
假设我们要为一个新的博客应用创建数据库用户。
bash mysql -u root -p
sql CREATE DATABASE blog_app CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
sql CREATE USER 'blog_writer'@'192.168.1.100' IDENTIFIED BY 'SuperSecurePassw0rd!';
sql GRANT SELECT, INSERT, UPDATE, DELETE, CREATE ON blog_app.* TO 'blog_writer'@'192.168.1.100';
sql CREATE USER 'blog_reader'@'192.168.1.%' IDENTIFIED BY 'AnotherSecurePass!'; GRANT SELECT ON blog_app.* TO 'blog_reader'@'192.168.1.%';
sql SHOW GRANTS FOR 'blog_writer'@'192.168.1.100'; SHOW GRANTS FOR 'blog_reader'@'192.168.1.%';
安全最佳实践
ALL PRIVILEGES
。'user'@'%'
。始终将用户限制在特定的主机或子网。validate_password
组件来强制密码策略。SHOW GRANTS
定期审查用户的权限,撤销不再需要的权限。通过以上步骤,你就可以安全有效地管理 MySQL 用户和权限了。
另外搭配便捷的MYSQL备份工具,可定时备份、异地备份,MYSQL导出导入。可本地连接LINUX里的MYSQL,简单便捷。可以大大地提高工作效率喔。