☰
达梦数据库闪回/回收站
2026/10/14 8:29:27 网站建设 项目流程

数据闪回,要满足以下几个条件,开启闪回和设置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

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询