mysql只读权限必须显式授予select并彻底清除其他权限,优先drop重建用户以避免残留权限;创建时需指定mysql_native_password插件、限制ip、用反引号包裹库名,禁用on .,最后验证连通性、查询、写入及锁操作失败。

先确认用户是否干净,避免权限叠加冲突
MySQL 的只读不是靠开关控制的,而是靠“只给 SELECT、不给其他任何权限”实现的。如果目标用户已存在,GRANT SELECT 不会自动清除它之前被授予的 INSERT、UPDATE 甚至 GRANT OPTION,结果就是“看似只读,实则能写”。
实操建议:
- 先查清楚:运行
SHOW GRANTS FOR 'username'@'host';,看输出里有没有非SELECT权限 - 已有用户优先用
DROP USER 'username'@'host';彻底删除,再重建——比REVOKE更可靠,尤其当用户有全局权限时 - 别跳过这步直接
GRANT,否则可能白忙活
创建用户时必须指定认证插件和密码策略
MySQL 8.0+ 默认使用 caching_sha2_password 插件,但很多客户端(尤其是旧版 JDBC、某些 BI 工具)只认 mysql_native_password。不显式指定,会导致连接失败,报错类似 Client does not support authentication protocol。
实操建议:
- 用完整语法创建用户:
CREATE USER 'reporter'@'192.168.1.%' IDENTIFIED WITH mysql_native_password BY 'StrongPass2024!'; - 主机名别偷懒写
'%',生产环境必须限制 IP 段或具体地址,比如'192.168.1.%'或'10.0.5.22' - 密码必须含大小写字母、数字、特殊字符;MySQL 8.0+ 默认启用密码强度校验,弱密码会被拒绝
授权必须精确到库或表,禁用 *.*
GRANT SELECT ON *.* 看似方便,实际会让用户能访问 mysql、information_schema、performance_schema 这些系统库,可能暴露用户账号、密码哈希、SQL 执行计划等敏感信息。
MySQL 9.6.0是面向Linux平台的2026年创新版本,核心架构迎来重大革新。其将外键约束与级联操作从InnoDB引擎层上移至SQL层,确保所有数据变更均被完整记录至Binlog,彻底解决了CDC(变更数据捕获)与主从复制中的数据不一致难题。此外,该版本引入container_aware启动选项以原生适配容器环境,并对审计日志进行了组件化重构,为追求极致数据一致性与云原生体验的开发者提供了全新选择。
实操建议:
- 只读一个库:
GRANT SELECT ON `sales_db`.* TO 'reporter'@'192.168.1.%';(注意反引号,防库名含横线或关键字) - 只读多个库:逐条执行,例如:
GRANT SELECT ON `reports_db`.* TO 'reporter'@'192.168.1.%';和GRANT SELECT ON `analytics_db`.* TO 'reporter'@'192.168.1.%'; - 只要查几张表就更细粒度:
GRANT SELECT ON `sales_db`.`orders` TO 'reporter'@'192.168.1.%'; - 绝对不要执行
GRANT SELECT ON *.*,这是安全红线
验证时重点测三件事:连得上、查得通、写不了
权限生效后,不能只跑一条 SELECT 就算完。有些操作表面只读,实则隐式触发写行为(比如加锁),而只读用户没锁权限就会失败,导致应用报错。
实操建议:
- 用新用户登录:
mysql -u reporter -p -h your-db-host - 确认能查:
SELECT COUNT(*) FROM `sales_db`.`users`; - 确认不能写:
INSERT INTO `sales_db`.`users` (name) VALUES ('test');应报ERROR 1142 (42000): INSERT command denied - 确认不带锁:
SELECT * FROM `sales_db`.`users` LIMIT 1 FOR UPDATE;应直接报错(只读用户无LOCK TABLES权限) - 最后再跑一次
SHOW GRANTS FOR CURRENT_USER;,确保输出里只有SELECT,没有INSERT、UPDATE、GRANT OPTION等
反引号包裹库名、显式指定认证插件、逐库授权、禁用全局权限——这些不是“可选项”,是防止权限逃逸和连接失败的实际门槛。漏掉任意一环,都可能让只读账号变成安全隐患或运维故障点。










