溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

聊聊數(shù)據(jù)庫閃回技術(shù)

發(fā)布時(shí)間:2020-07-03 23:26:19 來源:網(wǎng)絡(luò) 閱讀:1061 作者:三國(guó)冷 欄目:數(shù)據(jù)庫

  提到閃回技術(shù),工作這么久了我也很少用到, 以至于我都快忘記閃回技術(shù)都有哪些東西了。今天得空,就來復(fù)習(xí)一下數(shù)據(jù)庫中的閃回技術(shù)。

  即使不看書,我印象中的閃回技術(shù)分這么幾種,閃回?cái)?shù)據(jù)庫、閃回刪除、閃回查詢。閃回技術(shù)相比于數(shù)據(jù)庫不完全恢復(fù),其特點(diǎn)里速度快,影響層面小。


一、閃回?cái)?shù)據(jù)庫

  閃回?cái)?shù)據(jù)庫是把數(shù)據(jù)庫整體狀態(tài)恢復(fù)到過去某一時(shí)間點(diǎn)或者某一系統(tǒng)更改號(hào)(SCN),是實(shí)施數(shù)據(jù)庫不完全恢復(fù)的一種快速方式。

1.1使用要求:

1)必須有SYSDBA的權(quán)限

2)啟用了recovery area

3)數(shù)據(jù)庫處于FLASHBACK模式

4)數(shù)據(jù)庫處于mount狀態(tài)


此外,

5)數(shù)據(jù)庫必須處理歸檔模式;

6)控制文件不能是備份的控制文件或者重建的控制文件;

7)數(shù)據(jù)庫不包含處于FLASHBACK OFF的表空間。


1.2 語法

聊聊數(shù)據(jù)庫閃回技術(shù)


說明:

FLASHBACK DATABASE:當(dāng)使用flashback database命令時(shí),數(shù)據(jù)庫驗(yàn)證所要求的歸檔日志和聯(lián)機(jī)重做日志是否可用。如果它們可用,那么它將數(shù)據(jù)庫中的所有當(dāng)前聯(lián)機(jī)數(shù)據(jù)文件恢復(fù)為SCN或此語句中指定的時(shí)間。

數(shù)據(jù)庫中保留的閃回?cái)?shù)據(jù)量由DB_FLASHBACK_RETENTION_TARGET初始化參數(shù)和快速恢復(fù)區(qū)的大小控制??梢酝ㄟ^查詢V$FLASHBACK_DATABASE_LOG視圖來確定多長(zhǎng)時(shí)間后可以閃回?cái)?shù)據(jù)庫。


STANDBY:指定STANDBY以將備用數(shù)據(jù)庫還原到較早的SCN或時(shí)間。如果數(shù)據(jù)庫不是備用數(shù)據(jù)庫,則數(shù)據(jù)庫返回錯(cuò)誤。如果省略此子句,則數(shù)據(jù)庫可以是主數(shù)據(jù)庫或備用數(shù)據(jù)庫。

TO SCN語句:

 TO SCN將數(shù)據(jù)庫恢復(fù)為其在指定SCN的狀態(tài)。

 TO BEFORE SCN將數(shù)據(jù)庫恢復(fù)到緊靠指定SCN之前的系統(tǒng)更改號(hào)的狀態(tài)。


TO TIMESTAMP語句:

 TO TIMESTAMP:將數(shù)據(jù)庫恢復(fù)為其在指定時(shí)間戳的狀態(tài)。

 TO BEFORE TIMESTAMP:將數(shù)據(jù)庫恢復(fù)到指定時(shí)間戳之前一秒的狀態(tài)。


TO RESTORE POINT語句:指定此子句以將數(shù)據(jù)庫閃回到指定的還原點(diǎn)。 是未啟用閃回?cái)?shù)據(jù)庫唯一可以使用的語句。

RESETLOGS

將數(shù)據(jù)庫閃回到剛好在最后一次resetlogs操作(ALTER DATABASE OPEN RESETLOGS)之前。


