如何设置只读用户_mysql只读权限配置

来源:这里教程网 时间:2026-02-28 20:49:05 作者:

要让 MySQL 用户只能读取数据、不能修改或删除,核心是只授予

SELECT
权限,并确保不赋予任何写操作权限(如
INSERT
UPDATE
DELETE
DROP
CREATE
等)。

创建只读用户并授权

以管理员身份登录 MySQL(如 root),执行以下命令:

创建用户(MySQL 8.0+ 推荐指定认证插件):
CREATE USER 'readonly_user'@'%' IDENTIFIED WITH mysql_native_password BY 'your_strong_password';
授予对指定数据库的只读权限:
GRANT SELECT ON `mydb`.* TO 'readonly_user'@'%';
刷新权限使生效:
FLUSH PRIVILEGES;

注意:

`mydb`.*
表示对
mydb
库下所有表只读;若需跨库只读,需对每个库单独
GRANT SELECT

限制访问范围(更安全的做法)

生产环境建议缩小用户可连接的来源和操作范围:

'readonly_user'@'192.168.1.%'
替代
'%' 
,限制 IP 段访问
避免使用
GRANT SELECT ON *.*
,这会授予所有库只读权,存在敏感库泄露风险
如只需查某几张表,可精确授权:
GRANT SELECT ON mydb.users TO 'readonly_user'@'%';
GRANT SELECT ON mydb.orders TO 'readonly_user'@'%';

验证只读权限是否生效

用新用户登录后测试:

执行
SELECT COUNT(*) FROM users;
→ 应成功返回结果
执行
INSERT INTO users(name) VALUES('test');
→ 应报错
ERROR 1142 (42000): INSERT command denied
执行
SHOW GRANTS FOR 'readonly_user'@'%';
→ 确认输出中只有
SELECT
权限,无其他 DML 或 DDL 权限

额外提醒:避免隐式写操作

某些看似只读的操作实际可能触发写行为,需留意:

SELECT ... FOR UPDATE
LOCK IN SHARE MODE
需要
SELECT
+ 锁权限,但默认只读用户无锁表权限,会拒绝
查询
INFORMATION_SCHEMA
performance_schema
通常无需额外授权,但部分系统表受
PROCESS
SHOW DATABASES
等权限控制,如不需要,不要授予
MySQL 8.0+ 中,
READ_ONLY
系统变量影响的是整个实例的写入(需 SUPER 权限设置),与用户级只读无关,勿混淆

相关推荐