TiDB 有什么办法让当前会话只读,START transaction read only 无效

【 TiDB 使用环境】生产环境 /测试/ Poc
【 TiDB 版本】6.1, 7.5
【遇到的问题:问题现象及影响】
我们需求背景是:计划在跳板机上配置两个 MySQL client ,一个用于只读,比如就叫 mysql ,一个用于变更比如 叫mysql_rw,这样无论传参使用什么账户密码都可以默认兜住一些不必要的更新。

MySQL 可以在init_connect里面设置 SET TRANSACTION READ ONLY=1 来让当前会话只读,但 TiDB 没有实现这个系统变量,还有其他方案吗? 新增一个专用的 全局读账户可以,但如果我们想的无论什么账户密码连上去,都默认只读呢?

找了许久,没发现好的法子,是在不行最后我最后就得加个全局只读账户了。

姿势不对啊。直接创建账户被,单纯只读

SET TRANSACTION READ ONLY=1 这个只是能执行,但是不能生效
https://docs.pingcap.com/zh/tidb/stable/system-variables#tidb_enable_noop_functions-从-v40-版本开始引入

有个全局只读的
https://docs.pingcap.com/zh/tidb/stable/system-variables#tidb_restricted_read_only-从-v520-版本开始引入

不是姿势不对,现在就是没找到姿势 :rofl: TiDB 没有优雅实现这个呀

如果是只是用于开发访问数据库这种场景,为什么不用archery,或者是yearning亦或者是Bytebase 等这些数据库管理平台呢 :slightly_smiling_face:

1 个赞

最佳解决办法是创建只读账户,
另外, 可以使用 MySQL Proxy 或 MariaDB MaxScale 等中间件,在代理层设置只读模式

感谢大家的建议,但这就是为了挡住 DBA 自己 Commandline 误操作呢,这和开放只读查询给 dev 同学查询,那就就不是一个场景了哦。

感谢,中间件这个是一个思路~不过有点重度。。还不如创建一个只读账户了

一样的,没任何区别

你用 START TRANSACTION READ ONLY 还不是一样一提交还是 能更新吧,如果怕误操作,可以用
-U, --safe-updates Only allow UPDATE and DELETE that uses keys.
-U, --i-am-a-dummy Synonym for option --safe-updates, -U.
虽然不是完全不能执行更新,但是应该能挡住 90 % 的误操作了吧

  1. 创建只读账户:为只读操作创建一个专用的全局账户,并将这个账户的权限设置为只读。虽然这不是您想要的“默认”行为,但对于许多用户来说,这是一个简单有效的解决方案。
  2. 使用 TiDB 的权限系统:您可以利用 TiDB 的权限系统来控制不同账户的权限。例如,创建一个只读角色,并将该角色授予所有用户。这样,即使用户尝试使用其他账户进行写入操作,也会因为权限限制而失败。
  3. 中间件控制:如果您使用的是 TiDB 的中间件(如 TiDB Dashboard、Mydumper、Loader 等),您可以在中间件层面实现只读控制。例如,配置中间件只转发读操作请求到 TiDB 集群。
  4. 自定义代理:编写一个自定义代理服务,该服务拦截所有数据库请求,并将写请求转换为读请求或直接拒绝。这样,所有通过该代理的连接都会默认只读。
  5. TiDB 跳板机配置:在跳板机上,您可以配置防火墙规则或使用 iptables 等工具来拦截并修改数据库请求,实现只读。
  6. 审计插件:虽然 TiDB 的审计插件不能直接阻止写操作,但它可以记录所有尝试的写操作,从而帮助您监控和审计数据库活动。
  7. TiDB 企业版:如果您使用的是 TiDB 企业版,可以考虑使用企业版的细粒度权限控制功能,这些功能可能提供更高级的权限管理选项。
  8. 社区反馈和贡献:如果上述方案都不能满足您的需求,您可以考虑向 TiDB 社区提出功能请求或贡献代码。TiDB 是一个开源项目,社区成员的贡献对其发展非常重要。

https://docs.pingcap.com/zh/tidb/stable/sql-statement-start-transaction#mysql-兼容性

看来是不行了,这是个文档中特意强调过的兼容性问题。

还是考虑上数据库审核吧。

1 个赞

谢谢,这个safe update 参数我们有用,现在是想进别区分隔离变更入口和只读入口。

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