注册
达梦数据库闪回功能详解
专栏/培训园地/ 文章详情 /

达梦数据库闪回功能详解

四月十七 2024/10/17 411 1 0
摘要

一、闪回功能

闪回功能是利用UNDO 表空间里所记录的数据被改变前的值来恢复将数据回退到之前的功能。

(一)闪回功能的特点

1、闪回表支持批量闪回多个表;
2、闪回会保留所有现有的索引,且不会影响统计信息;
3、分区表需要有MOVEMENT 功能才能闪回;
4、闪回不能违反约束;
5、闪回功能不需要额外的操作系统空间和数据库空间;

(二)闪回功能的限制

1、数据库默认不开启闪回;
2、用户必须具有 FLASHBACK ANY TABLE 系统权限或 FLASHBACK 对象权限才能进行闪回操作;
3、闪回功能只能闪回到 UNDO_RETENTION 指定值范围内的时间点;
4、如果表结构发生了变化则无法使用闪回功能;
5、需要闪回的数据在UNDO表空间中被其他的记录所覆盖就无法还原;
6、不能对系统表、临时表、HUGE 表、内部辅助表、动态表等执行闪回表操作;
7、DMMPP功能不支持闪回功能;

(三)使用场景:

1、数据被误删除和修改,在短时间内可以通过闪回功能找回;
2、在测试超大表时,如果使用create table select * from table的方式创建备份表会造成数据文件空间的大量占用,可以使用闪回功能;
3、测试功能时会有多个时间节点有可能需要回滚的情况,比如根据某步测试结果有可能回滚到15分钟前,也有坑你需要回滚到10分钟前;
4、需要频繁回滚的操作,比如需要大量测试删除,插入功能的情况下;
5、在涉及多表复杂的情况,使用批量闪回比用备份更有效率;

二、开启闪回功能

1.查看闪回功能状态

闪回功能的开启受ENABLE_FLASHBACK参数影响,当ENABLE_FLASHBACK为0时,不开启闪回功能,当为1时开启闪回功能;
查看v$parameter可知闪回功能是否已开启:

select name,type,value from v$parameter where name='ENABLE_FLASHBACK';

image.png

2.开始闪回功能

开启闪回功能可以使用alter system命令来开启:

alter system set 'enable_flashback'=1 both;

image.png
注:该方法设置参数时,参数名必须加单引号。
或者使用SP_SET_PARA_VALUE 过程来开启

SP_SET_PARA_VALUE (1, 'ENABLE_FLASHBACK', 1);

image.png
再次查询v$parameter视图来检查闪回是否已开启
image.png

3.查看undo回滚段

回滚段默认每90秒种会自动清理,回滚段刷新时长受参数UNDO_RETENTION的影响,回滚段参数太小会导致闪回功能可闪回时长过短,回滚段参数太大容易引发回滚段膨胀;
通过v$parameter视图来查看

select name,type,value from v$parameter where name='UNDO_RETENTION';

image.png

通过alter system命令来修改UNDO_RETENTION值:

通过alter system命令来修改UNDO_RETENTION值:

image.png
通过查询v$parameter视图来检查UNDO_RETENTION值:
image.png

4.赋权闪回权限

使用闪回功能需要FLASHBACK TABLE权限,通过grant进行赋权:

create user "PAH" identified by ""; grant "PUBLIC","SOI" to "PAH"; grant FLASHBACK TABLE,FLASHBACK ANY TABLE to "PAH";

可以通过查询DBA_ROLE_PRIVS与DBA_SYS_PRIVS来查看:

SELECT * FROM DBA_ROLE_PRIVS WHERE GRANTEE='PAH'; SELECT * FROM DBA_SYS_PRIVS WHERE GRANTEE='PAH';

image.png

image.png
赋予FLASHBACK TABLE权限后可以使用pah用户进行闪回;

三、闪回表功能

1.创建测试表

create table FLASHBACK_TABLE ( "COLUMN_1" int, "COLUMN_2" CHAR(10), "COLUMN_3" CHAR(10), "COLUMN_4" date ); insert into FLASHBACK_TABLE VALUES (1,'三十三''四十四'2024-09-29); insert into FLASHBACK_TABLE VALUES (2,'五十五''六十六'2024-09-30); insert into FLASHBACK_TABLE VALUES (3,'七十七''八十八'2024-09-28); insert into FLASHBACK_TABLE VALUES (4,'九十九''百事百'2024-09-27); commit;

2.闪回表FLASHBACK LSN功能

