Time:2025/08/12
Author:skatexg
一、環境說明
DM數據庫:DM8.0及以上版本
二、適用場景
研發在誤操作或變更數據后,想馬上恢復表到某個時間點,可以通過閃回查詢功能快速實現(通過全量備份恢復時間長,成本高)
三、說明
- 閃回查詢只支持普通表(包括加密表與壓縮表)、水平分區表和堆表,不支持臨時表、列存儲表、外部表與視圖;
- 閃回查詢利用的是 UNDO 表空間里所記錄的數據被改變前的值。因此,如果因保留時間超過了初始化參數 UNDO_RETENTION 所指定的值,從而導致閃回查詢時所需要的 UNDO 數據被其他事務覆蓋的話,那么就不能將表中數據恢復到指定的時間了
- 數據守護環境下,備庫不支持閃回查詢
四、閃回查詢開啟與關閉
查詢閃回功能狀態,數據庫默認關閉?(0-關閉,1-打開),通過如下語句查詢開啟狀態
SELECT name,
TYPE,
VALUE,
sys_value,
file_value
FROM v$parameter
WHERE name LIKE '%FLASHBACK%';
輸出結果:
開啟閃回查詢
SP_SET_PARA_VALUE (1, 'ENABLE_FLASHBACK', 1);--無需重啟服務器
--scope 為 1 表示 dm.ini 文件和內存參數都修改,不需要重啟服務器;--scope 為 2 表示只修改 dm.ini 文件,服務器重啟后生效。
--value: 設置的值。
關閉閃回查詢
SP_SET_PARA_VALUE (1, 'ENABLE_FLASHBACK', 0);----無需重啟服務器
配置可閃回數據保留時間
由于回滾段默認每秒種都會自動清理,所以需要延長回滾記錄的保留時間,單位是秒。回滾段參數太大容易引發回滾段膨脹,這里設置為 3600s。示例語句如下所示:
ALTER SYSTEM SET 'undo_retention'=3600 BOTH;
SELECT name,
TYPE,
VALUE,
sys_value,
file_value
FROM v$parameter
WHERE name = 'UNDO_RETENTION';
輸出結果:
五、數據閃回查詢
通過指定一個時間(timestamp 類型),用一個日期時間字符串表達。使用 test_zxg 模式下的 tab_1 表。測試如下:
-1)切換schema
set schema "test_zxg"
2)查詢 tab_1 表中的信息
SELECT * FROM tab_1 where id =1;
3)更新 id = 1,更新時間為 '2025-08-12 16:42:00'
UPDATE tab_1 set name='cccccc' where id =1;
4)再次查詢 id = 1 時表中的信息
SELECT * FROM tab_1 where id =1;
4)閃回查詢 update 操作前表中的信息
SELECT * FROM tab_1 WHEN TIMESTAMP '2025-08-12 16:40:00' where id =1
六、數據恢復
為安全起見,先把閃回查詢的數據保存到臨時表,后續在根據業務邏輯,研發按需恢復
CREATE table tab_bak20208121650 as SELECT * FROM tab_1 WHEN TIMESTAMP '2025-08-12 15:40:00'
另:數據變更前的備份方法
1、在dml某表數據前,如果表行數不多(10萬以內)可以先備份表,然后再做表變更
CREATE table tab_bak20208121650 as SELECT * FROM tab_1 where id
注意:數據閃回功能達夢工程師建議繁忙的生產環境關閉閃回,可能影響性能
----end----