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!';对指定数据库(如 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.%';
.168.10.%';⚠️ 注意:不要执行 GRANT SELECT ON *.*(全局 SELECT),这会暴露系统库(如 mysql、information_schema),存在信息泄露风险。
即使未显式授权,某些旧版本或复制环境可能隐含权限。为保险起见,主动回收潜在危险权限:
这些权限一旦拥有,可能绕过只读限制(例如 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 权限不复杂但容易忽略。