当TIDB作为mysql从库时如何配置为只读模式

【 TiDB 使用环境】生产环境
【 TiDB 版本】 v6.1.0
【遇到的问题】

目前我的TIDB集群通过DM组件配置成为了1个从库,上游是MYSQL 5.7,现在我想把TIDB配置为只读从库,如何实现呢?似乎通过read_only 设置会报错?

【复现路径】做过哪些操作出现的问题
【问题现象及影响】

mysql> set global read_only = 1;
ERROR 1235 (42000): function READ ONLY has only noop implementation in tidb now, use tidb_enable_noop_functions to enable these functions
mysql>
mysql>

另外我需要启用这个变量( tidb_enable_noop_functions)嘛?

【附件】

请提供各个组件的 version 信息,如 cdc/tikv,可通过执行 cdc version/tikv-server --version 获取。

tidb_restricted_read_only 从 v5.2.0 版本开始引入

  • 作用域:GLOBAL
  • 是否持久化到集群:是
  • 默认值: OFF
  • 可选值: OFFON
  • 该变量可以控制整个集群的只读状态。开启后(即该值为 ON ),整个集群中的 TiDB 服务器都将进入只读状态,只有 SELECTUSESHOW 等不会修改数据的语句才能被执行,其他如 INSERTUPDATE 等语句会被拒绝执行。
  • 该变量开启只读模式只保证整个集群最终进入只读模式,当变量修改状态还没被同步到其他 TiDB 服务器时,尚未同步的 TiDB 仍然停留在非只读模式。
  • 在变量开启时,正在执行的 SQL 语句不会受影响,只对新执行的 SQL 语句进行是否只读的检查。
  • 在变量开启时,对于尚未提交的事务:
    • 如果有尚未提交的只读事务,可正常提交该事务。
    • 如果尚未提交的事务为非只读事务,在事务内执行写入的 SQL 语句会被拒绝。
    • 如果尚未提交的事务已经有数据改动,其提交也会被拒绝。
  • 当集群开启只读模式后,所有用户(包括 SUPER 用户)都无法执行可能写入数据的 SQL 语句,除非该用户被显式地授予了 RESTRICTED_REPLICA_WRITER_ADMIN 权限。
  • 拥有 RESTRICTED_VARIABLES_ADMINSUPER 权限的用户可以修改该变量。如果用户开启了安全增强模式 (Security Enhanced Mode),则只有 RESTRICTED_VARIABLES_ADMIN 权限的用户才能修改该变量。

还有这个参数 tidb_super_read_only 一并参考。

假设我配置tidb_restricted_read_only为ON,那么通过DM组件的复制还能正常工作嘛?

刚才测试了下,基于DM组件配置的增量复制会报错,错误如下

mysql> show global variables like '%restricted%';
+---------------------------+-------+
| Variable_name             | Value |
+---------------------------+-------+
| tidb_restricted_read_only | ON    |
+---------------------------+-------+
1 row in set (0.00 sec)

mysql>
Starting component `dmctl`: /root/.tiup/components/dmctl/v6.1.0/dmctl/dmctl query-status --master-addr=x.x.x.x:8261
{
    "result": true,
    "msg": "",
    "tasks": [
        {
            "taskName": "task_mysql1322033307_incremental",
            "taskStatus": "Error - Some error occurred in subtask. Please run `query-status task_mysql1322033307_incremental` to get more details.",
            "sources": [
                "mysql1322033307"
            ]
        }
    ]
}

通过用户权限管理呢。所有业务账户,全改成只读。

啊?这个不太合理吧

DM的具体报错信息是啥,使用的tidb root用户吗

是的,

对的,DM增量复制中我配置的是root用户

tidb_super_read_only 这个参数我在6.1的文档-系统变量 中没找到,但是它却出现在了TIDB show global variables 中了

we introduced the TIDB_RESTRICTED_READ_ONLY global variable. Turning it on will make the cluster read-only eventually for all users, including users with SUPER or CONNECTION_ADMIN privilege.

那么TIDB在只读模式下,如果想保持DM的持续增量复制,该怎么做呢?

  • After the read-only mode is enabled, all users (including the users with the SUPER privilege) cannot execute the SQL statements that might write data unless the user is explicitly granted the RESTRICTED_REPLICA_WRITER_ADMIN privilege.
    给root RESTRICTED_REPLICA_WRITER_ADMIN权限试试

上文的链接说的很明白了,需要RESTRICTED_REPLICA_WRITER_ADMIN权限。

  • 当集群开启只读模式后,所有用户(包括 SUPER 用户)都无法执行可能写入数据的 SQL 语句,除非该用户被显式地授予了 RESTRICTED_REPLICA_WRITER_ADMIN 权限。

谢谢,没仔细看文档,添加了RESTRICTED_REPLICA_WRITER_ADMIN权限好了

挺特别的设计 RESTRICTED_REPLICA_WRITER_ADMIN:+1:

这样的设计会不会出现很多问题? 毕竟tidb 不是完全兼容mysql的

此话题已在最后回复的 60 天后被自动关闭。不再允许新回复。