1. 程式人生 > >Oracle Flushback 學習測試

Oracle Flushback 學習測試

 

Oracle Flushback 學習測試:三思筆記

 

Flashback恢復

 9i開始,利用oracle查詢的多版本一致的特點,實現從回滾段中讀取一定時間內在表中操作的資料,被稱為 flashback query,到10g,利用recycle(回收站)和flask recovery area(閃回區)的特性,來實現快速恢復被刪除的表,甚至對整個db進行時間點的閃回,

1 閃回查詢

  Flashback query利用oracle的多版本讀一致性undo tablespace 中讀取操作前的資料,

  要使用閃回查詢特性,

必須啟用自動撤銷管理表空間,記錄集的選擇範圍可以基於時間或者scn,甚至還可也查詢記錄在undo中的不同事物的前映像

1.1應用flashback query查詢過去的資料

1.1.1基於時間的查詢(as of timestamp)

 建立一個表

 create table t_flashback as 

select rownum  rn from dual connect by rownum<10

然後 delete from t_flashback

select * from t_flashback as of timestamp sysdate-5/1440—得出5分中前的資料

然後在

insert into t_flashback

select * from t_flashback as of timestamp sysdate-5/1440

1.1.2 基於scn的恢復(as of scn)

  基於scn,先得到scn

select DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER

 from dual

grant execute on DBMS_FLASHBACK to scott

 -- select current_scn from v$database

恢復 select * from t_flashback as of scn 2412653

 利用timestamp,也會轉換成scn

desc sys.smon_scn_time—時間與scn的對應表

CREATE TABLE SYS.SMON_SCN_TIME

(

  THREAD        NUMBER,

  TIME_MP       NUMBER,

  TIME_DP       DATE,

  SCN_WRP       NUMBER,

  SCN_BAS       NUMBER,

  NUM_MAPPINGS  NUMBER,

  TIM_SCN_MAP   RAW(1200),

  SCN           NUMBER                          DEFAULT 0,

  ORIG_THREAD   NUMBER                          DEFAULT 0           /* for downgrade */

)

CLUSTER SYS.SMON_SCN_TO_TIME(THREAD)

NOCOMPRESS ;

  10g中,系統平均每3秒產生一次與系統時間對應的scn的匹配並存入SYS.SMON_SCN_TIME中,

 可以手動轉換

   select timestamp_to_scn(sysdate) from dual—轉換為scn

   select to_char(scn_to_timestamp(2412364),'yyyy-mm-dd hh24:mi:ss') from dual

1.1.3 使用DBMS_FLASHBACK實現flashback query

 

1.2 應用dbms_flashback查詢操作的事務

1.2.1 使用flashback version query 查詢記錄修改版本

  通過version between能檢視指定時間段內的undo表空間中記錄的不同版本(只包括被提交的記錄)

  select rn,versions_startscn,versions_endscn,versions_operation,versions_xid from T_FLASHBACK versions between scn 2413982 and  2413988

ORA-30054: invalid upper limit snapshot expression

1.2.2 利用flashback version query查詢事務資訊

 檢視flashback_transaction_query

desc flashback_transaction_query

delete from t_flashback

commit

select DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER from dual-- 2413988

獲取scn

 Grant select any TRANSACTION to scott

select XID,COMMIT_SCN,COMMIT_TIMESTAMP,OPERATION,UNDO_SQL

 from FLASHBACK_TRANSACTION_QUERY q where q.xid in(

 select versions_xid from T_FLASHBACK  versions between scn 2413982 and  2414572)

結果

080020001F060000 2413986 2013-8-5 16:22:52 INSERT delete from "SCOTT"."T_FLASHBACK" where ROWID = 'AAANM8AAAAAAAAAAAA';

 

1.3 flashb query的注意事項

1.3.1自動撤銷管理表空間

 要使用flashback的相關特性,必須啟用自動撤銷管理表空間

 是否啟用了自動撤銷表空間管理,有2個初始化引數

 Undo_management:值為auto表示使用了自動撤銷管理,為manul表示手動

