聊聊数据库闪回技术
提到闪回技术,工作这么久了我也很少用到, 以至于我都快忘记闪回技术都有哪些东西了。今天得空,就来复习一下数据库中的闪回技术。
即使不看书,我印象中的闪回技术分这么几种,闪回数据库、闪回删除、闪回查询。闪回技术相比于数据库不完全恢复,其特点里速度快,影响层面小。
一、闪回数据库
闪回数据库是把数据库整体状态恢复到过去某一时间点或者某一系统更改号(SCN),是实施数据库不完全恢复的一种快速方式。
1.1使用要求:
1)必须有SYSDBA的权限
2)启用了recovery area
3)数据库处于FLASHBACK模式
4)数据库处于mount状态
此外,
5)数据库必须处理归档模式;
6)控制文件不能是备份的控制文件或者重建的控制文件;
7)数据库不包含处于FLASHBACK OFF的表空间。
1.2 语法
说明:
FLASHBACK DATABASE:当使用flashback database命令时,数据库验证所要求的归档日志和联机重做日志是否可用。如果它们可用,那么它将数据库中的所有当前联机数据文件恢复为SCN或此语句中指定的时间。
数据库中保留的闪回数据量由DB_FLASHBACK_RETENTION_TARGET初始化参数和快速恢复区的大小控制。可以通过查询V$FLASHBACK_DATABASE_LOG视图来确定多长时间后可以闪回数据库。
STANDBY:指定STANDBY以将备用数据库还原到较早的SCN或时间。如果数据库不是备用数据库,则数据库返回错误。如果省略此子句,则数据库可以是主数据库或备用数据库。
TO SCN语句:
TO SCN将数据库恢复为其在指定SCN的状态。
TO BEFORE SCN将数据库恢复到紧靠指定SCN之前的系统更改号的状态。
TO TIMESTAMP语句:
TO TIMESTAMP:将数据库恢复为其在指定时间戳的状态。
TO BEFORE TIMESTAMP:将数据库恢复到指定时间戳之前一秒的状态。
TO RESTORE POINT语句:指定此子句以将数据库闪回到指定的还原点。 是未启用闪回数据库唯一可以使用的语句。
RESETLOGS:
将数据库闪回到刚好在最后一次resetlogs操作(ALTER DATABASE OPEN RESETLOGS)之前。
知道了闪回数据库的要求以及语法之后,就可以操作数据库的闪回模式了。(测试环境:ORACLE 11GR2)
1)使用数据库管理员登录数据库
SQL> conn /as sysdba
2)查看数据库是否启用闪回模式
SQL> select flashback_on from v$database; FLASHBACK_ON------------------NO
数据库未启用,则使用如下命令:
ALTER DATABASE FLASHBACK ON; #实际测试过程中,执行该命令时没有重启数据库。
3) 查看是否启用数据库闪回区
SQL> show parameter recoveryNAME TYPE VALUE----------------------------------- ----------- ------------------------------db_recovery_file_dest string /u01/app/oracle/flash_recovery_areadb_recovery_file_dest_size big integer 3882Mrecovery_parallelism integer 0
#修改方式:
#调整闪回区的大小及位置
#SQL> alter system set db_recovery_file_dest_size=5g scope=spfile;
#设置闪回区位置:
#SQL> alter system set db_recovery_file_dest='/app/flash_recovery_area' scope=spfile;
4) 查看 DB_FLASHBACK_RETENTION_TARGET参数(单位:分钟)
SQL> show parameter db_flashback_retention_target NAME TYPE VALUE------------------------------------ ----------- ------------------------------db_flashback_retention_target integer 1440
修改方式:
#SQL> alter system set db_flashback_retention_target=7200 scope=spfile;
5)查看是否处于归档模式
SQL> archive log list;Database log mode Archive ModeAutomatic archival EnabledArchive destination USE_DB_RECOVERY_FILE_DESTOldest online log sequence 10Next log sequence to archive 12Current log sequence 12
已启用归档模式
3)和4)中的参数可以根据实际需要修改
6) 查看V$FLASHBACK_DATABASE_LOG,查看是否有数据生成
SQL> select * from V$FLASHBACK_DATABASE_LOG; OLDEST_FLASHBACK_SCN OLDEST_FLASHBACK_TIME RETENTION_TARGET FLASHBACK_SIZE ESTIMATED_FLASHBACK_SIZE-------------------- --------------------- ---------------- -------------- ------------------------1025623 2017/1/13 11:11:05 1440 8192000 0
7)闪回数据库
创建测试表:
SQL> create table scott.test_1113_1 as select * from v$logfile; Table created SQL> create table scott.test_1113_2 as select * from v$logfile; Table created SQL> select dbms_flashback.get_system_change_number,SCN_TO_TIMESTAMP(dbms_flashback.get_system_change_number) from dual; GET_SYSTEM_CHANGE_NUMBER SCN_TO_TIMESTAMP(DBMS_FLASHBAC------------------------ --------------------------------------------------------------------------------1026334 13-1月 -17 11.21.50.000000000 上午
此时的系统更改点是1026334,之后数据库会恢复到这个点。表scott.test_1113_1和scott.test_1113_2都应该存在。
SQL> drop table scott.test_1113_1; Table dropped SQL> drop table scott.test_1113_2; Table dropped SQL> shutdown abort;ORACLE instance shut down.SQL> startup mount;ORACLE instance started.Total System Global Area 776646656 bytesFixed Size 2217384 bytesVariable Size 511707736 bytesDatabase Buffers 260046848 bytesRedo Buffers 2674688 bytesDatabase mounted.SQL> flashback database to scn 1026334;Flashback complete.SQL> alter database open resetlogs;Database altered.SQL> select count(1) from scott.test_1113_1; COUNT(1)---------- 3 SQL> select count(1) from scott.test_1113_2; COUNT(1)---------- 3
闪回数据库后,scott.test_1113_1和scott.test_1113_2都存在。
二、闪回表
使用flashback table 命令,可以将数据库的表恢复到之前某一个时刻的状态,至于能恢复到什么时间点,则依赖于回滚段的数据量。flashback table 操作不可回滚。
2.1 使用要求
具有该表的FLASHBACK权限或者有 FLASHBACK ANY TABLE的权限,此外,还必须有SELECT, INSERT, DELETE, and ALTER的权限。
使用flashback table的表必须开启row movement(从回收站闪回的表例外)。
要将表闪回到还原点,必须具有SELECT ANY DICTIONARY或FLASHBACK ANY TABLE的系统特权或SELECT_CATALOG_ROLE角色。
2.2 语法
在Oracle闪回表操作期间,Oracle数据库会在闪回列表中指定的所有表上获取独占DML锁。当这些表恢复到其早期状态时,这些锁阻止对表的任何操作。
闪回表操作在单个事务中执行,而与闪回列表中指定的表数无关。 所有表都恢复到早期状态,或者它们都不恢复。如果闪回表操作在任何表上失败,则整个语句将失败。
在完成闪回表操作时,表中的数据与早期的表一致。 但是,FLASHBACK TABLE TO SCN或TIMESTAMP不保留rowid,而FLASHBACK TABLE TO BEFORE DROP不会恢复之前引用的约束。
Oracle数据库不会将与表关联的统计信息还原到之前的表单。当前存在的表上的索引将被还原,并反映闪回点处的表的状态。 如果索引现在存在,但在闪回点尚不存在,则数据库更新索引以反映闪回点处的表的状态。 但是,在闪回点和当前时间之间的间隔期间丢弃的索引不会恢复。
schema:表的拥有者
table:指定包含要还原到早期版本的数据的一个或多个表的名称。
限制:
1)闪回表操作对以下类型对象无效:作为集群一部分的表,物化视图,高级排队(AQ)表,静态数据字典表,系统表,远程表,对象表,嵌套表或单个表 分区或子分区。
2)以下DDL操作更改表的结构,以便以后无法使用TO SCN或TO TIMESTAMP子句将表闪回到操作之前的某个时间:升级,移动或截断表; 向表添加约束,向集群添加表; 修改或丢弃柱; 改变列加密密钥; 添加,删除,合并,拆分,合并或截断分区或子分区(除了添加范围分区)。(upgrading, moving, or truncating a table; adding a constraint to a table, adding a table to a cluster; modifying or dropping a column; changing a column encryption key; adding, dropping, merging, splitting, coalescing, or truncating a partition or subpartition (with the exception of adding a range partition).
TO RESTORE POINT:指定要将表闪回的恢复点。 还原点必须已创建。
ENABLE | DISABLE TRIGGERS:默认关闭触发器
TO BEFORE DROP:从回收站中还原表。
可以指定表的原始名称或分配给该对象的系统名称;
如果存在多个同名表,将还原最晚删除的表,即后进先出。
RENAME TO:重命名。
2.3 例子
1)创建新的测试表
SQL> create table scott.test_1114_1 as select * from v$logfile;SQL> select * from scott.test_1114_1; GROUP# STATUS TYPE MEMBER IS_RECOVERY_DEST_FILE---------- ------- ------- ------------------------------------------------- ---------------------3 ONLINE /u01/app/oracle/oradata/orcl/redo03.log NO2 ONLINE /u01/app/oracle/oradata/orcl/redo02.log NO1 ONLINE /u01/app/oracle/oradata/orcl/redo01.log NO
2)获取当前SCN和时间戳,最后该表数据会恢复到当前的时间点。
SQL> select dbms_flashback.get_system_change_number,SCN_TO_TIMESTAMP(dbms_flashback.get_system_change_number) timestamp from dual; GET_SYSTEM_CHANGE_NUMBER TIMESTAMP------------------------ --------------------------------------------------------------------------------1031289 14-1月 -17 09.13.59.000000000 上午
3)删除该表中的记录
SQL> delete from scott.test_1114_1; SQL> select count(1) from scott.test_1114_1; COUNT(1)---------- 0
4)闪回表
SQL> alter table scott.test_1114_1 enable row movement; Table alteredSQL> flashback table scott.test_1114_1 to scn 1031289; Done SQL> select * from scott.test_1114_1; GROUP# STATUS TYPE MEMBER IS_RECOVERY_DEST_FILE---------- ------- ------- --------------------------------------- --------------------3 ONLINE /u01/app/oracle/oradata/orcl/redo03.log NO2 ONLINE /u01/app/oracle/oradata/orcl/redo02.log NO1 ONLINE /u01/app/oracle/oradata/orcl/redo01.log NO
表已恢复
5)多次删除与创建该表
SQL> drop table scott.test_1114_1; Table dropped SQL> create table scott.test_1114_1 as select * from v$logfile; Table created SQL> drop table scott.test_1114_1; Table dropped SQL> create table scott.test_1114_1 as select * from v$logfile; Table created SQL> drop table scott.test_1114_1; Table dropped
6)查看回收站
SQL> select object_name,original_name,droptime from dba_recyclebin; OBJECT_NAME ORIGINAL_NAME DROPTIME------------------------------ -------------------------------- -------------------BIN$RgTFmsLNhcHgUKjAyX44MA==$0 TEST_1114_1 2017-01-14:09:21:37BIN$RgTFmsLOhcHgUKjAyX44MA==$0 TEST_1114_1 2017-01-14:09:21:58BIN$RgTFmsLPhcHgUKjAyX44MA==$0 TEST_1114_1 2017-01-14:09:22:01
7)恢复表
SQL> flashback table scott.test_1114_1 to before drop; Done SQL> select object_name,original_name,droptime from dba_recyclebin; OBJECT_NAME ORIGINAL_NAME DROPTIME------------------------------ -------------------------------- -------------------BIN$RgTFmsLNhcHgUKjAyX44MA==$0 TEST_1114_1 2017-01-14:09:21:37BIN$RgTFmsLOhcHgUKjAyX44MA==$0 TEST_1114_1 2017-01-14:09:21:58
最晚被删除的表被还原。
SQL> flashback table scott.test_1114_1 to before drop rename to test_1114_2; Done SQL> select object_name,original_name,droptime from dba_recyclebin; OBJECT_NAME ORIGINAL_NAME DROPTIME------------------------------ -------------------------------- -------------------BIN$RgTFmsLNhcHgUKjAyX44MA==$0 TEST_1114_1 2017-01-14:09:21:37
三、闪回查询
要使用闪回查询,必须要有表的查询权限,以及该表的FLASHBACK 权限或FLASHBACK ANY TABLE的系统权限。
闪回查询有两种,一种是查询某一时间点的的数据(as of),另一种查询某一时间段内数据的操作(versions between)。闪回查询并不会影响到当前表中的数据。
1)闪回时间点查询
select * fromas of timestamp to_timestamp(timestamp,'yyyy-mm-dd hh34:mi:ss');select * from as of scn scn_number;
2) 闪回版本查询
SELECT versions_startscn, versions_starttime, versions_endscn, versions_endtime, versions_xid, versions_operation, t.*FROMtVERSIONS BETWEEN TIMESTAMP BeginTimestamp and EndTimestamp;SELECT versions_startscn, versions_starttime, versions_endscn, versions_endtime, versions_xid, versions_operation, t.*FROM tVERSIONS BETWEEN scn begin_scn and end_scn;
例子:
1)获取当前的SCN
SQL> select dbms_flashback.get_system_change_number,SCN_TO_TIMESTAMP(dbms_flashback.get_system_change_number) timestamp from dual; GET_SYSTEM_CHANGE_NUMBER TIMESTAMP------------------------ --------------------------------------------------------------------------------1032595 14-1月 -17 09.47.57.000000000 上午
2)增加test_1114_1表中的数据
SQL> insert into scott.test_1114_1 select * from scott.test_1114_1;3 rows inserted
3)闪回时间点查询
SQL> select * from scott.test_1114_1 as of scn 1032595; GROUP# STATUS TYPE MEMBER IS_RECOVERY_DEST_FILE---------- ------- ------- ----------------------------------------- ---------------------3 ONLINE /u01/app/oracle/oradata/orcl/redo03.log NO2 ONLINE /u01/app/oracle/oradata/orcl/redo02.log NO1 ONLINE /u01/app/oracle/oradata/orcl/redo01.log NO SQL> select * from scott.test_1114_1; GROUP# STATUS TYPE MEMBER IS_RECOVERY_DEST_FILE---------- ------- ------- ----------------------------------------- ---------------------3 ONLINE /u01/app/oracle/oradata/orcl/redo03.log NO2 ONLINE /u01/app/oracle/oradata/orcl/redo02.log NO1 ONLINE /u01/app/oracle/oradata/orcl/redo01.log NO3 ONLINE /u01/app/oracle/oradata/orcl/redo03.log NO2 ONLINE /u01/app/oracle/oradata/orcl/redo02.log NO1 ONLINE /u01/app/oracle/oradata/orcl/redo01.log NO 6 rows selected
4)闪回版本查询
SQL> select dbms_flashback.get_system_change_number,SCN_TO_TIMESTAMP(dbms_flashback.get_system_change_number) timestamp from dual; GET_SYSTEM_CHANGE_NUMBER TIMESTAMP------------------------ -------------------------------------------------------------------------------1032939 14-1月 -17 09.52.42.000000000 上午SQL> SELECT versions_startscn, versions_starttime, versions_endscn, versions_endtime, versions_xid, versions_operation, group#,status,type,member ,is_recovery_dest_file 2 FROM scott.test_1114_1 3 VERSIONS BETWEEN scn 1032595 and 1032939; VERSIONS_STARTSCN VERSIONS_STARTTIME VERSIONS_ENDSCN VERSIONS_ENDTIME VERSIONS_XID VERSIONS_OPERATION GROUP# STATUS TYPE MEMBER IS_RECOVERY_DEST_FILE----------------- ----------------------- --------------- ----------------- ---------------- ------------------ ---------- ------- ------- ------------------------------------- --------------------- 3 ONLINE /u01/app/oracle/oradata/orcl/redo03.log NO 2 ONLINE /u01/app/oracle/oradata/orcl/redo02.log NO 1 ONLINE /u01/app/oracle/oradata/orcl/redo01.log NO1032882 14-1月 -17 09.50.06 上午 030001002F030000 I 3 ONLINE /u01/app/oracle/oradata/orcl/redo03.log NO1032882 14-1月 -17 09.50.06 上午 030001002F030000 I 2 ONLINE /u01/app/oracle/oradata/orcl/redo02.log NO1032882 14-1月 -17 09.50.06 上午 030001002F030000 I 1 ONLINE /u01/app/oracle/oradata/orcl/redo01.log NO 6 rows selected
闪回版本查询查到了SCN为1032595表的数据状态,又查到了3条insert的记录。
四、总结
到目前为止,所接触到的关于闪回的技术就是这些。分别是闪回数据库[1种],闪回表[2种方式],闪回查询[2种方式]。
参考资料:
1.《Database SQL Language Reference》.