閃回查詢
通過閃回查詢(Flashback Query)功能,您可以高效查詢集群、數(shù)據(jù)庫、數(shù)據(jù)表在過去某個時間點的信息。
前提條件
PolarDB集群版本需滿足如下條件之一:
PolarDB MySQL版8.0.2版本且修訂版本為8.0.2.2.2及以上
PolarDB MySQL版8.0.1版本且修訂版本為8.0.1.1.24及以上
PolarDB MySQL版5.7版本且修訂版本為5.7.1.0.21及以上
PolarDB MySQL版5.6版本且修訂版本為5.6.1.0.32及以上
如何確認集群版本,詳情請參見查詢版本號。
閃回查詢功能需要開啟 innodb_backquery_enable參數(shù),該參數(shù)默認關(guān)閉。使用該功能前,您需要在PolarDB集群的參數(shù)配置中先開啟 innodb_backquery_enable參數(shù)。
說明如果您在開啟 innodb_backquery_enable參數(shù)之前執(zhí)行閃回查詢,系統(tǒng)會返回報錯
ERROR 1815 (HY000): Internal error: the backquery_time set is out of range, too old
。
注意事項
推薦在單表場景中使用閃回查詢,不推薦在復雜查詢場景下(如JOIN、子查詢)使用閃回查詢。
推薦使用主鍵來進行閃回查詢,目前不支持使用二級索引來進行閃回查詢。若使用二級索引來進行閃回查詢,會轉(zhuǎn)換為全表掃描,查詢性能會比較慢。
由于Undo日志保留了部分歷史差值數(shù)據(jù),在配置的
innodb_backquery_window
時間窗口內(nèi),打開閃回查詢功能會使得Undo表空間增長。除此之外,在BLOB場景下也可能會存在表空間增長的情況,且在表空間增長的過程中,寫入性能會略有下降。單條記錄的歷史版本上限是10萬次。超過該上限后,若閃回查詢該記錄,系統(tǒng)將會報錯
record undo history version exceed limit
。在執(zhí)行DDL操作后,之前的數(shù)據(jù)不能進行閃回查詢,若閃回查詢DDL之前的數(shù)據(jù),系統(tǒng)可能會報錯
Backquery primary key invisible
。開啟閃回查詢功能前刪除表,無法通過閃回查詢功能查看。開啟閃回查詢功能后刪除表,可以通過閃回查詢功能查看。
語法說明
單表閃回查詢語法
SELECT column_name_list FROM table_name AS OF TIMESTAMP time_expr alias WHERE...;
多表閃回查詢語法
SELECT column_name_list FROM table1_name AS OF TIMESTAMP time_expr alias1,table2_name AS OF TIMESTAMP time_expr alias2 WHERE... ;
多表JOIN閃回查詢語法
SELECT column_name_list FROM table1_name AS OF TIMESTAMP time_expr alias1 JOIN table2_name AS OF TIMESTAMP time_expr alias2 ON join_cond1 JOIN table3_name AS OF TIMESTAMP time_expr alias3 ON join_cond2 WHERE...;
語法中涉及的參數(shù)說明如下:
參數(shù)名稱 | 是否必選 | 參數(shù)說明 |
column_name_list | 是 | 查詢的列名。 |
table_name table1_name table2_name table3_name | 是 | 表名。 |
time_expr | 是 | 閃回的時間戳,為時間字符串或者其他時間函數(shù),僅支持常量表達式,不能包含列名。示例如下:
|
alias alias1 alias2 alias3 | 否 | 表的別名。 |
join_cond1 join_cond2 | 是 | JOIN條件。 |
參數(shù)說明
PolarDB提供了以下參數(shù)來更精確地控制閃回功能:
參數(shù)名稱 | 數(shù)據(jù)類型 | 說明 |
loose_innodb_backquery_enable | BOOL | 打開或者關(guān)閉閃回查詢功能。取值:
|
loose_innodb_backquery_window | ULONG | 閃回查詢支持的時間長度。
|
loose_innodb_backquery_capacity_limit | ULONG | 閃回查詢支持的undo日志容量。當undo日志容量大于或等于該值時,將會縮短閃回查詢支持的時間長度。
|
示例
以單表閃回為例。
準備測試數(shù)據(jù):
在
2021-08-31 13:51
創(chuàng)建products
表,并插入數(shù)據(jù)。create table products ( prod_id bigint(10) primary key NOT NULL, prod_name varchar(20) NOT NULL, cust_id bigint(10) NULL, createtime datetime NOT NULL DEFAULT NOW() ); INSERT INTO products(prod_id,prod_name,cust_id,createtime) values (101,'Book',1,NOW()),(102,'Apple',1,NOW()),(103,'Beef',2,NOW()),(104,'Bread',3,NOW()),(105,'Cheese',4,NOW());
查詢
products
表中的數(shù)據(jù):SELECT * FROM products; +---------+-----------+---------+---------------------+ | prod_id | prod_name | cust_id | createtime | +---------+-----------+---------+---------------------+ | 101 | Book | 1 | 2021-08-31 13:51:22 | | 102 | Apple | 1 | 2021-08-31 13:51:24 | | 103 | Beef | 2 | 2021-08-31 13:51:26 | | 104 | Bread | 3 | 2021-08-31 13:51:27 | | 105 | Cheese | 4 | 2021-08-31 13:51:29 | +---------+-----------+---------+---------------------+ 5 rows in set (0.00 sec)
更新測試數(shù)據(jù):
在
2021-08-31 14:18
對products
表數(shù)據(jù)進行了更新。UPDATE products SET prod_id = 110, createtime = NOW() WHERE prod_name = "Book"; UPDATE products SET prod_id = 119, createtime = NOW() WHERE prod_name = "Apple"; SELECT * FROM products; +---------+-----------+---------+---------------------+ | prod_id | prod_name | cust_id | createtime | +---------+-----------+---------+---------------------+ | 103 | Beef | 2 | 2021-08-31 13:51:26 | | 104 | Bread | 3 | 2021-08-31 13:51:27 | | 105 | Cheese | 4 | 2021-08-31 13:51:29 | | 110 | Book | 1 | 2021-08-31 14:18:21 | | 119 | Apple | 1 | 2021-08-31 14:18:22 | +---------+-----------+---------+---------------------+ 5 rows in set (0.00 sec)
執(zhí)行閃回查詢:
查看
products
表中2021-08-31 14:00:00
這個歷史時間點的數(shù)據(jù)。SELECT * FROM products AS of TIMESTAMP '2021-08-31 14:00:00'; +---------+-----------+---------+---------------------+ | prod_id | prod_name | cust_id | createtime | +---------+-----------+---------+---------------------+ | 101 | Book | 1 | 2021-08-31 13:51:22 | | 102 | Apple | 1 | 2021-08-31 13:51:24 | | 103 | Beef | 2 | 2021-08-31 13:51:26 | | 104 | Bread | 3 | 2021-08-31 13:51:27 | | 105 | Cheese | 4 | 2021-08-31 13:51:29 | +---------+-----------+---------+---------------------+ 5 rows in set (0.00 sec)