1. 程式人生 > >Oracle閃回技術[未完]

Oracle閃回技術[未完]

run dsc 回收 之前 快照 第一次 關聯對象 發現 刪除對象

(一)閃回技術概要

閃回技術是數據庫備份與恢復的重要補充手段,主要包括以下7種特性:

特性 原理 數據庫支持
閃回查詢
(Flashback Query)
利用undo表空間中的回退信息,查詢過去某個時刻或SCN時表中數據的快照 Undo表空間配置
閃回版本查詢
(Flashback Version Query)
利用undo表空間中的回退信息,查詢過去某個時間段或某個SCN段內數據的變化情況 Undo表空間配置
閃回事務查詢
(Flashback Transaction Query)
利用undo表空間中的回退信息,查詢過去某個事務或所有事務在過去一段時間內對數據庫所做的修改 Undo表空間配置
閃回表
(Flashback Table)
利用undo表空間中的信息,將表中的數據恢復到過去某個時間點或SCN時的狀態 Undo表空間支持
閃回刪除
(Flashback Drop)
利用“回收站功能”,將表及關聯對象恢復到刪除以前的狀態 回收站
閃回數據庫
(Flashback Database)
利用存儲在快速恢復區(Flashback Recovery Area)的閃回日誌(Flashback log),將數據庫恢復到過去某個時刻或某個SCN 快速恢復區
閃回數據歸檔
(Flashback Data Archive)
利用保存在一個或多個表空間中的數據變化信息,查詢過去某個時刻或SCN值時數據庫表中數據的快照。 一個或多個閃回數據歸檔區

接下來一一學習。

(二)閃回查詢

(1)主要功能

返回已經丟失或被誤操作刪除的數據在操作之前的快照。

(2)Undo表空間設置

與undo表空間相關的參數主要是下面三個:

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
undo_management                      string      AUTO
undo_retention                       
integer 900 undo_tablespace string UNDOTBS1

① undo_management:設置undo表空間的管理模式,有自動和手動管理兩種方式,默認自動管理undo表空間;

② undo_retention:設置保留時間,我們可以對其修改:

SQL > ALTER SYSTEM SET UNDO_RETENTION = 86400;  --修改為24小時

值得註意的是,undo_retention是一個“軟設置”,數據庫會盡量給你保留24小時,但是假如undo表空間不夠用,數據是不會保留24小時的。

如果必須要保留24小時,可以啟用Undo表空間的retention guarantee,保證過期的數據才能被刪除,設置如下:

SQL > ALTER TABLESPACE undotbs1 RETENTION GUARANTEE;

③ undo_tablespace:指明所使用的undo表空間

(3)閃回查詢語法:

閃回查詢是通過AS OF關鍵字實現的,具體如下:

SELECT column_name FROM table_name
AS OF SCN |TIMESTAMP expression
[WHERE condition];

其中,scn與timestamp是一一對應的,可以通過函數TIMESTAMP_TO_SCN(timestamp)和SCN_TO_TIMESTAMP(scn)來轉換。

(4)例子1、通過timestamp來閃回查詢用戶所做操作。

16:59:48 SQL> create table test01
           2  (
           3      id        number(5),
           4      name      varchar(20),
           5      salary    number(5)
           6  );

17:02:52 SQL> insert into test01 values(1,lijiaman,1000);
17:02:52 SQL> insert into test01 values(2,liudedong,2000);
17:03:52 SQL> update test01 set salary = 1200 where id = 1;
17:04:59 SQL> update test01 set salary = 1400 where id = 1;
17:06:06 SQL> update test01 set salary = 1600 where id = 1;
17:07:04 SQL> delete from test01 where id = 2;

對於整個過程,我們可以使用下圖來表示:

技術分享

接下來,我們使用閃回查詢技術查看數據:

-- 查看表中目前數據,只有一行
17:21:46 SQL> select * from test01;         
    ID NAME                 SALARY
------ -------------------- ------
     1 lijiaman               1600
     
-- 查看17:07:00的數據,此時還未刪除數據,有2行,且id=1的salary是1600        
17:46:26 SQL> select * from test01 as of timestamp to_timestamp(2017-10-07 17:07:00,yyyy-mm-dd hh24:mi:ss);
    ID NAME                 SALARY
------ -------------------- ------
     1 lijiaman               1600
     2 liudedong              2000

-- 查看17:06:00的數據,此時id=1的salary還是1400 
17:54:28 SQL> select * from test01 as of timestamp to_timestamp(2017-10-07 17:06:00,yyyy-mm-dd hh24:mi:ss);
    ID NAME                 SALARY
