10g閃回總結

litterbaby發表於2007-04-01

10g閃回總結

[@more@]

10g閃回總結

Oracle9i就有了閃回這個新功能,在Oracle 10g中這個功能被大大增強。在Oracle 9i中只是以閃回查詢的形式檢視某一時間點上的資料,就是某一時刻的資料的快照,而不是在兩個時間點之間的被更改資料的執行狀態的表示,在Oracle 10g中就提供了這樣的功能。

優點

閃回應該說是一個技術革新,比傳統意義上的恢復更快更加簡單方便。傳統意義上的恢復需要還原資料庫和資料檔案,而這些資料檔案則是在前一階段備份而來的。然後在透過資料庫日值在資料檔案上的前滾來實現資料的每一次改變。這樣的過程相對而言是比較慢的。而閃回透過事務或者行的改變來構架閃回,只有資料的改變的前像和後像被儲存。

閃回技術應用的範圍

閃回技術恢復在Oracle 10g上提供了三個級別的恢復。我們可以根據不同的應用來實現不同的級別的資料庫恢復實現。

資料庫級

n Drop user (Flashback Database)

n Truncate table (Flashback Database)

n Batch job : partial change (Flashback Database)

表級

n Drop table (flashback drop)

n Update with wrong where clause (Flashback table)

n Compare current data against the data at some time in the past (Flashback Query)

事務級

