docs-cn
docs-cn copied to clipboard
系统变量 tidb_read_staleness 无效
File: /release-6.1/tidb-read-staleness.md
比如,如果该变量的值设置为 -5,TiDB 会在 5 秒时间范围内,保证 TiKV 拥有对应历史版本数据的情况下,选择尽可能新的一个时间戳。
5 秒时间范围内,也就是说:5秒前 到 现在,尽可能新的时间戳,那就是现在。 而预期的时间范围是:从开始 到 5秒前,尽可能新的时间戳。
AS OF TIMESTAMP正常,tidb_snapshot正常,tidb_read_staleness失败。
Hi @monkey1993 , 怎么确认是失败的; 可以把步骤和 tidb 版本贴一下。建议去 tidb repo 提 issue
UPDATE t_human h SET h.f_human_level = 300 WHERE h.f_human_id = 5;
SET @@tidb_read_staleness = "-60";
SELECT * FROM t_human h WHERE h.f_human_id = 5;
SET @@tidb_read_staleness = "";
依次使用这4个指令,并不能得到历史数据。
这个预期是在这个范围内尽可能新的数据(可能是最新也可能是旧的),不是读指定历史时间点的数据,SET @@tidb_read_staleness = "-60" 语义上等同于:
SELECT * FROM TABLE test AS OF TIMESTAMP TIDB_BOUNDED_STALENESS(NOW() - INTERVAL 60 SECOND, NOW())
参考这里:https://docs.pingcap.com/zh/tidb/stable/as-of-timestamp#%E8%AF%AD%E6%B3%95%E6%96%B9%E5%BC%8F
那这个只能用于读取5秒前到现在的数据(有可能是最新的,也有可能是旧的),限定了结束时间是:现在,那...直接用SELECT就好了,没必要设置这个系统变量了。
然后,下边的示例在讲的是这样读到历史数据,我按照示例SQL操作,结果和示例不同,没能读到历史记录。
那这个只能用于读取
5秒前到现在的数据(有可能是最新的,也有可能是旧的),限定了结束时间是:现在,那...直接用SELECT就好了,没必要设置这个系统变量了。然后,下边的示例在讲的是这样读到历史数据,我按照示例SQL操作,结果和示例不同,没能读到历史记录。
嗯,这个例子没有表达出这个语义,需要换一个更合适的,能不能读到新的版本取决于同步的速度。这个 session variable 是为了解决一些历史读,但是有尽可能读到新一些的版本的场景。如果想要指定特定时间可以 AS OF 或者 tidb_snapshot 都可以。
这个例子真的让人看的很疑惑,而且最小规模部署也复现不出来例子。
所以,真的判断不是写反了? 历史 --- 十分钟前,写成了,十分钟前 --- 现在。
其实,我的真实需求是,如果有误操作,将数据回滚到历史的某一刻,我希望通过一个SQL来实现,而不是先读出来,再覆盖回去,tidb_read_staleness的功能介绍中,可以在当前会话进行插入修改数据的操作,这是我需要的。
UPDATE t_human t, (
SELECT
h.f_human_level
FROM
t_human h AS OF TIMESTAMP '2022-07-19 19:55:00'
WHERE
h.f_human_id = 5
) AS x
SET t.f_human_level = x.f_human_level
WHERE t.f_human_id = 5
目前AS OF是不支持直接UPDATE的,会报:GetForUpdateTS not supported for stalenessTxnProvider。
请问,有没有什么办法?