select * from v$parameter where name like'%undo_management%'

 Undo_tablespace:oracle db可以建立多個undo 表空間,不過同時只能使用一個,當上個引數為auto時,此引數用來指定當前使用的undo tablespace,

select *from dba_tablespaces where contents='UNDO'

select * from v$parameter where name like'%undo_tablespace%'

 Undo的大小,直接影響到flashback的能力,

select * from v$parameter

undo_tablespace UNDOTBS1

undo_retention 900

select * from v$tablespace

select file#,name,bytes/1024/1024  from v$datafile

/u01/app/oracle/oradata/hongquan/undotbs01.dbf

1.3.2 undo_retention引數

 用來指定undo段中資料儲存的最短時間(預設900s),新事物的開始,undo被寫滿,則會覆蓋以前的undo資訊,沒寫滿,時間過了也不會被覆蓋,

 只有在為undo指定了retention guarantee在指定的日期之前不會覆蓋undo的資料

 Alter tablespace undo1 retention guarantee 開啟

 Alter tablespace undo1 retention noguarantee關閉

例如,procedure,在user_source中找到。

select * from DBA_source where type='PROCEDURE' AND NAME='P'  --as of scn 2416811

select * from DBA_source as of scn 2416800  where type='PROCEDURE' AND NAME='P'  conn / as sysdba

1.3.3 ddl的影響

  修改並提交資料後,對該表做過ddl操作

Drop/modify列

Move表

Drop表(如果有partition)

Truncate table/partition  這些操作會令undo表空間中的撤銷資料消失,這些操作對錶使用後,進行flashback query操作會發生ora-01466

另外閃回查詢也支援對遠端資料訪問select* from [email protected] as of tiemstamp/scn

create table test12 (b number)

 

insert into test12

values(10)

alter table test12 add(c number)

 

select * from test12 as of timestamp sysdate-2/24----undo中已經失效

10

10

2 flashback table 閃回表

 10g中引入了recycle bin(回收站)主要針對被刪除的表及關聯的物件,trigger,index,constraint,被刪除的物件並非真正的刪除,先修改資料字典,將其改名放入recycle bin中

 2.1 recycle bin 中恢復

 

2.1.1 簡單的刪除恢復

drop table t_flashback

select * from recyclebin—檢視被刪掉的表

T_FLASHBACK DROP TABLE YYHHQQ 2013-08-05:15:34:36 2013-08-05:17:26:26

flashback table T_FLASHBACK to before drop---表被恢復

 此時在recyclebin T_FLASHBACK已經消失

 表關聯的index也被恢復成功,但是名字需要改

 Alter index xxx rename to xxx

create table test12 (b number)

 

insert into test12

values(10)

 

select * from test12

 

drop table test12

 

select * from recyclebin

 

flashback table TEST12 to before drop

 

drop table t_flashback

 

select * from recyclebin

 

flashback table t_flashback to before drop

 

select * from t_flashback

 2.1.2 複雜的恢復

  當恢復在oracle已經存在的表名,

 flashback table T_FLASHBACK to before drop rename to T_FLASHBACK_OLD

2.1.3 從多次刪除中恢復

 flashback table T_FLASHBACK to before drop

flashback table T_FLASHBACK to before drop rename to T_FLASHBACK2最先刪除的表最先被恢復

 可以直接指定表名

 Flashback table xxxx’ to before drop

2.2 undo中恢復

Flashback table T_FLASHBACK to scn 2416800  或者timestamp

----所有記錄恢復到指定的狀態

--select * from table1;

--select dbms_flashback.get_system_change_number from dual; 記錄scn2416800  

--select *from table1 as of scn 2416800  

--flushback table table1 to scn 2416800  

 

2.3 應用flashback table的注意事項

 2.3.1 基於undo的恢復

  基於undo的被恢復的表必須啟用row movement

select row_movement from user_tables where table_name='T_FLASHBACK'

