read_only - xiaoboluo768/qianjinliangfang GitHub Wiki

  • 设置是否开启限制非super权限用户更改数据库,当设置为ON时,除了具有super权限的用户之外,其他用户不可对数据库做变更操作
    • 全局,会话,动态变量,默认值为OFF
    • 即使启用了read_only,服务器也允许这些操作:
      • 如果服务器是复制架构中的从库,则复制线程允许通过复制的方式执行更新数据。在复制设置中,在从库上启用read_only可确保从库只接受来自主库的数据更新,而不接收来自客户端发起的数据更新操作。这可以预防主备数据不一致。
      • 允许使用ANALYZE TABLE或OPTIMIZE TABLE语句(5.7.17版本实测在read_only开启时不能执行OPTIMIZE 语句)。只读模式的目的是防止更改表结构或表数据内容。分析和优化不属于此类预防的对象,例如,可以使用mysqlcheck --all-databases --analyze执行对只读从库做一致性检查
      • 允许使用create TEMPORARY创建表并做DML、DDL以及drop临时表等操作(对临时表的操作不允许在事务内执行)
      • 允许对日志表(mysql.general_log和mysql.slow_log)进行DML操作(5.7.17版本实测在read_only参数打开时,不具有super权限的用户不能执行DML)
      • 从MySQL 5.7.16开始,还允许更新performance schema下的表,如做UPDATE或TRUNCATE TABLE操作(5.7.17实测在read_only打开时,不具有super权限的用户不能执行UPDATE,会报拒绝XX用户执行UPDATE)
    • 对主库上read_only的更改不会复制到从库。该值在主从之间相互独立,设置互不影响
    • PS:注意事项:以下场景适用于启用read_only(包括启用super_read_only引起的隐式尝试):
      • 如果您在启用该变量之前,对于表级锁或页级锁的存储引擎表,有任何显式锁定(以LOCK TABLES获取)或具有待处理事务(innodb表5.7.17版本实测不具有super权限的用户显式开启一个事务并使用for update语句加锁,具有super权限的用户仍然能够修改read_only=ON),则尝试修改该变量的操作会失败并发生错误(5.7.17版本实测对于myisam表是会发生阻塞等待以及使用autocommit=0和innodb_table_locks=1时对innodb表使用lock table语句时也是会发生阻塞等待,并不是报错)
      • 对于表级锁或页级锁的存储引擎表,尝试阻止其他客户端持有显式表锁或具有处理的事务时,需要等到释放锁并且事务结束之后才可以修改该变量。此时启用read_only的尝试会阻塞并进行等待,其他客户端对表锁的请求或事务的请求也将被阻塞,直到read_only被设置成功
      • 对于表级锁或页级锁的存储引擎表,如果存在持有元数据锁的活跃事务,那么修改该变量的操作将被阻塞,直到这些事务结束为止,但当您持有全局读锁定(使用FLUSH TABLES WITH READ LOCK获取的锁)时,可以立即启用read_only,因为它不涉及表锁

上一篇:sql_mode | 下一篇:max_user_connections