------ -------------------- ------
     1 lijiaman               1400
     2 liudedong              2000

-- 查看17:04:00的數據,此時id=1的salary還是1200 
17:54:57 SQL> select * from test01 as of timestamp to_timestamp(2017-10-07 17:04:00,yyyy-mm-dd hh24:mi:ss);
    ID NAME                 SALARY
------ -------------------- ------
     1 lijiaman               1200
     2 liudedong              2000

-- 查看17:03:00的數據,此時id=1的salary還是1000 
17:55:14 SQL> select * from test01 as of timestamp to_timestamp(2017-10-07 17:03:00,yyyy-mm-dd hh24:mi:ss);
    ID NAME                 SALARY
------ -------------------- ------
     1 lijiaman               1000
     2 liudedong              2000 

-- 查看17:02:00的數據,此時還未向數據庫插入數據 
17:55:20 SQL> select * from test01 as of timestamp to_timestamp(2017-10-07 17:02:00,yyyy-mm-dd hh24:mi:ss);
    ID NAME                 SALARY
------ -------------------- ------

(三)閃回版本查詢

(1)主要功能

閃回版本提供了審計行數據變化的功能,可以跟蹤一條記錄在一段時間內的變化情況,即一條記錄的多個提交版本信息(一個事物對一條記錄的操作結果視為該記錄的一個版本),從而為行級數據的追蹤提供了可能

(2)閃回版本查詢語法
SELECT column_name[,…] FROM table_name 
VERSIONS BETWEEN SCN|TIMESTAMP MINVALUE | expression AND MAXVALUE |expression 
[AS OF SCN | TIMESTAMP expression] 
WHERE condition

參數說明:

--VERSIONS BETWEEN:用於指定閃回查詢所要求的時間段或SCN段;

--AS OF:用於指定閃回查詢時查詢的目標時刻或目標SCN值;

在閃回查詢的目標列中,可以使用以下偽列來返回行的版本信息:

--VERSIONS_STARTTIME:基於時間的版本有效範圍的下界,可以理解為某個版本的開始時間,下亦相同;

--VERSIONS_ENDTIME:基於時間的版本有效範圍的上界;

--VERSIONS_STARTSCN:基於SCN的版本有效範圍的下界;

--VERSIONS_ENDSCN:基於SCN的版本有效範圍的上界;

--VERSIONS_XID:操作的事物ID;

--VERSIONS_OPERATION:執行操作的類型,I:insert,D:delete,U:update

(3)例子2、版本閃回查詢測試
20:06:51 SQL> create table test02
           2  (
           3      id        number(5),
           4      name      varchar(20),
           5      salary    number(5)
           6  );

20:09:23 SQL> insert into test02 values(1,lijiaman,1000);           --事物1:第一次數據插入
20:09:23 SQL> insert into test02 values(2,liudedong,2000);
20:09:23 SQL> commit;
20:10:09 SQL> update test02 set salary = 1100 where id = 1;
20:10:09 SQL> update test02 set salary = 1200 where id = 1;           --事物2:這裏對同一行數據在同一個事物中更新了2次
20:10:09 SQL> commit;
20:11:10 SQL> update test02 set salary = 1400 where id = 1;           --事物3:再次數據更新
20:11:10 SQL> commit;
20:12:11 SQL> update test02 set salary = 1600 where id = 1;           --事物4:再次數據更新 
20:12:11 SQL> commit;
20:13:09 SQL> delete from test02 where id = 2;
20:13:09 SQL> commit;

接下來,我們通過閃回事物查詢來看一下id=1的事物記錄

20:15:27 SQL> select
           2    versions_xid,
           3    versions_starttime,
           4    versions_endtime,
           5    versions_operation,
           6    salary
           7  from
           8    test02
           9  versions between timestamp minvalue and maxvalue
          10  where
          11    id = 1;
 
VERSIONS_XID     VERSIONS_STARTTIME        VERSIONS_ENDTIME          VERSIONS_OPERATION SALARY
---------------- ------------------------  ------------------------- ------------------ ------
0300080046030000 07-10月-17 08.12.09 下午                                  U                  1600             --事物4:再次數據更新
07001A006D020000 07-10月-17 08.11.09 下午  07-10月-17 08.12.09 下午     U                  1400             --事物3:再次數據更新
070019006C020000 07-10月-17 08.10.03 下午  07-10月-17 08.11.09 下午     U                  1200             --事物2:這裏執行了2次更新,很明顯,第一次更新未記錄
0400090080020000 07-10月-17 08.09.27 下午  07-10月-17 08.10.03 下午     I                  1000             --事物1:第一次數據插入

