产品概述
应用场景
产品架构
实例类型
兼容性说明
UPDATE 或 DELETE 了错误的数据)时,可以通过查询误操作发生前的时间点,快速找回历史数据,极大地简化了数据恢复流程。TDSQL Boundless 提供了语句级别的闪回查询功能。last_insert_id() 等无实际列对应的函数Can't stale read from the future)。SELECT FOR UPDATE、FOR SHARE、LOCK IN SHARE MODE等锁定查询;不支持 INSERT...SELECT 语句;不支持 BEGIN; SELECT... 语法。advance-global-earliest-snapshot-delay 控制。启用闪回功能会延迟 GES 推进,可能增加存储占用和查询耗时。-- 启用闪回查询功能SET persist tdsql_enable_stale_read = ON;
AS OF语法,查询指定时间点的数据。SELECT ... FROM <table_name> [ AS OF {TIMESTAMP timestamp_option | GTS gts_option} ]
get_date的表达式,都可以作为timestamp_option,包括但不限于:'2023-09-05 12:00:00'NOW(), SYSDATE(), UTC_TIMESTAMP()SELECT NOW() INTO @time1NOW + INTERVAL 1 SECOND,@time1 - INTERVAL 1 YEARgts_option,包括但不限于:29610460101738510((UNIX_TIMESTAMP(@time1) << 24) | 0xFFFFFF)@gts1-- 创建测试表CREATE TABLE t1(a INT PRIMARY KEY, b INT);SELECT sleep(3);-- 记录初始时间点SELECT NOW() INTO @time0;SELECT ((UNIX_TIMESTAMP(@time0) << 24) | 0xFFFFFF) INTO @gts0;SELECT sleep(3);-- 插入测试数据INSERT INTO t1 VALUES(1,1),(2,2),(3,3),(4,4),(5,5),(6,1),(7,2),(8,3),(9,4),(10,5);SELECT sleep(3);-- 记录数据插入后时间点SELECT NOW() INTO @time1;SELECT ((UNIX_TIMESTAMP(@time1) << 24) | 0xFFFFFF) INTO @gts1;SELECT sleep(3);-- 更新数据UPDATE t1 SET b=b*10;-- 当前数据查询SELECT * FROM t1 ORDER BY a;a»b1»102»203»304»405»506»107»208»309»4010»■50-- 闪回查询到初始状态(空表)SELECT * FROM t1 ORDER BY a AS OF TIMESTAMP @time0;a»bSELECT * FROM t1 ORDER BY a AS OF GTS @gts0;a»b-- 闪回查询到插入数据后的状态SELECT * FROM t1 ORDER BY a AS OF TIMESTAMP @time1;a»b1»12»23»34»45»56»17»28»39»410»■5SELECT * FROM t1 ORDER BY a AS OF GTS @gts1;a»b1»12»23»34»45»56»17»28»39»410»■5
-- 0:Leader节点,1:Follower节点SET persist tdsql_stale_read_role=1;
tdsql_read_staleness_t,支持会话级别和事务级别的查询。--查询当前数据+----+-----+| id | num |+----+-----+| 1 | 10 || 2 | 20 || 3 | 30 || 4 | 40 |+----+-----+set tdsql_read_staleness_t='-10'; #读取10秒前的数据--插入新的数据insert into t1 values (5,50);--查看当前时间select now();+---------------------+| now() |+---------------------+| 2025-02-16 17:57:50 |+---------------------+--查询当前数据select * from t1; # 返回历史数据+----+-----+| id | num |+----+-----+| 1 | 10 || 2 | 20 || 3 | 30 || 4 | 40 |+----+-----+--等待一段时间--查看当前时间select now();+---------------------+| now() |+---------------------+| 2025-02-16 17:58:01 |+---------------------+--再次查询当前数据select * from t1; # 返回新数据+----+-----+| id | num |+----+-----+| 1 | 10 || 2 | 20 || 3 | 30 || 4 | 40 || 5 | 50 |+----+-----+
tdsql_read_staleness_t后,还可以开始事务查询数据。--查询当前数据select * from t1;+----+-----+| id | num |+----+-----+| 1 | 10 || 2 | 20 || 3 | 30 || 4 | 40 || 5 | 50 |+----+-----+--插入新的数据insert into t1 values (6,60);--开启事务begin;select * from t1; # 返回历史数据+----+-----+| id | num |+----+-----+| 1 | 10 || 2 | 20 || 3 | 30 || 4 | 40 || 5 | 50 |+----+-----+select sum(num) as total_num from t1;+-----------+| total_num |+-----------+| 150 |+-----------+rollback;--等待一段时间--开启事务begin;select * from t1; # 返回新数据+----+-----+| id | num |+----+-----+| 1 | 10 || 2 | 20 || 3 | 30 || 4 | 40 || 5 | 50 || 6 | 60 |+----+-----+select sum(num) as total_num from t1;+-----------+| total_num |+-----------+| 210 |+-----------+rollback;
参数名 | 参数范围 | 类型 | 默认值 | 取值范围 | 是否需重启 | 说明 |
tdsql_enable_stale_read | GLOBAL | Boolean | ON | ON/OFF | 否 | 闪回查询功能的开关。 |
advance-global-earliest-snapshot-delay | GLOBAL | Integer | 10 | 0~43200 | 否 | MC 一侧用于调控闪回查询的可查询的时间范围,单位:秒。 此参数的值越大,闪回查询支持的历史数据查询时间越长,同时占用的存储空间和查询时长也可能增加。 |
tdsql_stale_read_role | GLOBAL | UINT | 0 | 0/1 | 否 | 设置 Stale Read 路由访问的副本。 0:表示 Leader 节点。 1:表示 Follower 节点。 |
tdsql_read_staleness_t | SESSION | CHAR | '' | - | 否 | 设置 Stale Read 数据陈旧时间。示例: set session tdsql_read_staleness_t='-3' 开启 Stale Read staleness 模式,读取数据的时间为当前物理时间前3秒。 注意: set session tdsql_read_staleness_t=''(空字符)表示关闭 Stale Read staleness 模式。 |
文档反馈