知道了閃回?cái)?shù)據(jù)庫的要求以及語法之后,就可以操作數(shù)據(jù)庫的閃回模式了。(測(cè)試環(huán)境:ORACLE 11GR2)

1)使用數(shù)據(jù)庫管理員登錄數(shù)據(jù)庫

SQL> conn /as sysdba


2)查看數(shù)據(jù)庫是否啟用閃回模式

 

SQL>  select flashback_on from v$database;
 
FLASHBACK_ON
------------------
NO


數(shù)據(jù)庫未啟用,則使用如下命令:

ALTER DATABASE FLASHBACK ON; #實(shí)際測(cè)試過程中,執(zhí)行該命令時(shí)沒有重啟數(shù)據(jù)庫。



3) 查看是否啟用數(shù)據(jù)庫閃回區(qū)

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

#修改方式:

#調(diào)整閃回區(qū)的大小及位置

#SQL> alter system set db_recovery_file_dest_size=5g scope=spfile;

#設(shè)置閃回區(qū)位置:

#SQL> alter system set db_recovery_file_dest='/app/flash_recovery_area' scope=spfile;


4) 查看 DB_FLASHBACK_RETENTION_TARGET參數(shù)(單位:分鐘)

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)中的參數(shù)可以根據(jù)實(shí)際需要修改

6) 查看V$FLASHBACK_DATABASE_LOG,查看是否有數(shù)據(jù)生成

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)閃回?cái)?shù)據(jù)庫

創(chuàng)建測(cè)試表:

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 上午

此時(shí)的系統(tǒng)更改點(diǎn)是1026334,之后數(shù)據(jù)庫會(huì)恢復(fù)到這個(gè)點(diǎn)。表scott.test_1113_1和scott.test_1113_2都應(yīng)該存在。

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

閃回?cái)?shù)據(jù)庫后,scott.test_1113_1和scott.test_1113_2都存在。


二、閃回表

  使用flashback table 命令,可以將數(shù)據(jù)庫的表恢復(fù)到之前某一個(gè)時(shí)刻的狀態(tài),至于能恢復(fù)到什么時(shí)間點(diǎn),則依賴于回滾段的數(shù)據(jù)量。flashback table 操作不可回滾。

2.1 使用要求

  具有該表的FLASHBACK權(quán)限或者有 FLASHBACK ANY TABLE的權(quán)限,此外,還必須有SELECT, INSERT, DELETE, and ALTER的權(quán)限。

  使用flashback table的表必須開啟row movement(從回收站閃回的表例外)。

  要將表閃回到還原點(diǎn),必須具有SELECT ANY DICTIONARY或FLASHBACK ANY TABLE的系統(tǒng)特權(quán)或SELECT_CATALOG_ROLE角色。    

2.2 語法

聊聊數(shù)據(jù)庫閃回技術(shù)


  在Oracle閃回表操作期間,Oracle數(shù)據(jù)庫會(huì)在閃回列表中指定的所有表上獲取獨(dú)占DML鎖。當(dāng)這些表恢復(fù)到其早期狀態(tài)時(shí),這些鎖阻止對(duì)表的任何操作。

  閃回表操作在單個(gè)事務(wù)中執(zhí)行,而與閃回列表中指定的表數(shù)無關(guān)。 所有表都恢復(fù)到早期狀態(tài),或者它們都不恢復(fù)。如果閃回表操作在任何表上失敗,則整個(gè)語句將失敗。

  在完成閃回表操作時(shí),表中的數(shù)據(jù)與早期的表一致。 但是,F(xiàn)LASHBACK TABLE TO SCN或TIMESTAMP不保留rowid,而FLASHBACK TABLE TO BEFORE DROP不會(huì)恢復(fù)之前引用的約束。

  Oracle數(shù)據(jù)庫不會(huì)將與表關(guān)聯(lián)的統(tǒng)計(jì)信息還原到之前的表單。當(dāng)前存在的表上的索引將被還原,并反映閃回點(diǎn)處的表的狀態(tài)。 如果索引現(xiàn)在存在,但在閃回點(diǎn)尚不存在,則數(shù)據(jù)庫更新索引以反映閃回點(diǎn)處的表的狀態(tài)。 但是,在閃回點(diǎn)和當(dāng)前時(shí)間之間的間隔期間丟棄的索引不會(huì)恢復(fù)。

