mysql只读用户需仅授予select权限,禁用insert/update/delete等写权限;创建用户后执行grant select on database.table to 'user'@'host';限制ip范围、精确到表级授权更安全;验证时select成功而insert报错,且show grants仅显示select。

要让 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 权限设置),与用户级只读无关,勿混淆










