数据闪回,要满足以下几个条件,开启闪回和设置undo保留的时间,闪回利用undo表空间里的记录修改前的数据(对应ROLL.DBF),如果一个表期间做了DDL操作,该表不能恢复DDL操作之前的数据
1.数据闪回
1.1查看roll大小
SQL> SELECT
TABLESPACE_NAME AS 表空间名,
ROUND(SUM(BYTES)/1024/1024, 2) AS 总大小MB,
COUNT(FILE_NAME) AS 文件个数
FROM DBA_DATA_FILES
WHERE TABLESPACE_NAME = 'ROLL'
GROUP BY TABLESPACE_NAME; 2 3 4 5 6 7
行号 表空间名 总大小MB 文件个数
---------- ------------ ----------- --------------------
1 ROLL 128 1
已用时间: 21.687(毫秒). 执行号:1105.
SQL> SELECT
df.tablespace_name AS "表空间名",
ROUND(df.bytes/1024/1024, 2) AS "总大小(MB)",
ROUND((df.bytes - fs.bytes)/1024/1024, 2) AS "已用(MB)",
ROUND(fs.bytes/1024/1024, 2) AS "剩余(MB)",
ROUND(100*(df.bytes - fs.bytes)/df.bytes) AS "使用率(%)"
FROM
(SELECT tablespace_name, SUM(bytes) bytes
FROM dba_data_files GROUP BY tablespace_name) df,
(SELECT tablespace_name, SUM(bytes) bytes
FROM dba_free_space GROUP BY tablespace_name) fs
WHERE
df.tablespace_name = fs.tablespace_name
AND df.tablespace_name = 'ROLL';
行号 表空间名 总大小(MB) 已用(MB) 剩余(MB) 使用率(%)
---------- ------------ ------------- ---------- ---------- ------------
1 ROLL 128 47 81 37
1.2开启闪回
SQL> ALTER SYSTEM SET 'ENABLE_FLASHBACK'=1;
SQL> select *from V$PARAMETER WHERE NAME='ENABLE_FLASHBACK';
1.3设置保留时间
UNDO_RETENTION 默认时间90秒
SQL> ALTER SYSTEM SET 'UNDO_RETENTION' = 3600 BOTH;
SQL> select * from V$PARAMETER WHERE NAME='UNDO_RETENTION';
行号 ID NAME TYPE VALUE SYS_VALUE FILE_VALUE
---------- ----------- -------------- ---- ----------- ----------- -----------
DESCRIPTION DEFAULT_VALUE ISDEFAULT
---------------------------------------------------------------------------------------- ------------- -----------
1 445 UNDO_RETENTION SYS 3600.000000 3600.000000 3600.000000
Maximum retention time in seconds for undo pages since relative transaction is committed 90.000000 0
2.闪回恢复
2.1通过LSN恢复
创建测试数据
SQL> CREATE TABLE T(C1 INT);
SQL> INSERT INTO T SELECT LEVEL CONNECT BY LEVEL < 4;
SQL> COMMIT;
SQL> SELECT * FROM T;
行号 C1
---------- -----------
1 1
2 2
3 3
记录当前lsn号
SQL> SELECT CUR_LSN FROM V$RLOG;
行号 CUR_LSN
---------- --------------------
1 282263
删除对应数据插入新数据4
SQL> DELETE FROM T WHERE C1=3;
SQL> INSERT INTO T VALUES(4);
SQL> COMMIT;
SQL> SELECT * FROM T;
行号 C1
---------- -----------
1 1
2 2
3 4
恢复至查询的lsn时的数据
SQL> FLASHBACK TABLE T TO LSN 282263;
SQL> select * from T;
行号 C1
---------- -----------
1 1
2 2
3 3
2.2通过时间恢复
创建测试数据
SQL> CREATE TABLE T(C1 INT);
SQL> INSERT INTO T SELECT LEVEL CONNECT BY LEVEL < 4;
SQL> COMMIT;
SQL> SELECT * FROM T;
行号 C1
---------- -----------
1 1
2 2
3 3
记录下当前的时间
SQL> select now();
行号 NOW()
---------- --------------------------
1 2026-10-12 14:19:54.865842
删除后插入一条新数据4
SQL> DELETE FROM T WHERE C1=3;
SQL> INSERT INTO T VALUES(4);
SQL> COMMIT;
SQL> SELECT * FROM T;
行号 C1
---------- -----------
1 1
2 2
3 4
数据库恢复至 2026-10-12 14:19:54
SQL> FLASHBACK TABLE T TO TIMESTAMP '2026-10-12 14:19:54';
SQL> SELECT * FROM T;
行号 C1
---------- -----------
1 1
2 2
3 3
2.3恢复至临时表
不管是2.1和2.2方式恢复, 通过lsn或者时间点恢复方式,恢复至lsn和时间点之后的新数据就不存在,可以使用以下方式恢复至临时表,不影响现有生产数据表,以下为时间点为例,LSN方式一样
创建测试数据
SQL> CREATE TABLE T(C1 INT);
SQL> INSERT INTO T SELECT LEVEL CONNECT BY LEVEL < 4;
SQL> COMMIT;
SQL> SELECT * FROM T;
行号 C1
---------- -----------
1 1
2 2
3 3
记录下当前的时间
SQL> select now();
行号 NOW()
---------- --------------------------
1 2026-10-12 14:24:03.432962
已用时间: 4.885(毫秒). 执行号:1140.
删除数据插入一条新数据4
SQL> DELETE FROM T WHERE C1=3;
SQL> INSERT INTO T VALUES(4);
SQL> COMMIT;
SQL> SELECT * FROM T;
行号 C1
---------- -----------
1 1
2 2
3 4
数据恢复至临时表T_temp
SQL> CREATE TABLE T_temp AS SELECT * FROM T AS OF TIMESTAMP '2026-10-12 14:24:03';
数据查询
数据恢复到了T_temp临时表,对于现有的生产表T数据不影响(新插入的4),根据需求在将T_temp临时表需要的数据恢复至生产表T
2.4闪回期间DDL操作
如果一个表期间有DDL操作,期间表不能做闪回数据恢复
创建测试数据
SQL> CREATE TABLE T(C1 INT);
SQL> INSERT INTO T SELECT LEVEL CONNECT BY LEVEL < 4;
SQL> COMMIT;
SQL> SELECT * FROM T;
行号 C1
---------- -----------
1 1
2 2
3 3
记录下当前的时间
SQL> select now();
行号 NOW()
---------- --------------------------
1 2026-10-12 14:28:49.721054
删除数据和插入新数据
SQL> DELETE FROM T WHERE C1=3;
SQL> INSERT INTO T VALUES(4);
SQL> COMMIT;
SQL> SELECT * FROM T;
行号 C1
---------- -----------
1 1
2 2
3 4
期间表做DDL操作
SQL> ALTER TABLE T ADD C2 INT;
数据恢复会报错
SQL>FLASHBACK TABLE T TO TIMESTAMP '2026-10-12 14:28:49';
第1 行附近出现错误[-7009]:对象定义被修改.
已用时间: 2.882(毫秒). 执行号:0.
3.回收站
恢复drop和truncate表
3.1开启回收站
SQL> SELECT * FROM V$PARAMETER WHERE NAME='RECYCLEBIN';
行号 ID NAME TYPE VALUE SYS_VALUE FILE_VALUE DESCRIPTION DEFAULT_VALUE ISDEFAULT
---------- ----------- ---------- ------- ----- --------- ---------- ----------------------------- ------------- -----------
1 941 RECYCLEBIN IN FILE 2 2 2 Whether to enable recycle bin 0 0
RECYCLEBIN=1(回收站只保留drop表)
RECYCLEBIN=2(回收站drop和truncate)
SQL> ALTER SYSTEM SET 'RECYCLEBIN' =2 SPFILE;
重启数据库后生效
3.2设置回收站保留时间
SQL> ALTER SYSTEM SET 'RECYCLEBIN_RETENTION' = 3600 SPFILE;
RECYCLEBIN_RETENTION 0表示永久保留
重启数据库后生效
3.3恢复drop
创建数据
SQL> CREATE TABLE T(C1 INT);
SQL> INSERT INTO T SELECT LEVEL CONNECT BY LEVEL < 4;
SQL> COMMIT;
SQL> SELECT * FROM T;
行号 C1
---------- -----------
1 1
2 2
3 3
删除表T
SQL> drop table T;
回收站查看
SQL> SELECT *FROM DBA_RECYCLEBIN ;
行号 OWNER OBJECT_NAME ORIGINAL_NAME OPERATION TYPE TS_NAME CREATETIME DROPTIME PARTITION_NAME BASE_OBJECT
---------- ------ ----------- ------------- --------- ----- ------- ------------------- ------------------- -------------- -----------
1 SYSDBA BIN$1277$0 T DROP TABLE MAIN 2026-10-12:14:35:53 2026-10-12:14:36:07 NULL 1277
3.3.1恢复至原表
SQL> FLASHBACK TABLE T TO BEFORE DROP;
3.3.2恢复成另外表名
SQL> FLASHBACK TABLE T TO BEFORE DROP RENAME TO T100;
SQL> select * from T100;
行号 C1
---------- -----------
1 1
2 2
3 3
3.4恢复truncate
truncate不能直接将恢复的表进行重命名
SQL> truncate table T;
SQL> SELECT *FROM DBA_RECYCLEBIN ;
行号 OWNER OBJECT_NAME ORIGINAL_NAME OPERATION TYPE TS_NAME CREATETIME DROPTIME PARTITION_NAME BASE_OBJECT
---------- ------ ----------- ------------- --------- ----- ------- ------------------- ------------------- -------------- -----------
1 SYSDBA BIN$1279$0 T TRUNCATE TABLE MAIN 2026-10-12:14:41:56 2026-10-12:14:41:56 NULL 1279
SQL> FLASHBACK TABLE T TO BEFORE TRUNCATE;
SQL> select * from T;
行号 C1
---------- -----------
1 1
2 2
3 3
4.回收站清理
drop和truncate后表在回收站,并不会释放表占用的空间还给操作系统
当前登录的用户清理对应用户的回收站
PURGE RECYCLEBIN;
整个数据库的回收站清理,需要sysdba权限
PURGE DBA_RECYCLEBIN;
清理特定的表
PURGE TABLE 表名;
精确清理回收站某个对象
PURGE TABLE "BIN$...";
更多资讯请上达梦技术社区了解:https://eco.dameng.com