[MYSQL] read_only, super_read_only,transaction_read_only/tx_read_only, innodb_read_only 整理

2024年 6月 7日 78.6k 0

导读

我们通常会给从库设置只读, 一般是设置read_only=ON即可, 那么这个只读限定了哪些只读呢? super_read_only,transaction_read_only/tx_read_only, innodb_read_only 又是限定啥的呢?

super_read_only

  1. 当设置super_read_only=ON的时候, 会自动设置read_only=ON
    [MYSQL] read_only, super_read_only,transaction_read_only/tx_read_only, innodb_read_only 整理-1

  2. 比read_only多限制了有super权限的账号. 真正的只读
    [MYSQL] read_only, super_read_only,transaction_read_only/tx_read_only, innodb_read_only 整理-2

  3. 不允许创建函数,存储过程,触发器,EVENT等.
    [MYSQL] read_only, super_read_only,transaction_read_only/tx_read_only, innodb_read_only 整理-3

[MYSQL] read_only, super_read_only,transaction_read_only/tx_read_only, innodb_read_only 整理-4

[MYSQL] read_only, super_read_only,transaction_read_only/tx_read_only, innodb_read_only 整理-5

[MYSQL] read_only, super_read_only,transaction_read_only/tx_read_only, innodb_read_only 整理-6

  1. 不允许安装插件
    [MYSQL] read_only, super_read_only,transaction_read_only/tx_read_only, innodb_read_only 整理-7

  2. EVENT_SCHEDULER不会执行
    [MYSQL] read_only, super_read_only,transaction_read_only/tx_read_only, innodb_read_only 整理-8

  3. 手动收集统计信息也不行的
    [MYSQL] read_only, super_read_only,transaction_read_only/tx_read_only, innodb_read_only 整理-9

数据更新我就不测了, 肯定不行的

主打一个啥也干不了, 跟外包似的. 但是可以查询.

read_only

  1. read_only是除了拥有 CONNECTION_ADMIN (以前叫super)的账号 之外, 均不能更新数据
    [MYSQL] read_only, super_read_only,transaction_read_only/tx_read_only, innodb_read_only 整理-10

  2. 设置 read_only=off 会自动设置super_read_only=off
    [MYSQL] read_only, super_read_only,transaction_read_only/tx_read_only, innodb_read_only 整理-11

  3. 也创建函数,存储过程, 触发器,event等.(除super权限账号外)

  4. 非super权限账号创建的event也不能执行.

  5. 未提交的事务, 只能回滚
    [MYSQL] read_only, super_read_only,transaction_read_only/tx_read_only, innodb_read_only 整理-12

基本上就是除了有super权限的账号外, 其它账号只能查询了.

transaction_read_only/tx_read_only

  1. 5.7.20 的时候 tx_read_only改名为transaction_read_only了. 其实是同义词. 8.0 就只剩transaction_read_only了.
  2. 会话级别参数, 也就是客户端可以自己设置自己的事务是否只读. 且对已连接的客户端不生效.

innodb_read_only

  1. 那仨变量都能在线修改, 但这个B是只读的, 修改的话,要重启. (当然也是全局的咯)
  2. 8.0 以前只对innodb设置为只读, 8.0之后对所有存储引擎都是只读.
  3. 系统表是innodb的话, 也不能做analyze之类的了.

汇总

  1. read_only/super_read_only 更像是对账号设置只读, 要连接数据库才能做的更新操作(含存储过程/函数,触发器,event)都不允许了. 已连接会话未提交的事务只能回滚. 是全局变量, 可动态修改.
  2. transaction_read_only/tx_read_only 是会话级别的参数, 会话可以自己修改自己的会话值. 所以对已连接的会话不生效
  3. innodb_read_only 更像是对文件做了只读.
  4. 设置super_read_only = on 会自动设置 read_only=on
  5. 设置read_only=off 会自动设置 super_read_only=off

一般从库还是设置read_only即可. 稳一点的话, 设置super_read_only.

-- 设置只读
set global super_read_only=on;

-- 关闭只读
set global read_only=off;

super_read_only看起来只是在read_only的基础上多约束了个含super权限的账号, 所以变量值才有联动.
其它: 8.0.22及其之后还可以设置某个库只读 alter database db1 read only 1;

相关文章

Oracle如何使用授予和撤销权限的语法和示例
Awesome Project: 探索 MatrixOrigin 云原生分布式数据库
下载丨66页PDF,云和恩墨技术通讯(2024年7月刊)
社区版oceanbase安装
Oracle 导出CSV工具-sqluldr2
ETL数据集成丨快速将MySQL数据迁移至Doris数据库

发布评论