Batch job runs twice, but you are unsure of the objects affected (Flashback Query

需要的許可權

由於需要使用不同的閃回版本則是需要不同的許可權:

n Flashback Database:

SYSDBA database connection

n Flashback Table or Flashback Versions Query:

FLASHBACK ANY TABLE

Appropriate object privileges

n Flashback Transaction Query:

SELECT ANY TRANSACTION

閃回資料庫

這個功能是非常強大的,在上面也介紹了,當發生錯誤使用drop user,刪除使用者這樣的錯誤的時候,是必須使用資料庫閃回來進行恢復的,這項功能能夠使得快速將你的資料庫返回到以前某個時間點上的狀態,從而恢復你的資料庫。能夠使用這個功能實現邏輯資料實效的錯誤,在這裡需要解釋的是,在閃回恢復和通常的日誌恢復的不同。

閃回恢復是將你現在的資料庫回退到以前的某個時間點,主要目的是為了解決資料庫上人為的邏輯錯誤,注意這是邏輯錯誤,意義就是說,是由於人為的錯誤,而發現的相對比較早,在閃回恢復的時間期限內。

而日誌恢復則是將資料庫還原到以前的某個時間點(實在你需要恢復的時間點之前的時間點),這裡的根據你恢復的不同而還原,如果是隻是恢復資料檔案,只是需要還原這個資料檔案。使用歸檔和聯機日誌檔案將你的資料庫應用到當前或者以前的某個時間點。主要目的是為了恢復物理上的錯誤。

閃回恢復資料庫之所以說要比普通意義上的恢復快的原因就是因為,在閃回恢復資料庫是沒有還原這一說的。

閃回資料庫也是透過應用日誌來恢復資料庫,只不過不是使用重做日誌,而是使用的是閃回日誌。

機制

由圖上可以看到,閃回資料庫使用的是一個新的日誌:閃回資料庫日誌,Oracle資料庫伺服器定期在閃回資料庫日誌資料塊的前像寫入到日誌檔案中去。當進行閃回資料庫恢復的時候,日誌上的前像將被回滾應用在資料庫的資料檔案中。閃回資料庫日誌是被自動管理和新增到恢復區域的。當閃回資料庫被開啟的時候,會有一個新的恢復寫程式RVWR被開啟。

啟動配置閃回資料庫

1、 配置flash 恢復區域

2、 設定引數db_flashback_retention_target

這個引數的單位是分鐘。指定的是一個資料庫可以使用閃回恢復的時間,這個時間越長,需要的閃回恢復區域就月大。

SQL> show parameter flashback

NAME TYPE VALUE

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

db_flashback_retention_target integer 1440

SQL>

3、使用ALTER DATABASE FLASHBACK ON;將資料庫啟動為閃回資料庫狀態。

ALTER DATABASE FLASHBACK ON;

這裡需要注意的是資料庫需要是在archivelog模式之下啟動閃回資料庫,並使用MOUNT EXCLUSIVE模式下執行的。

開啟閃回資料庫以後可以透過查詢檢視v$database的列flashback_on來檢視閃回資料庫是否開啟。

SQL> select FLASHBACK_ON from v$database;

FLASHBACK_ON

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

YES

例項:

SQL> startup mount

ORACLE 例程已經啟動。

Total System Global Area 83886080 bytes

Fixed Size 1247420 bytes

Variable Size 67110724 bytes

Database Buffers 12582912 bytes

Redo Buffers 2945024 bytes

資料庫裝載完畢。

SQL> alter database flashback on;

資料庫已更改。

SQL> select flashback_on from v$database;

FLASHBACK_ON

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

YES

SQL> alter database open;

資料庫已更改。

SQL>

關閉閃回資料庫

關閉閃回資料庫狀態需要使用命令:

ALTER DATABASE FLASHBACK OFF;

SQL> select FLASHBACK_ON from v$database;

FLASHBACK_ON

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

NO

閃回資料庫

閃回資料庫由三種方式進行,一種是使用OEMUI操作,二種是使用RMAN進行。三是使用SQL PLUS來實現。OEM在這裡就不介紹了。

使用RMAN

將資料庫恢復到一個時間點

RMAN> FLASHBACK DATABASE

2> TO TIME = TO_DATE

3> ('2002-12-10 16:00:00',

4> 'YYYY-MM-DD HH24:MI:SS');

將資料庫閃回恢復到一個SCN

RMAN> FLASHBACK DATABASE TO SCN=23565;

指定一個redo日誌的SEQUENCETHREAD號,作為閃回恢復的上限。這個功能是RMAN特有的。

RMAN> FLASHBACK DATABASE

2> TO SEQUENCE=223 THREAD=1;

使用SQL*Plus

將資料庫恢復到一個時間點

SQL> FLASHBACK DATABASE

2 TO TIMESTAMP(SYSDATE-1/24);

將資料庫閃回恢復到一個SCN

SQL> FLASHBACK DATABASE TO SCN 53943;

閃回資料庫例項:

SQL> conn test/test

Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.1.0

Connected as test

SQL> select table_name from user_tables;

TABLE_NAME

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

SQL> select dbms_flashback.get_system_change_number from dual;

GET_SYSTEM_CHANGE_NUMBER

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

609755

SQL> create table t as select * from all_objects where rownum < 11;

Table created

SQL> select dbms_flashback.get_system_change_number from dual;

GET_SYSTEM_CHANGE_NUMBER

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

609841

SQL> select table_name from user_tables;

TABLE_NAME

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

T

SQL>

現在資料庫中有一個表t,然後進行恢復。

SQL> archive log list

資料庫日誌模式 存檔模式

自動存檔 啟用

存檔終點 USE_DB_RECOVERY_FILE_DEST

最早的聯機日誌序列 2

下一個存檔日誌序列 4

當前日誌序列 4

SQL> flashback database to scn 609755

2 ;

flashback database to scn 609755

*

1 行出現錯誤:

ORA-38757: 要閃回資料庫, 資料庫必須已裝載但不能開啟。

SQL> conn /as sysdba

已連線。

SQL> show user

USER "SYS"

SQL> shutdown immediate

資料庫已經關閉。

已經解除安裝資料庫。

ORACLE 例程已經關閉。

SQL> startup mount

ORA-32004: obsolete and/or deprecated parameter(s) specified

ORACLE 例程已經啟動。

Total System Global Area 83886080 bytes

Fixed Size 1247420 bytes

Variable Size 71305028 bytes

Database Buffers 8388608 bytes

Redo Buffers 2945024 bytes

資料庫裝載完畢。

SQL> flashback database to scn 609755;

閃回完成。

SQL> alter database open;

alter database open

*

1 行出現錯誤:

ORA-01589: 要開啟資料庫則必須使用 RESETLOGS NORESETLOGS 選項

SQL> alter database open resetlogs;

資料庫已更改。

SQL> conn test/test

已連線。

SQL> select table_name from user_tables;

未選定行

查詢閃回資料庫的狀態

Oracle提供了三個檢視有關於閃回資料庫的

v$flashback_database_log

v$flashback_database_logfile

v$flashback_database_stat

排除某個表空間出閃回恢復資料庫

使用命令將某個表空間排除出閃回資料庫恢復。

ALTER TABLESPACE FLASHBACK {ON|OFF}

並可以透過查詢檢視v$tablespaceflashback_on來檢視錶空間的狀態。

需要注意的問題

在以下的情況下是不能使用閃回資料庫的:

n 控制檔案被還原或者重新新增

n 表空間被刪除

n 一個資料檔案被收縮

Resetlogs和閃回(這個似乎容易出錯。我做的時候就出現ORA600的錯誤,後來解決辦法就是重建控制檔案恢復的。至今不知道為什麼,以後有機會好好檢查一下。)

每一次使用FLASHBACK DATABASE閃回資料庫的時候,需要使用resetlogs開啟資料庫。假如在使用resetlogs開啟資料庫的時候,發現有錯誤的時候。只需要簡單執行FLASHBACK DATABASE TO BEFORE RESETLOGS命令就能夠將資料庫安裝並恢復到前像的(incarnation)最後的SCN

SQL> shutdown immediate

資料庫已經關閉。

已經解除安裝資料庫。

ORACLE 例程已經關閉。

SQL> startup mount

ORA-32004: obsolete and/or deprecated parameter(s) specified

ORACLE 例程已經啟動。

Total System Global Area 83886080 bytes

Fixed Size 1247420 bytes

Variable Size 67110724 bytes

Database Buffers 12582912 bytes

Redo Buffers 2945024 bytes

資料庫裝載完畢。

SQL> flashback database to before resetlogs;

閃回完成。 這個地方正常恢復,從後來的恢復的資料庫上看也是恢復了資料。

SQL> alter database open;

alter database open

*

1 行出現錯誤:

ORA-00600: 內部錯誤程式碼, 引數: [kcvcrv_fb_inc_mismatch], [0], [556264],

[598815894], [0], [609776], [598877589], []

但是這裡為什麼出現內部錯誤。

因為沒有metalink帳號,也沒有深究,在這裡存檔,以後檢視

隨後使用重建控制檔案的重建日誌檔案來恢復資料庫。

SQL> select status from v$instance;

STATUS

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

MOUNTED

SQL> shutdown immediate;

ORA-01109: 資料庫未開啟

已經解除安裝資料庫。

ORACLE 例程已經關閉。

SQL> startup

ORA-32004: obsolete and/or deprecated parameter(s) specified

ORACLE 例程已經啟動。

Total System Global Area 83886080 bytes

Fixed Size 1247420 bytes

Variable Size 67110724 bytes

Database Buffers 12582912 bytes

Redo Buffers 2945024 bytes

資料庫裝載完畢。

ORA-00600: 內部錯誤程式碼, 引數: [kcvcrv_fb_inc_mismatch], [0], [556264],

[598815894], [0], [609776], [598877589], []

SQL> alter database backup controlfile to trace;

mount狀態下執行的這個語句。

資料庫已更改。

SQL> shutdown immediate;

ORA-01109: 資料庫未開啟

已經解除安裝資料庫。

ORACLE 例程已經關閉。

SQL> STARTUP NOMOUNT

ORA-32004: obsolete and/or deprecated parameter(s) specified

ORACLE 例程已經啟動。

Total System Global Area 83886080 bytes

Fixed Size 1247420 bytes

Variable Size 67110724 bytes

Database Buffers 12582912 bytes

Redo Buffers 2945024 bytes

SQL> CREATE CONTROLFILE REUSE DATABASE "ORA10" RESETLOGS ARCHIVELOG

2 MAXLOGFILES 16

3 MAXLOGMEMBERS 3

4 MAXDATAFILES 100

5 MAXINSTANCES 8

6 MAXLOGHISTORY 292

7 LOGFILE

8 GROUP 1 'E:ORACLEORADATAORA10REDO01.LOG' SIZE 10000K,

9 GROUP 2 'E:ORACLEORADATAORA10REDO02.LOG' SIZE 10000K,

10 GROUP 3 'E:ORACLEORADATAORA10REDO03.LOG' SIZE 10000K

11 -- STANDBY LOGFILE

12 DATAFILE

13 'E:ORACLEORADATAORA10SYSTEM01.DBF',

14 'E:ORACLEORADATAORA10UNDOTBS01.DBF',

15 'E:ORACLEORADATAORA10SYSAUX01.DBF',

16 'E:ORACLEORADATAORA10USERS01.DBF'

17 CHARACTER SET ZHS16GBK

18 ;

控制檔案已建立。

SQL> -- Commands to re-create incarnation table

SQL> -- Below log names MUST be changed to existing filenames on

SQL> -- disk. Any one log file from each branch can be used to

SQL> -- re-create incarnation records.

SQL> -- ALTER DATABASE REGISTER LOGFILE 'E:ORACLEFLASH_RECOVERY_AREAORA10ARC

HIVELOG2006_08_19O1_MF_1_1_%U_.ARC';

SQL> -- ALTER DATABASE REGISTER LOGFILE 'E:ORACLEFLASH_RECOVERY_AREAORA10ARC

HIVELOG2006_08_19O1_MF_1_1_%U_.ARC';

SQL> -- ALTER DATABASE REGISTER LOGFILE 'E:ORACLEFLASH_RECOVERY_AREAORA10ARC

HIVELOG2006_08_19O1_MF_1_1_%U_.ARC';

SQL> -- Recovery is required if any of the datafiles are restored backups,

SQL> -- or if the last shutdown was not normal or immediate.

SQL> RECOVER DATABASE USING BACKUP CONTROLFILE

ORA-00279: ?? 609775 (? 08/19/2006 10:40:41 ??) ???? 1 ????

ORA-00289: ??:

E:ORACLEFLASH_RECOVERY_AREAORA10ARCHIVELOG2006_08_19O1_MF_1_4_%U_.ARC

ORA-00280: ?? 609775 (???? 1) ??? #4 ?

指定日誌: {=suggested | filename | AUTO | CANCEL}

-- Database can now be opened zeroing the online logs.

ORA-00308: ???????? '--'

ORA-27041: ??????

OSD-04002: ????????????

O/S-Error: (OS 2) ??????????????????????

指定日誌: {=suggested | filename | AUTO | CANCEL}

ALTER DATABASE OPEN RESETLOGS;

ORA-00308: ???????? 'ALTER'

ORA-27041: ??????

OSD-04002: ????????????

O/S-Error: (OS 2) ??????????????????????

指定日誌: {=suggested | filename | AUTO | CANCEL}

-- Commands to add tempfiles to temporary tablespaces.

ORA-00308: ???????? '--'

ORA-27041: ??????

OSD-04002: ????????????

O/S-Error: (OS 2) ??????????????????????

指定日誌: {=suggested | filename | AUTO | CANCEL}

-- Online tempfiles have complete space information.

ORA-00308: ???????? '--'

ORA-27041: ??????

OSD-04002: ????????????

O/S-Error: (OS 2) ??????????????????????

指定日誌: {=suggested | filename | AUTO | CANCEL}

-- Other tempfiles may require adjustment.

ORA-00308: ???????? '--'

ORA-27041: ??????

OSD-04002: ????????????

O/S-Error: (OS 2) ??????????????????????

指定日誌: {=suggested | filename | AUTO | CANCEL}

ALTER TABLESPACE TEMP ADD TEMPFILE 'E:ORACLEORADATAORA10TEMP01.DBF' REUSE;

ORA-00308: ???????? 'ALTER'

ORA-27041: ??????

OSD-04002: ????????????

O/S-Error: (OS 2) ??????????????????????

指定日誌: {=suggested | filename | AUTO | CANCEL}

-- End of tempfile additions.

ORA-00308: ???????? '--'

ORA-27041: ??????

OSD-04002: ????????????

O/S-Error: (OS 2) ??????????????????????

指定日誌: {=suggested | filename | AUTO | CANCEL}

--

ORA-00308: ???????? '--'

ORA-27041: ??????

OSD-04002: ????????????

O/S-Error: (OS 2) ??????????????????????

指定日誌: {=suggested | filename | AUTO | CANCEL}

已應用的日誌。

完成介質恢復。

SQL> ALTER DATABASE OPEN RESETLOGS;

資料庫已更改。

SQL> -- Commands to add tempfiles to temporary tablespaces.

SQL> -- Online tempfiles have complete space information.

SQL> -- Other tempfiles may require adjustment.

SQL> ALTER TABLESPACE TEMP ADD TEMPFILE 'E:ORACLEORADATAORA10TEMP01.DBF' REU

SE;

表空間已更改。

SQL>

這時候資料庫正常的。

閃回版本查詢

閃回版本查詢就是指能夠在資料庫上查詢某一時間點或者使用者指定的特定的SCN的版本資料。在查詢的時候,需要使用versions子句來使用在兩個時間點之間的所有版本。透過閃回提取的是行的歷史,這裡的行的歷史是事務行的改變。所有隻是查詢已經提交的行,沒有提交的行版本並不會被查詢。

偽列

VERSIONS_OPERATION

VERSIONS_XID

VERSIONS_ENDTIME

VERSIONS_ENDSCN

VERSIONS_STARTTIME

VERSIONS_STARTSCN

SELECT [Pseudocolumns]…

FROM …

VERSIONS BETWEEN

{SCN|TIMESTAMP {expr|MINVALUE} AND

{expr|MAXVALUE}}

[AS OF {SCN|TIMESTAMP expr}]

WHERE [Pseudocolumns…]…

需要注意的問題

VERSIONS子句不能用於以下情況的查詢:

n 外部表

n 臨時表

n Fixed

n 檢視

VERSIONS子句不能跨DDL查詢,意思就是在使用VERSIONS子句的時候,如果對這個表有DDL操作的時候,只能檢視DDL之後的資訊。當段被收縮操作的時候也是被排除出去的。

例項:

SQL> create table rates (currency varchar2(4) not null,rate number(15,10));

Table created

SQL> insert into rates values('euro',1.1012);

1 row inserted

SQL> update rates set rate = 1.1014;

1 row updated

SQL> commit;

Commit complete

SQL> update rates set rate = 1.1013;

1 row updated

SQL> commit;

Commit complete

SQL> delete rates;

1 row deleted<

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

相關文章