声明:仅供技术参考非官方专业指导,如操作导致数据问题概不负责!!!
1、概念
闪回技术,就是为了用户可以迅速处理数据逻辑损坏的情况而产生的。开启闪回功能后,DM 会在内存中记录下每个事务的起始时间和提交时间。通过用户指定的时刻,查询到该时刻的事务号,结合当前记录和回滚段中的 UNDO 记录,就可以还原出特定事务号的记录。即指定时刻的记录状态。从而完成闪回查询。闪回查询功能完全依赖于回滚段管理,对于 DROP 等误操作不能恢复。
2、原理
闪回技术主要是通过回滚段存储的 UNDO 记录来完成历史记录的还原。
3、试验步骤
①、开启闪回及修改UNDO的保留时间
达梦数据库默认是不开启闪回功能的,查询闪回是否开启,1为开启,0为关闭
SQL> select para_name,para_value from v$dm_ini where para_name='ENABLE_FLASHBACK';
行号 PARA_NAME PARA_VALUE
---------- ---------------- ----------
1 ENABLE_FLASHBACK 0
已用时间: 4.498(毫秒). 执行号:54600
SQL> SP_SET_PARA_VALUE(1,'ENABLE_FLASHBACK',1);
DMSQL 过程已成功完成
已用时间: 15.343(毫秒). 执行号:54601.
SQL> select para_name,para_value from v$dm_ini where para_name='ENABLE_FLASHBACK';
行号 PARA_NAME PARA_VALUE
---------- ---------------- ----------
1 ENABLE_FLASHBACK 1
已用时间: 2.789(毫秒). 执行号:54602.
②、查询UNDO的保留时间并做修改
SQL> select para_name,para_value from v$dm_ini where para_name='UNDO_RETENTION';
行号 PARA_NAME PARA_VALUE
---------- -------------- ----------
1 UNDO_RETENTION 90.000000
SQL> SP_SET_PARA_DOUBLE_VALUE(1,'UNDO_RETENTION',1800);
DMSQL 过程已成功完成
已用时间: 14.577(毫秒). 执行号:54610.
SQL> select para_name,para_value from v$dm_ini where para_name='UNDO_RETENTION';
行号 PARA_NAME PARA_VALUE
---------- -------------- -----------
1 UNDO_RETENTION 1800.000000
已用时间: 3.107(毫秒). 执行号:54611.
③、
SQL> INSERT INTO T1 VALUES(1,'AAA1');
SQL> INSERT INTO T1 VALUES(2,'AAA2');
SQL> INSERT INTO T1 VALUES(3,'AAA3');
SQL> INSERT INTO T1 VALUES(4,'AAA3');
SQL> COMMIT;
操作已执行
已用时间: 2.530(毫秒). 执行号:54619.
SQL> SELECT * FROM T1;
行号 ID NAME
---------- ----------- --------------------
1 1 AAA1
2 2 AAA2
3 3 AAA3
4 4 AAA3
已用时间: 0.604(毫秒). 执行号:54620.
SQL> SELECT SYSDATE;
行号 SYSDATE
---------- -------------------
1 2022-10-17 15:52:52
已用时间: 0.261(毫秒). 执行号:54621.
SQL> INSERT INTO T1 VALUES(5,'AAA5');
SQL> INSERT INTO T1 VALUES(6,'AAA6');
SQL> COMMIT;
SQL> SELECT * FROM T1;
行号 ID NAME
---------- ----------- --------------------
1 1 AAA1
2 2 AAA2
3 3 AAA3
4 4 AAA3
5 5 AAA5
6 6 AAA6
6 rows got
已用时间: 0.407(毫秒). 执行号:54625.
SQL> SELECT VERSIONS_ENDTRXID, NAME FROM T1 VERSIONS BETWEEN TIMESTAMP '2022-10-17 15:52:52' AND SYSDATE;
行号 VERSIONS_ENDTRXID NAME
---------- -------------------- --------------------
1 NULL AAA1
2 NULL AAA2
3 NULL AAA3
4 NULL AAA3
5 NULL AAA5
6 NULL AAA6
6 rows got
已用时间: 0.638(毫秒). 执行号:54626.
SQL> DELETE FROM T1 WHERE ID=5;
SQL> COMMIT;
操作已执行
已用时间: 2.509(毫秒). 执行号:54628.
SQL> SELECT VERSIONS_ENDTRXID, NAME FROM T1 VERSIONS BETWEEN TIMESTAMP '2022-10-17 15:52:52' AND SYSDATE;
行号 VERSIONS_ENDTRXID NAME
---------- -------------------- --------------------
1 NULL AAA1
2 NULL AAA2
3 NULL AAA3
4 NULL AAA3
5 NULL AAA5
6 NULL AAA6
7 3624 AAA5
7 rows got
已用时间: 0.547(毫秒). 执行号:54629.
通过操作时间及闪回版本查询,被删除的数据已经找到。
SQL>SELECT VERSIONS_ENDTRXID, NAME,* FROM T1 VERSIONS BETWEEN TIMESTAMP '2022-10-17 15:52:52' AND SYSDATE;