聊聊数据库闪回技术

  提到闪回技术,工作这么久了我也很少用到, 以至于我都快忘记闪回技术都有哪些东西了。今天得空,就来复习一下数据库中的闪回技术。

创新互联自2013年创立以来,是专业互联网技术服务公司,拥有项目成都网站制作、成都做网站网站策划,项目实施与项目整合能力。我们以让每一个梦想脱颖而出为使命,1280元鹤山做网站,已为上家服务,为鹤山各地企业和个人服务,联系电话:18982081108

  即使不看书,我印象中的闪回技术分这么几种,闪回数据库、闪回删除、闪回查询。闪回技术相比于数据库不完全恢复,其特点里速度快,影响层面小。

一、闪回数据库

  闪回数据库是把数据库整体状态恢复到过去某一时间点或者某一系统更改号(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 recovery
NAME                      TYPE     VALUE
----------------------------------- ----------- ------------------------------
db_recovery_file_dest          string    /u01/app/oracle/flash_recovery_area
db_recovery_file_dest_size       big integer  3882M
recovery_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 Mode
Automatic archival       Enabled
Archive destination       USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence     10
Next log sequence to archive   12
Current 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 bytes
Fixed Size    2217384 bytes
Variable Size  511707736 bytes
Database Buffers  260046848 bytes
Redo Buffers    2674688 bytes
Database 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  NO
2      ONLINE          /u01/app/oracle/oradata/orcl/redo02.log  NO
1      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 altered
SQL> 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 NO
2      ONLINE           /u01/app/oracle/oradata/orcl/redo02.log NO
1      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:37
BIN$RgTFmsLOhcHgUKjAyX44MA==$0 TEST_1114_1               2017-01-14:09:21:58
BIN$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:37
BIN$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 * from   as 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.*
FROM  t
VERSIONS BETWEEN TIMESTAMP BeginTimestamp and EndTimestamp;
SELECT versions_startscn, versions_starttime, versions_endscn, versions_endtime, versions_xid, versions_operation, t.*
FROM  t
VERSIONS 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  NO
2       ONLINE          /u01/app/oracle/oradata/orcl/redo02.log  NO
1       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  NO
2       ONLINE          /u01/app/oracle/oradata/orcl/redo02.log  NO
1       ONLINE          /u01/app/oracle/oradata/orcl/redo01.log  NO
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  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    NO
1032882          14-1月 -17 09.50.06 上午                       030001002F030000 I             3       ONLINE         /u01/app/oracle/oradata/orcl/redo03.log    NO
1032882          14-1月 -17 09.50.06 上午                       030001002F030000 I             2       ONLINE         /u01/app/oracle/oradata/orcl/redo02.log    NO
1032882          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》.


文章标题:聊聊数据库闪回技术
文章路径:http://pwwzsj.com/article/ppehed.html