schema:表的擁有者

table:指定包含要還原到早期版本的數(shù)據(jù)的一個(gè)或多個(gè)表的名稱。

  限制:

  1)閃回表操作對(duì)以下類型對(duì)象無效:作為集群一部分的表,物化視圖,高級(jí)排隊(duì)(AQ)表,靜態(tài)數(shù)據(jù)字典表,系統(tǒng)表,遠(yuǎn)程表,對(duì)象表,嵌套表或單個(gè)表 分區(qū)或子分區(qū)。

  2)以下DDL操作更改表的結(jié)構(gòu),以便以后無法使用TO SCN或TO TIMESTAMP子句將表閃回到操作之前的某個(gè)時(shí)間:升級(jí),移動(dòng)或截?cái)啾? 向表添加約束,向集群添加表; 修改或丟棄柱; 改變列加密密鑰; 添加,刪除,合并,拆分,合并或截?cái)喾謪^(qū)或子分區(qū)(除了添加范圍分區(qū))。(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:指定要將表閃回的恢復(fù)點(diǎn)。 還原點(diǎn)必須已創(chuàng)建。

ENABLE | DISABLE TRIGGERS:默認(rèn)關(guān)閉觸發(fā)器

TO BEFORE DROP:從回收站中還原表。

可以指定表的原始名稱或分配給該對(duì)象的系統(tǒng)名稱;

如果存在多個(gè)同名表,將還原最晚刪除的表,即后進(jìn)先出。

RENAME TO:重命名。


2.3 例子

1)創(chuàng)建新的測(cè)試表

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)獲取當(dāng)前SCN和時(shí)間戳,最后該表數(shù)據(jù)會(huì)恢復(fù)到當(dāng)前的時(shí)間點(diǎn)。

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

表已恢復(fù)

5)多次刪除與創(chuàng)建該表

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)恢復(fù)表

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

三、閃回查詢

  要使用閃回查詢,必須要有表的查詢權(quán)限,以及該表的FLASHBACK 權(quán)限或FLASHBACK ANY TABLE的系統(tǒng)權(quán)限。

  閃回查詢有兩種,一種是查詢某一時(shí)間點(diǎn)的的數(shù)據(jù)(as of),另一種查詢某一時(shí)間段內(nèi)數(shù)據(jù)的操作(versions between)。閃回查詢并不會(huì)影響到當(dāng)前表中的數(shù)據(jù)。

1)閃回時(shí)間點(diǎn)查詢

select * from <table_name>  as of  timestamp to_timestamp(timestamp,'yyyy-mm-dd hh34:mi:ss');
select * from <table_name>  as of  scn scn_number;


2) 閃回版本查詢

SELECT versions_startscn, versions_starttime, versions_endscn, versions_endtime, versions_xid, versions_operation, t.*
FROM <table_name> t
VERSIONS BETWEEN TIMESTAMP BeginTimestamp and EndTimestamp;
SELECT versions_startscn, versions_starttime, versions_endscn, versions_endtime, versions_xid, versions_operation, t.*
FROM <table_name> t
VERSIONS BETWEEN scn begin_scn and end_scn;



例子:

1)獲取當(dāng)前的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表中的數(shù)據(jù)

SQL> insert into scott.test_1114_1 select * from scott.test_1114_1;
3 rows inserted

3)閃回時(shí)間點(diǎn)查詢

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表的數(shù)據(jù)狀態(tài),又查到了3條insert的記錄。


四、總結(jié)

  到目前為止,所接觸到的關(guān)于閃回的技術(shù)就是這些。分別是閃回?cái)?shù)據(jù)庫[1種],閃回表[2種方式],閃回查詢[2種方式]。

參考資料:

1.《Database SQL Language Reference》.


向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI