闪回功能是利用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、在涉及多表复杂的情况,使用批量闪回比用备份更有效率;
闪回功能的开启受ENABLE_FLASHBACK参数影响,当ENABLE_FLASHBACK为0时,不开启闪回功能,当为1时开启闪回功能;
查看v$parameter可知闪回功能是否已开启:
select name,type,value from v$parameter where name='ENABLE_FLASHBACK';
开启闪回功能可以使用alter system命令来开启:
alter system set 'enable_flashback'=1 both;
注:该方法设置参数时,参数名必须加单引号。
或者使用SP_SET_PARA_VALUE 过程来开启
SP_SET_PARA_VALUE (1, 'ENABLE_FLASHBACK', 1);
再次查询v$parameter视图来检查闪回是否已开启
回滚段默认每90秒种会自动清理,回滚段刷新时长受参数UNDO_RETENTION的影响,回滚段参数太小会导致闪回功能可闪回时长过短,回滚段参数太大容易引发回滚段膨胀;
通过v$parameter视图来查看
select name,type,value from v$parameter where name='UNDO_RETENTION';
通过alter system命令来修改UNDO_RETENTION值:
通过alter system命令来修改UNDO_RETENTION值:
通过查询v$parameter视图来检查UNDO_RETENTION值:
使用闪回功能需要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';
赋予FLASHBACK TABLE权限后可以使用pah用户进行闪回;
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;
首先查询数据库的 CUR_LSN。 CUR_LSN 是系统已经分配的最大 LSN 值。物理事务提交时,系统会为其分配一个唯一的 LSN 值,大小等于 CUR_LSN+1,然后再修改 CUR_LSN=CUR_LSN+1。可以把CUR_LSN理解成数据库自己独有的一种时间计算,每当事务提交时,时间往前进一个单位;
SELECT CUR_LSN FROM V$RLOG;
select * from FLASHBACK_TABLE;
delete FLASHBACK_TABLE where COLUMN_1=1;
commit;
select * from FLASHBACK_TABLE;
使用闪回:
FLASHBACK TABLE FLASHBACK_TABLE TO LSN 45412;
select * from FLASHBACK_TABLE;
查询现在时间
SELECT SYSDATE;
对测试表进行操作
select * from FLASHBACK_TABLE;
delete FLASHBACK_TABLE where COLUMN_1=1;
commit;
执行闪回操作:
FLASHBACK TABLE T TO TIMESTAMP '2024-10-02 10:26:31';
查询表数据:
多表同时闪回与单表闪回的使用方法、注意事项基本一致,是在单表闪回时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;
多测试表进行操作
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;
两表同时闪回
FLASHBACK TABLE FLASHBACK_TABLE,FLASHBACK_TABLE2 TO LSN 45413;
重新查看现有数据,数据已恢复。
select * from FLASHBACK_TABLE union ALL
select * from FLASHBACK_TABLE2;
闪回查询利用时间戳和LSN,使用undo日志,能够让用户检索到某一时刻的数据快照。
使用的语法与常规的SELECT语句类似,并且有两种表现形式一种是WHEN TIMESTAMP,一种是AS OF TIMESTAMP。同时闪回查询支持LSN查询和时间查询;
SELECT * FROM FLASHBACK_TABLE WHEN TIMESTAMP '2024-10-02 10:26:31';
与第一种查询效果相同
SELECT * FROM FLASHBACK_TABLE AS OF TIMESTAMP '2024-10-02 10:26:31';
SELECT * FROM FLASHBACK_TABLE AS OF LSN 85233;
与第三种方法效果相同
SELECT * FROMFLASHBACK_TABLE AS OF SCN 85233;
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
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;
对测试表进行修改
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;
SELECT *,VERSIONS_OPERATION FROM FLASHBACK_TABLE2 WHEN TIMESTAMP '2024-10-02 11:32:52' ;
SELECT * FROM FLASHBACK_TABLE2 WHEN TIMESTAMP '2024-10-02 11:50:00' WHERE VERSIONS_OPERATION='D';
VERSIONS_OPERATION是闪回中独有的一个伪列,表示在行上的操作。有三种情况:I 表示 Insert、D 表示 Delete、U 表示 Update。
伪列是特殊的列,可以在查询中使用但不实际存储在表中,使用方法与处理普通列相同,但无法修改。
闪回版本查询,是使用伪列VERSIONS来查询在某一时间段中的操作,VERSIONS是一个时间字段使用BETWEEN AND关键字来查询。
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;
对测试表进行修改
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;
SELECT VERSIONS_STARTSCN, VERSIONS_ENDSCN, * FROM FLASHBACK_TABLE2 VERSIONS BETWEEN TIMESTAMP '2024-10-02 12:06:01' AND SYSDATE;
通过闪回版本查询可以查询出在具体时间段中被修改的表的记录
闪回事务被记录在系统视图 V$FLASHBACK_TRX_INFO 中,可以供用户查看在事务级对数据库所做的更改。
如果在上述例子过程中查询V$FLASHBACK_TRX_INFO视图,可以得到以下内容。
select * from V$FLASHBACK_TRX_INFO;
常使用的列名有表名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;
文章
阅读量
获赞