DISABLED/enabled

 手動開啟  alter table T_FLASHBACK enable  row movement

 手動關閉  alter table T_FLASHBACK disable  row movement

 基於undo表的恢復注意ddl的影響

 可以手動enable triggers

 可以恢復索引,但是統計資訊不回恢復到指定時間段

 基於undo的表恢復不支援:物化檢視,系統表,遠端表,物件表,巢狀表,表分割槽,子分割槽,聚簇表,高階佇列

 2.3.2 基於recycle bin的恢復

Flashback drop,手動恢復constraint

所操作的表必須是存在本地表空間管理中

被恢復的index 等要重新命名

當刪除表時,被依賴的物化檢視也同時刪除,恢復時,不能恢復物化檢視

恢復時,缺失index等時資料檔案空間不足

可以同時恢復多個表

Flashback drop只能恢復drop的表

2..4 認識和管理recycle bin

2.4.1 檢視recycle bin中的物件

 Select  * from recyclebin ;資料字典 user_recyclebin

 Recycle bin中的內容允許訪問,不能修改,

查詢其一個表的內容

select * from "BIN$72xmvC1tT7eKJxEZluwquA==$0"

recycle bin中的物件也能夠支援flashback query,

select * from "BIN$72xmvC1tT7eKJxEZluwquA==$0" as of timestamp sysdate-1

2.4.2 recycle bin的管理

  回收站的空間是有限的,主動觸發回收站清除內容,就是回收站空間不足,

  表空間無足夠的空閒空間,並且沒有新的擴充套件,

  該表空間內要建立新的物件,需要分配空間

Recycle bin清除的遠原則是先進先出。

 2.4.3 主動清除recycle bin中的物件

   1 修改初始化引數禁用或啟用recycle bin

10g後新增的recyclebin,預設是開啟,

SQL> show parameter recyclebin;

 

NAME                                 TYPE

------------------------------------ ----------------------

VALUE

------------------------------

recyclebin                           string

on

 

Alter session set recyclebin=off;/on 設定為off後,所有drop的物件都不會存放在回收站中

   2 刪除時指定purge引數

當通過drop刪除表時,預設不會把這個表所佔用的空間給釋放,

drop table T_FLASHBACK

select * from recyclebin

flashback table "BIN$yOxeoMpGQwmdgemrC0lD7Q==$0"to before drop

drop table T_FLASHBACK purge—後不存在recyclebin

3 清除recyclebin中的現有物件

 create table T_FLASHBACK(id number)

drop table T_FLASHBACK

select * from recyclebin

purge table T_FLASHBACK

 或者 purge recyclebin

 或者 purge tablespace yyhhqq

3 flashback database閃回資料庫

 Flashback database閃回資料庫,可以把db恢復到指定的時間點,

3.1 認識flashback database

 3.1.1 瞭解flashback database

  常規備份是“備份+有效歸檔”,

  從啟用flashback database開始到當前那一刻,藉助於flashback database,可以將db修復到這中間點的任意時刻,

 

 

3.1.2 原理

Oracle 引入了另外一個日誌flashback logs,記錄下操作執行前要修改的資料,即資料的前映像,這些資訊被寫入一個專門的區域(閃回區),

Oracle建議flash recovery area,能容納下所有的(資料檔案,控制檔案,redo,備份檔案,增量備份檔案,以及尚未歸檔的檔案,和flash logs),

3.1.3 必要條件

 1 資料庫必須處於歸檔模式

 2 資料庫必須知道了flash recovery area

flash recovery area 兩個引數:db_recovery_file_dest 指定fra的路徑,可以指定一個檔案系統下的路徑,或者asm磁碟組,不能指向裸裝置,

 db_recovery_file_dest_size:指定fra的大小

 show parameter db_recover

SQL> show parameter db_recover;

NAME                                 TYPE       VALUE

------------------------------------ ---------- ------------------------------

db_recovery_file_dest                string     /u01/app/oracle/flash_recovery

                                                _area

db_recovery_file_dest_size           big intege 2G

    SQL> alter system set db_recovery_file_dest_size=4g;

System altered.

SQL> alter system set db_recovery_file_dest='f:\mydb\fra';

System altered.

 3 資料庫必須啟動flashback on

    select flashback_on from v$database

