如何设置只读用户_mysql只读权限配置

4次阅读

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

如何设置只读用户_mysql只读权限配置

要让 MySQL 用户只能读取数据、不能修改或删除,核心是只授予 SELECT 权限,并确保不赋予任何写操作权限(如 INSERTUPDATEDELETEDROPCREATE 等)。

创建只读用户并授权

以管理员身份登录 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 UPDATELOCK IN SHARE MODE 需要 SELECT + 锁权限,但默认只读用户无锁表权限,会拒绝
  • 查询 INFORMATION_SCHEMAperformance_schema 通常无需额外授权,但部分系统表受 PROCESSSHOW DATABASES 等权限控制,如不需要,不要授予
  • MySQL 8.0+ 中,READ_ONLY 系统变量影响的是整个实例的写入(需 SUPER 权限设置),与用户级只读无关,勿混淆
text=ZqhQzanResources