导读
我们通常会给从库设置只读, 一般是设置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等.




-
不允许安装插件

-
EVENT_SCHEDULER不会执行

-
手动收集统计信息也不行的

数据更新我就不测了, 肯定不行的
主打一个啥也干不了, 跟外包似的. 但是可以查询.
read_only
-
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
一般从库还是设置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;
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




