【聽海日誌】之Oracle 10g閃回資料庫

聽海★藍心夢發表於2012-07-09
一、何時使用閃回技術

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引數是設定閃回資料的最長儲存時間,單位是分鐘;預設值是1440(60*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一定要用雙引號括起來,而不是單引號。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/751371/viewspace-734988/,如需轉載,請註明出處,否則將追究法律責任。

相關文章