导读
我们通常会给从库设置只读, 一般是设置read_only=ON
即可, 那么这个只读限定了哪些只读呢? super_read_only,transaction_read_only/tx_read_only, innodb_read_only 又是限定啥的呢?
super_read_only
-
当设置super_read_only=ON的时候, 会自动设置read_only=ON
-
比read_only多限制了有super权限的账号. 真正的只读
-
不允许创建函数,存储过程,触发器,EVENT等.
当设置super_read_only=ON的时候, 会自动设置read_only=ON
比read_only多限制了有super权限的账号. 真正的只读
不允许创建函数,存储过程,触发器,EVENT等.
-
不允许安装插件
-
EVENT_SCHEDULER不会执行
-
手动收集统计信息也不行的
数据更新我就不测了, 肯定不行的
主打一个啥也干不了, 跟外包似的. 但是可以查询.
read_only
-
read_only是除了拥有 CONNECTION_ADMIN (以前叫super)的账号 之外, 均不能更新数据
-
设置 read_only=off 会自动设置super_read_only=off
-
也创建函数,存储过程, 触发器,event等.(除super权限账号外)
-
非super权限账号创建的event也不能执行.
-
未提交的事务, 只能回滚
read_only是除了拥有 CONNECTION_ADMIN (以前叫super)的账号 之外, 均不能更新数据
设置 read_only=off 会自动设置super_read_only=off
也创建函数,存储过程, 触发器,event等.(除super权限账号外)
非super权限账号创建的event也不能执行.
未提交的事务, 只能回滚
基本上就是除了有super权限的账号外, 其它账号只能查询了.
transaction_read_only/tx_read_only
- 5.7.20 的时候 tx_read_only改名为transaction_read_only了. 其实是同义词. 8.0 就只剩transaction_read_only了.
- 会话级别参数, 也就是客户端可以自己设置自己的事务是否只读. 且对已连接的客户端不生效.
innodb_read_only
- 那仨变量都能在线修改, 但这个B是只读的, 修改的话,要重启. (当然也是全局的咯)
- 8.0 以前只对innodb设置为只读, 8.0之后对所有存储引擎都是只读.
- 系统表是innodb的话, 也不能做analyze之类的了.
汇总
- read_only/super_read_only 更像是对账号设置只读, 要连接数据库才能做的更新操作(含存储过程/函数,触发器,event)都不允许了. 已连接会话未提交的事务只能回滚. 是全局变量, 可动态修改.
- transaction_read_only/tx_read_only 是会话级别的参数, 会话可以自己修改自己的会话值. 所以对已连接的会话不生效
- innodb_read_only 更像是对文件做了只读.
- 设置
super_read_only = on
会自动设置 read_only=on
- 设置
read_only=off
会自动设置 super_read_only=off
- 那仨变量都能在线修改, 但这个B是只读的, 修改的话,要重启. (当然也是全局的咯)
- 8.0 以前只对innodb设置为只读, 8.0之后对所有存储引擎都是只读.
- 系统表是innodb的话, 也不能做analyze之类的了.
汇总
- read_only/super_read_only 更像是对账号设置只读, 要连接数据库才能做的更新操作(含存储过程/函数,触发器,event)都不允许了. 已连接会话未提交的事务只能回滚. 是全局变量, 可动态修改.
- transaction_read_only/tx_read_only 是会话级别的参数, 会话可以自己修改自己的会话值. 所以对已连接的会话不生效
- innodb_read_only 更像是对文件做了只读.
- 设置
super_read_only = on
会自动设置 read_only=on
- 设置
read_only=off
会自动设置 super_read_only=off
super_read_only = on
会自动设置 read_only=on
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;