MySQL设置只读用户的核心是禁止写操作权限并禁用SUPER等高危权限,具体步骤包括:一、创建限定IP的用户;二、仅授予SELECT权限;三、显式撤销INSERT、UPDATE、DELETE等写权限及SUPER等危险权限;四、FLUSH PRIVILEGES并验证。

MySQL 设置只读用户,核心是**禁止写操作权限(INSERT、UPDATE、DELETE、DROP、CREATE、ALTER 等),仅保留 SELECT 权限**,并确保该用户无法切换到可写模式(如禁用 SUPER 权限)。以下是安全、实用的配置方法。
一、创建用户并限制登录来源
先创建一个专用只读账号,建议限定访问主机(避免使用 '%' 开放所有地址):
示例(只允许从内网 192.168.10.% 登录):
CREATE USER 'readonly_user'@'192.168.10.%' IDENTIFIED BY 'StrongPass123!';二、授予最小必要权限:仅 SELECT
对指定数据库(如 myapp_db)授予 SELECT 权限,不赋予任何写权限:
GRANT SELECT ON myapp_db.* TO 'readonly_user'@'192.168.10.%';若需跨多个库只读,逐个授权:
GRANT SELECT ON sales_db.* TO 'readonly_user'@'192.168.10.%';GRANT SELECT ON reports_db.* TO 'readonly_user'@'192.168.10.%';
⚠️ 注意:不要执行 GRANT SELECT ON *.*(全局 SELECT),这会暴露系统库(如 mysql、information_schema),存在信息泄露风险。
三、显式撤销高危权限(关键步骤)
即使未显式授权,某些旧版本或复制环境可能隐含权限。为保险起见,主动回收潜在危险权限:
- REVOKE INSERT, UPDATE, DELETE, DROP, CREATE, ALTER, INDEX, LOCK TABLES, CREATE VIEW, SHOW VIEW, TRIGGER, EXECUTE ON *.* FROM 'readonly_user'@'192.168.10.%';
- REVOKE SUPER, REPLICATION CLIENT, REPLICATION SLAVE ON *.* FROM 'readonly_user'@'192.168.10.%';
这些权限一旦拥有,可能绕过只读限制(例如 SUPER 可修改 sql_log_bin 或 set session read_only=0)。
四、刷新权限并验证效果
执行后必须刷新才能生效:
FLUSH PRIVILEGES;验证是否真正只读:
- 用该用户连接:
mysql -u readonly_user -p -h your_host - 执行
SELECT COUNT(*) FROM myapp_db.users;→ 应成功 - 执行
INSERT INTO myapp_db.users(name) VALUES('test');→ 应报错ERROR 1142 (42000): INSERT command denied - 执行
SHOW GRANTS FOR CURRENT_USER;→ 确认输出中只有 SELECT 行,无其他 DML/DCL 权限
不复杂但容易忽略。