首先查询数据库的 CUR_LSN。 CUR_LSN 是系统已经分配的最大 LSN 值。物理事务提交时,系统会为其分配一个唯一的 LSN 值,大小等于 CUR_LSN+1,然后再修改 CUR_LSN=CUR_LSN+1。可以把CUR_LSN理解成数据库自己独有的一种时间计算,每当事务提交时,时间往前进一个单位;

SELECT CUR_LSN FROM V$RLOG;

image.png

select * from FLASHBACK_TABLE; delete FLASHBACK_TABLE where COLUMN_1=1; commit; select * from FLASHBACK_TABLE;

image.png
image.png
使用闪回:

FLASHBACK TABLE FLASHBACK_TABLE TO LSN 45412; select * from FLASHBACK_TABLE;

image.png

3.闪回表FLASHBACK TIMESTAMP功能

查询现在时间

SELECT SYSDATE;

image.png
对测试表进行操作

select * from FLASHBACK_TABLE; delete FLASHBACK_TABLE where COLUMN_1=1; commit;

执行闪回操作:

FLASHBACK TABLE T TO TIMESTAMP '2024-10-02 10:26:31';

查询表数据:
image.png

4.多表闪回

多表同时闪回与单表闪回的使用方法、注意事项基本一致,是在单表闪回时TABLE关键字后加入多个表名;
创建第二测试表

create table FLASHBACK_TABLE2 ( "COLUMN_1" int, "COLUMN_2" CHAR(10), "COLUMN_3" CHAR(10), "COLUMN_4" date ); insert into FLASHBACK_TABLE2 VALUES (11,'杭州''灵隐寺'2024-09-29); insert into FLASHBACK_TABLE2 VALUES (22,'泰安''泰山'2024-09-30); insert into FLASHBACK_TABLE2 VALUES (33,'济南''达梦胡'2024-09-28); insert into FLASHBACK_TABLE2 VALUES (44,'北京''天安门'2024-09-27); commit;

查询当前LSN号

SELECT CUR_LSN FROM V$RLOG;

image.png
多测试表进行操作

delete from FLASHBACK_TABLE2 where COLUMN_1=11; delete from FLASHBACK_TABLE where COLUMN_1=1; commit;

查看现有数据

select * from FLASHBACK_TABLE union ALL select * from FLASHBACK_TABLE2;

image.png
两表同时闪回

FLASHBACK TABLE FLASHBACK_TABLE,FLASHBACK_TABLE2 TO LSN 45413;

image.png
重新查看现有数据,数据已恢复。

select * from FLASHBACK_TABLE union ALL select * from FLASHBACK_TABLE2;

image.png

四、闪回查询功能

闪回查询利用时间戳和LSN,使用undo日志,能够让用户检索到某一时刻的数据快照。
使用的语法与常规的SELECT语句类似,并且有两种表现形式一种是WHEN TIMESTAMP,一种是AS OF TIMESTAMP。同时闪回查询支持LSN查询和时间查询;

1.WHEN TIMESTAMP时间查询

SELECT * FROM FLASHBACK_TABLE WHEN TIMESTAMP '2024-10-02 10:26:31';

2.AS OF TIMESTAMP时间查询

与第一种查询效果相同

SELECT * FROM FLASHBACK_TABLE AS OF TIMESTAMP '2024-10-02 10:26:31';

3.AS OF LSN

SELECT * FROM FLASHBACK_TABLE AS OF LSN 85233;

4.AS OF SCN

与第三种方法效果相同

SELECT * FROMFLASHBACK_TABLE AS OF SCN 85233;

5.注意事项与使用场景

1、在使用AS OF闪回查询时,SCN关键字和LSN关键字效果是一样的。
2、通常情况在同一表处于业务正常使用中时,因为表的数据一直被不同的用户在修改,所以当操作员误操作之后可以通过闪回查询的方式只查询到操作员自己修改的记录,并反向还原,比如删除的重新插入,更新成修改之前的数据;
3、使用闪回查询时,WHEN关键词要在WHERE关键词前,例如:

SELECT * FLASHBACK_TABLE2 WHEN TIMESTAMP '2024-10-02 11:32:52' WHERE COLUMN_1=11 ; SELECT * FROM FLASHBACK_TABLE AS OF LSN 47529 WHERE COLUMN_1=11 ;

五、伪列闪回操作查询

伪列闪回是通过伪列关键词来配合闪回查询的方式,有与时间有关的VERSIONS_STARTTIME起始时间戳,VERSIONS_ENDTIME提交时间戳,有与SCN有关的VERSIONS_STARTSCN起始SCN,VERSIONS_ENDSCN提交SCN。最常用的是操作伪列VERSIONS_OPERATION