(四)閃回事物查詢

(1)

(五)閃回表

(1)主要功能

閃回表是將表恢復到過去的某個狀態,閃回表與閃回查詢不同,閃回查詢只是得到過去某個時刻的快照,並不改變表的當前狀態,而閃回表則是將表及附屬對象一起恢復到以前的某個時刻的狀態。

(2)相關設置

(2.1)權限設置

為了使用FLASHBACK TABLE語句,用戶需具有下列權限:

--需要具有FLASHBACK ANY TABLE系統權限,或者具有相應對象的FLASHBACK對象權限;

--用戶對相應表需具有INSERT、SELECT、DELETE、ALTER的對象權限;

--如果要執行FLASHBACK TABLE … RESTORE POINT語句,需具有SELECT ANY DICTIONARY或FLASHBACK ANY TABLE系統權限,或具有SELECT_CATALOG_ROLE角色。

(2.2)表結構

當前表結構與要恢復到的時間點的表結構必需相同。例如表的升級(UPGRADE)、結構重組(MOVE)、數據的刪減(TRUNCATE)、添加約束、修改列、刪除列等操作都改變了表的結構,不能進行閃回操作。

(2.3)行移動

執行FLASHBACK TABLE之前,需要啟用表的ROW MOVEMENT特性,閃回操作後,行的ROWID將會發生變化。

ALTER TABLE table_name ENABLE ROW MOVEMENT;

(3)語法

FLASHBACK TABLE [SCHEMA.]table_name TO SCN|TIMESTAMP expression

[ENABLE|DISABLE TRIGGERS]

參數解釋:

--ENABLE|DISABLE TRIGGERS:在閃回表的過程中,表上的觸發器是啟用還是禁用。默認在閃回表的過程中禁用觸發器,閃回完成後啟用觸發器

(4)例子4、閃回表操作

--創建測試樣例

--17:08:12
create table test04
(
  id         number(2),
  name       varchar(20),
  salary     varchar(30)
);

--17:18:05
create index idx_test04_id on test04(id); 

--17:38:10
insert into test04 values(1,liming,1000);

--17:39:08 
insert into test04 values(2,zhanghua,2000);

--17:40:10
insert into test04 values(3,wangfang,3000);

--17:41:11
update test04 set salary = 1100 where id = 1;

--17:42:06
delete from test04 where id = 3;

最終得到的表與索引如下:

SQL> select * from test04;
 ID NAME                 SALARY
--- -------------------- ------------------------------
  1 liming               1100
  2 zhanghua             2000


SQL> select index_name,table_name,status from user_indexes;
INDEX_NAME                     TABLE_NAME                     STATUS
------------------------------ ------------------------------ --------
IDX_TEST04_ID                  TEST04                         VALID

接下來,開啟行移動:

--開啟行移動
alter table test04 enable row movement;

執行閃回表操作:

--(1)將表閃回到17:42:00(在執行delete from test04 where id = 3之前)
flashback table test04 to timestamp to_timestamp(2017-10-09 17:42:00,yyyy-mm-dd hh24:mi:ss);

--查看結果:
--(1.1)表數據變化,發現被刪除的數據被還原
17:48:18 SQL> select * from test04;

  ID NAME     SALARY
---------- -------------------- ------------------------------
   1 liming   1100
   2 zhanghua   2000
   3 wangfang   3000

--(1.2)索引未變化
SQL> select index_name,table_name,status from user_indexes;

INDEX_NAME               TABLE_NAME              STATUS
------------------------------ ----------------------------
IDX_TEST04_ID               TEST04                  VALID


--(2)將表閃回到17:41:00(在執行update test04 set salary = 1100 where id = 1之前)
17:49:12 SQL> flashback table test04 to timestamp to_timestamp(2017-10-09 17:41:00,yyyy-mm-dd hh24:mi:ss);

SQL> select * from test04;  --表中數據回到update之前的狀態

  ID NAME     SALARY
---------- -------------------- ------------------------------
   1 liming   1000
   2 zhanghua   2000
   3 wangfang   3000

SQL> select index_name,table_name,status from user_indexes;
INDEX_NAME                     TABLE_NAME                     STATUS
------------------------------ ------------------------------ --------
IDX_TEST04_ID                  TEST04                         VALID