SQL> alter database flashback on;

alter database flashback on

*

ERROR at line 1:

ORA-38759: Database must be mounted by only one instance and not open.

 要改變設定db必須處於mount狀態,並且已經打開了歸檔模式,

SQL> conn /as sysdba

Connected.

SQL> shutdown immediate

Database closed.

Database dismounted.

ORACLE instance shut down.

SQL> startup mount

ORACLE instance started.

Total System Global Area  285212672 bytes

Fixed Size                  1218992 bytes

Variable Size             109053520 bytes

Database Buffers          171966464 bytes

Redo Buffers                2973696 bytes

Database mounted.

SQL> alter database flashback on;

Database altered.

SQL> alter database open;

Database altered.

SQL> select flashback_on from v$database;

FLASHBACK_ON

------------------

YES

SQL> set time on-------多了一個程序

17:07:15 SQL> ho ps -ef|grep rvm

oracle   16473 21307  0 17:07 pts/0    00:00:00 /bin/bash -c ps -ef|grep rvm

4 初始化引數:db_flashback_retention_target

  用來控制 flask logs的保留時間,或者希望flashback database最早恢復的時間點,預設1440分

select * from v$parameter where name='db_flashback_retention_target'1天),

5 啟用force logging

  Force logging用來強制把所有操作都記錄在redo中,

 select force_logging from v$database

SQL> alter database force logging;

Database altered.

3.1.4 制約因素

1 flashback database用來恢復到某個時間點,不用於介質恢復,不能用flashback database恢復之前被刪除的資料檔案。

2 如果控制檔案被重建,再次之前產生的所有的flashback logs統統失效,

3 不支援對資料庫進行(shrink)操作後的恢復

3.2 flashback database示例

 1 檢查是否啟用了fra

 SQL> show parameter db_recover;

 2 檢查是否啟用了歸檔

 Sysdba

SQL> select flashback_on from v$database;

FLASHBACK_ON

------------------

YES

SQL> archive log list;

Database log mode              Archive Mode

Automatic archival             Enabled

Archive destination            USE_DB_RECOVERY_FILE_DEST

Oldest online log sequence     3

Next log sequence to archive   5

Current log sequence           5

3 檢查是否啟用了flashback on跟force logging

 select force_logging ,flashback_on from v$database

4 查詢當前scn

select DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER from dual---- 2449174

5 模擬誤操作

6 重做啟動到mount狀態

 Shutdown immediate

 Startup mount

 Flashback database to scn 2449174

 7 2中方式修復資料庫

   1 直接alter database open resetlogs:指定scn後的資料全部丟失,方式資料處於不一致的狀態

   2 先執行alter database open read only,read only模式開啟資料庫,然後立刻匯出誤操作的資料,再執行recover database以重新應用資料庫產生的redo,將db修復到flashback database操作之前,

 

一、何時使用閃回技術

 

  當 Oracle 資料庫中發生了邏輯損壞時,如果您需要快速容易地恢復資料,就必須使用閃回技術。與發生人為錯誤的情況一樣,很難標識受錯誤事務處理影響的物件和行。

使用閃回技術時,可診斷出錯誤是如何引入到資料庫中的,然後可修復損壞的資料。您可以檢視導致特定行修改的事務處理,檢視某個時間段內指定行的整個版本集,或者

只檢視過去特定時間顯示的資料。幻燈片表中顯示了閃回技術的典型用法。

 

  閃回資料庫使用閃回日誌執行閃回。閃回刪除使用回收站。其它所有功能都使用還原資料。並不是所有閃回功能都會修改資料庫。有些功能只是一些用來查詢資料

其它版本的方法。這些工具用來檢視問題並幫助進行恢復。根據閃回查詢結果,可執行下列其中一項操作:

 

確定執行哪種型別的資料庫修改閃回操作來修復問題。

 

將這些查詢結果集反饋到 INSERTUPDATE  DELETE 語句以便於修復錯誤資料。

 

二、閃回資料庫概要

 

