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