1.创建测试表

drop table FLASHBACK_TABLE2; create table FLASHBACK_TABLE2 ( "COLUMN_1" int, "COLUMN_2" CHAR(10), "COLUMN_3" CHAR(10), "COLUMN_4" date ); insert into FLASHBACK_TABLE2 VALUES (11,'杭州''灵隐寺'2024-09-29); insert into FLASHBACK_TABLE2 VALUES (22,'泰安''泰山'2024-09-30); insert into FLASHBACK_TABLE2 VALUES (33,'济南''达梦胡'2024-09-28); insert into FLASHBACK_TABLE2 VALUES (44,'北京''天安门'2024-09-27); commit;

查询当前时间

SELECT SYSDATE;

image.png
对测试表进行修改

DELETE FLASHBACK_TABLE2 WHERE COLUMN_1=11; insert into FLASHBACK_TABLE2 VALUES (55,'杭州''西湖'2024-09-27); update FLASHBACK_TABLE2 set COLUMN_3='大明湖'; commit;

查看当前表数据

SELECT * FROM FLASHBACK_TABLE2;

image.png

2.伪列闪回操作查询

SELECT *,VERSIONS_OPERATION FROM FLASHBACK_TABLE2 WHEN TIMESTAMP '2024-10-02 11:32:52' ;

image.png

SELECT * FROM FLASHBACK_TABLE2 WHEN TIMESTAMP '2024-10-02 11:50:00' WHERE VERSIONS_OPERATION='D';

image.png
VERSIONS_OPERATION是闪回中独有的一个伪列,表示在行上的操作。有三种情况:I 表示 Insert、D 表示 Delete、U 表示 Update。
伪列是特殊的列,可以在查询中使用但不实际存储在表中,使用方法与处理普通列相同,但无法修改。

六、伪列闪回版本查询

闪回版本查询,是使用伪列VERSIONS来查询在某一时间段中的操作,VERSIONS是一个时间字段使用BETWEEN AND关键字来查询。

1.创建测试表

drop table FLASHBACK_TABLE2; create table FLASHBACK_TABLE2 ( "COLUMN_1" int, "COLUMN_2" CHAR(10), "COLUMN_3" CHAR(10), "COLUMN_4" date ); insert into FLASHBACK_TABLE2 VALUES (11,'杭州''灵隐寺'2024-09-29); insert into FLASHBACK_TABLE2 VALUES (22,'泰安''泰山'2024-09-30); insert into FLASHBACK_TABLE2 VALUES (33,'济南''达梦胡'2024-09-28); insert into FLASHBACK_TABLE2 VALUES (44,'北京''天安门'2024-09-27); commit;

查询当前时间

SELECT SYSDATE;

image.png
对测试表进行修改

DELETE FLASHBACK_TABLE2 WHERE COLUMN_1=11; insert into FLASHBACK_TABLE2 VALUES (55,'杭州''西湖'2024-09-27); update FLASHBACK_TABLE2 set COLUMN_3='大明湖' WHERE COLUMN_1=33 ; commit;

查看当前表数据

SELECT * FROM FLASHBACK_TABLE2;

image.png

2.闪回版本查询

SELECT VERSIONS_STARTSCN, VERSIONS_ENDSCN, * FROM FLASHBACK_TABLE2 VERSIONS BETWEEN TIMESTAMP '2024-10-02 12:06:01' AND SYSDATE;

image.png
通过闪回版本查询可以查询出在具体时间段中被修改的表的记录

七、闪回事务查询

闪回事务被记录在系统视图 V$FLASHBACK_TRX_INFO 中,可以供用户查看在事务级对数据库所做的更改。
如果在上述例子过程中查询V$FLASHBACK_TRX_INFO视图,可以得到以下内容。

select * from V$FLASHBACK_TRX_INFO;

image.png
常使用的列名有表名TABLE_NAME,表所有者TABLE_OWNER,执行的语句UNDO_SQL和提交时间COMMIT_TIMESTAMP。还有操作类型OPERATION;
V$FLASHBACK_TRX_INFO中的操作类型比闪回操作查询中的OPERATION类型要多:D:删除;U:修改;I:插入;N:更新插入(专门针对 CLUSTER PRIMARY KEY 的插入); C:事务提交;P:预提交记录;O:default;
注意事项:删除表与创建表在V$FLASHBACK_TRX_INFO也会显示在里面,但是除了START_TRXID和OPERATION外没有其他值,这有可能是个BUG;
image.png

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服