使用閃回資料庫時,通過還原自先前某個時間點以來發生的所有更改,可快速將資料庫恢復到較早的時間點。這個操作速度很快,因為不需要還原備份。

使用這個功能可撤消導致邏輯資料損壞的更改。如果資料庫發生介質丟失或物理損壞,則必須使用傳統恢復方法。

 

三、閃回資料庫減少還原時間

 

閃回資料庫比使用還原檔案和重做日誌檔案的傳統時間點恢復的速度要更快。隨著資料庫規模的增加,通過還原所有資料檔案來執行傳統的時間點恢復所需的時間長

度變得不太現實。使用閃回資料庫時,因為不需要還原資料檔案,所以恢復資料庫的時間與需要回退的更改數目(而不是資料庫大小)成比例。

 

閃回資料庫是通過使用一類被稱為閃回資料庫日誌的日誌檔案來實施的。Oracle 資料庫會定期將資料塊的前像記錄在閃回資料庫日誌中。為了快速將資料檔案更改

回退到捕獲閃回日誌的時間(就在所需目標時間之前),可以重用塊影象。然後,應用重做日誌檔案中的更改來填充間隔。在快速恢復區中會自動建立和管理閃回資料庫日誌。

 

四、閃回資料庫注意事項

 

在不能使用閃回資料庫功能的情況下,必須使用不完全恢復操作將資料庫返回到特定時間。閃回資料庫操作完成後,可在只讀模式下開啟資料庫,驗證是否使用了正確

的目標時間或系統更改號 (SCN)。如果沒有,可以再次閃回資料庫,或者通過執行恢復操作來前滾資料庫。因此,要撤消閃回資料庫操作,必須向前恢復資料庫。

 

注:閃回保留目標並不能絕對保證閃回可用。如果快速恢復區中必需存在的檔案需要佔用空間,可能會自動刪除閃回日誌。

 

五、閃回資料庫限制

 

  不能使用閃回資料庫恢復自閃回目標時間以來已刪除的資料檔案。刪除的資料檔案會新增到控制檔案中且標記為離線,但是不會閃回。閃回資料庫不能閃回自閃回目

標時間以來已收縮的資料檔案。這種資料檔案必須先離線,才能執行閃回操作。

 

六、閃回資料庫實施

 

  使用FLASHBACK DATABASE可以恢復資料庫到先前的某個時間點或者某個SCN號。在Oracle10g以前的版本中,要實現資料庫恢復到過去某個時間點或者SCN號,

只能夠通過資料庫的不完全恢復實現。從Oracle 10g開始,可以使用FLASHBACK DATABASE實現。使用FLASHBACK DATABASE要比執行資料庫系統的不完全恢復要快的多,但是需要對資料庫做以下的配置:

 

1、資料庫必須執行在歸檔模式下。

 

2、必須啟用資料庫的閃回功能。

 

3、必須配置初始化引數DB_FLASHBACK_RETENTION_TARGET

 

注:db_flashback_retention_target引數是設定閃回資料的最長儲存時間,單位是分鐘;預設值是144060*24),即1天。

 

6.1 閃回操作的語法

 

FLASHBACK [STANDBY | DATABASE] [資料庫名稱] to SCN SCN| TIMESTAMP 時間表達式 | restore point 恢復點

 

6.2 配置閃回資料庫選項

 

SQL> shutdown immediate;

 

資料庫已經關閉。

 

已經解除安裝資料庫。

 

ORACLE 例程已經關閉。

 

SQL> startup mount;

 

ORACLE 例程已經啟動。

 

Total System Global Area 289406976 bytes

 

Fixed Size                  1248600 bytes

 

Variable Size              92275368 bytes

 

Database Buffers          192937984 bytes

 

Redo Buffers                2945024 bytes

 

資料庫裝載完畢。

 

SQL> select name,log_mode,open_mode,flashback_on from v$database;

 

NAME      LOG_MODE     OPEN_MODE FLASHBACK_ON

 

--------- ------------ ---------- ------------------

 

MYORACLE ARCHIVELOG   MOUNTED    NO

 