--(3)將表閃回到17:40:00(在執行insert into test04 values(3,‘wangfang‘,3000)之前)
17:51:00 SQL> flashback table test04 to timestamp to_timestamp(2017-10-09 17:40:00,yyyy-mm-dd hh24:mi:ss);


17:52:37 SQL> select * from test04;    --只有2條數據

    ID NAME         SALARY
---------- -------------------- ------------------------------
     1 liming        1000
     2 zhanghua        2000

總結:

使用閃回表技術,可以將表閃回到過去的某個時刻。其附屬對象(如,索引)也會返回到過去的某個狀態,且不會失效。

(六)閃回刪除

(1)主要功能

利用閃回刪除可以恢復用DROP TABLE刪除的表,是一種對意外刪除的表的恢復機制。閃回刪除主要是通過Oracle的回收站(recyclebin)功能實現的,在Oracle 11g中,當用戶執行了DROP TABLE後,並不立即回收表極其相關聯對象(索引、約束、觸發器等)的空間,而是將它們重新命名後放入一個稱為回收站的空間存儲起來,當用戶決定永久刪除或該表的存儲空間不足時,表才會被刪除,空間才會被回收。

(2)回收站管理

(2.1)啟用回收站

Oracle 11g默認開啟回收站功能:

SQL> show parameter recyclebin
 
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
recyclebin                           string      on

如果未開啟,則可以手動開啟:

ALTER SYSTEM SET RECYCLEBIN=ON;

(2.2)查看回收站信息

可通過查看USER_RECYCLEBIN(synonym:RECYCLEBIN)、DBA_RECYCLEBIN來查看被刪除表的信息

SQL> select object_name,original_name,type from dba_recyclebin;
 
OBJECT_NAME                    ORIGINAL_NAME                    TYPE
------------------------------ -------------------------------- -------------------------
BIN$Uo3E67rjHgvgUKjAhfUmRg==$0 MGMT_IP_REPORT_NLS_MAP           TABLE
BIN$Uo3E67riHgvgUKjAhfUmRg==$0 PK_MGMT_IP_NLS_MAP               INDEX

其中,OBJECT_NAME是刪除對象在回收站中的名字,ORIGINAL_NAME是表的最初的名字。

(2.3)清除回收站

清除回收站的語法為:

PURGE [TABLE table_name] | [INDEX index_name] | [RECYCLEBIN] | [DBA_RECYCLEBIN] | [TABLESPACE tablespace_name [USER user_name]]

參數解釋:

--TABLE:從回收站中清空表,並釋放空間,表名可以使OBJECT_NAME,也可以是ORIGINAL_NAME;

--INDEX:與清空表一樣;

--RECYCLEBIN:清空當前用戶的回收站,並釋放空間;

--DBA_RECYCLEBIN:清空數據庫所有用戶的回收站,並釋放空間;

--TABLESPACE:清空回收站中指定表空間的對象,並釋放空間;

--USER:清空回收站中指定表空間中指定用戶的對象,並釋放空間

(2.4)例子5、清空所有用戶的回收站

SQL> purge dba_recyclebin ;

DBA Recyclebin purged.

(3)閃回刪除操作語法

FLASHBACK TABLE [schema.]table_name TO BEFORE DROP [RENAME TO new_name];

(4)例子6,閃回刪除測試

--測試表test05
SQL> select * from test05;    
 ID AGE NAME
--- --- --------------------
  1  20 lijiaman
  2  22 liudedong

--刪除test05
SQL> drop table test05;
Table dropped

--查看表,已經不存在
SQL> select * from test05;
ORA-00942: table or view does not exis

--查看回收站,test05已經移動到了回收站
SQL> select object_name,original_name,type from user_recyclebin; 
OBJECT_NAME                    ORIGINAL_NAME                    TYPE
------------------------------ -------------------------------- -------------------------
BIN$Wx9kjXdn7QXgUKjAHwEcmQ==$0 TEST05                           TABLE

--執行閃回刪除,將表還原
SQL> flashback table test05 to before drop; 
Done
 
--再次查看回收站,test05已經從回收站移出
SQL> select object_name,original_name,type from user_recyclebin; 
OBJECT_NAME                    ORIGINAL_NAME                    TYPE
------------------------------ -------------------------------- -------------------------

--再次查看test05表,已經還原回來
SQL> select * from test05; 
 ID AGE NAME
--- --- --------------------
  1  20 lijiaman
  2  22 liudedong

Oracle閃回技術[未完]