當前閃回資料庫的開關沒有開啟,需要設定開啟閃回開關。設定FLASHBACK_ON必須將資料庫載入到MOUNT狀態進行。

 

SQL> alter database flashback on;

 

資料庫已更改。

 

SQL> alter system set db_flashback_retention_target=3600;

 

系統已更改。

 

SQL> alter database open;

 

資料庫已更改。

 

6.3 閃回到某個時間點

 

SQL> select to_char(oldest_flashback_time,'yyyy-mm-dd hh24:mi:ss')

 

from v$flashback_database_log;

 

TO_CHAR(OLDEST_FLAS

 

-------------------

 

2011-07-12 10:20:59

 

SQL> drop table scott.emp;

 

表已刪除

 

SQL> shutdown immediate;

 

資料庫已經關閉。

 

已經解除安裝資料庫。

 

ORACLE 例程已經關閉。

 

SQL> startup mount;

 

ORACLE 例程已經啟動。

 

Total System Global Area 289406976 bytes

 

Fixed Size                  1248600 bytes

 

Variable Size              92275368 bytes

 

Database Buffers          192937984 bytes

 

Redo Buffers                2945024 bytes

 

資料庫裝載完畢。

 

SQL> flashback database to timestamp to_date('2011-07-12 10:20:59','yyyy-mm-dd hh24:mi:ss');

 

閃回完成。

 

SQL> alter database open resetlogs;

 

資料庫已更改。

 

SQL> select * from scott.emp;

 

EMPNO ENAME    JOB     MGR HIREDATE  SAL     COMM     DEPTNO

 

---------- ---------- --------- ---------- -------------- ---------- ---------- ----------

 

7369 SMITH      CLERK       7902 17-12-80      800         20

 

7499 ALLEN      SALESMAN   7698 20-2 -81     1600        300         30

 

7521 WARD       SALESMAN        7698 22-2 -81           1250

 

……………………

 

已選擇14行。

 

6.4 閃回到某個系統更改號(SCN

 

SQL> select oldest_flashback_scn from v$flashback_database_log;

 

OLDEST_FLASHBACK_SCN

 

--------------------

 

              846734

 

SQL> truncate table scott.emp;

 

表被截斷。

 

SQL> select * from scott.emp;

 

未選定行

 

SQL> shutdown immediate;

 

資料庫已經關閉。

 

已經解除安裝資料庫。

 

ORACLE 例程已經關閉。

 

SQL> startup mount;

 

ORACLE 例程已經啟動。

 

Total System Global Area 289406976 bytes

 

Fixed Size                  1248600 bytes

 

Variable Size              96469672 bytes

 

Database Buffers          188743680 bytes

 

Redo Buffers                2945024 bytes

 

資料庫裝載完畢。

 

SQL> flashback database to scn 846734;

 

閃回完成。

 

SQL> alter database open resetlogs;

 

資料庫已更改。

 

SQL> select * from scott.emp;

 

EMPNO ENAME    JOB    MGR HIREDATE    SAL   COMM   DEPTNO

 

---------- ---------- --------- ---------- -------------- ---------- ---------- ----------

 

7369 SMITH      CLERK      7902 17-12-80    800     20

 

7499 ALLEN      SALESMAN   7698 20-2-81   1600    300     30

 

7521 WARD       SALESMAN   7698 22-2-81  1250

 

………………

 

已選擇14行。

 

七、Oracle資料庫回收站

 

Oracle也有回收站,如果不小心drop掉了哪張表,或誤刪了記錄,可以通過回收站閃回。首先查看回收站中有哪些物件被刪除:

 

SQL> select * from recyclebin t;

 

主要欄位有object_nameoriginal_namecreatetimedroptimeoriginal_name就是你刪除物件之前在oracle裡面的名稱,根據droptime我們可以找到當時你刪除的版本的object_name,然後根據object_name就可以進行閃回。

 

SQL> flashback table "BIN$SxyIpbUaSlGWt9j/dEZEhw==$0" to before drop rename to gis_link;

 

注:object_name一定要用雙引號括起來,而不是單引號。