1. 程式人生 > >oracle恢復控制檔案

oracle恢復控制檔案

資料庫在執行過程當中,可能會處於某種原因導致控制檔案丟失或者損壞,資料庫檔案記錄著資料庫的結構資訊,包括資料檔案,歸檔日誌檔案等資料庫的重要資訊,控制檔案丟失,直接會導致資料庫宕機。這篇部落格會模擬各種控制檔案丟失的情況,來恢復資料庫的正常使用。

丟失部分控制檔案

控制檔案在資料庫中佔據著非常主要的地位,通常會採用多路複用的原則對資料庫控制檔案進行保護,即使丟失了部分控制檔案,資料庫可以通過多路複用中的其他控制檔案,恢復控制檔案。

假設資料庫中我們控制檔案存放在兩個位置

位置1:/u01/app/oracle/oradata/XE/control.ctl

位置2:/u02/app/oracle/oradata/XE/control.ctl

SQL> select name from v$controlfile;

NAME

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

/u01/app/oracle/oradata/XE/control.ctl

/u02/app/oracle/oradata/XE/control.ctl

SQL>

恢復控制檔案到預設的目錄下

資料庫在執行的某個階段,突然導致/u01目錄下的控制檔案丟失了,我們希望通過/u02目錄下的控制檔案來恢復/u01下的控制檔案,下面模擬恢復的過程:

rm -rf /u01/app/oracle/oradata/XE/control.ctl

強制停止資料庫

SQL> shutdown abort;

拷貝/u02下的控制檔案到/u01下控制檔案的存放位置

oracle@oracledb:~$ cp /u02/app/oracle/oradata/XE/control.ctl /u01/app/oracle/oradata/XE/

啟動資料庫

SQL> startup nomount;

ORACLE instance started.

Total System Global Area 601272320 bytes

Fixed Size         2228848 bytes

Variable Size         180358544 bytes

Database Buffers     415236096 bytes

Redo Buffers         3448832 bytes

SQL> alter database mount;

Database altered.

SQL> alter database open;

Database altered.

恢復控制檔案到其他的目錄

假設系統咋執行的過程當中導致存放多路複用的一個控制檔案的目錄丟失,我們需要把控制檔案恢復到別的目錄下,這就需要我們修改引數檔案中控制檔案的路徑。下面演示過程:

rm -rf /u01/app/oracle/oradata/XE

強制停止資料庫

SQL> shutdown abort;

ORACLE instance shut down.

建立控制檔案的恢復目錄,並拷貝控制檔案

root@oracledb:~# mkdir -p /u03/app/oracle/oradata/XE/

root@oracledb:~# chown -R oracle:dba /u03

root@oracledb:~# chmod -R 755 /u03

root@oracledb:~# su - oracle

oracle@oracledb:~$ cp /u01/app/oracle/oradata/XE/control.ctl /u03/app/oracle/oradata/XE/

修改引數檔案中控制檔案的路徑

SQL> create pfile from spfile;

File created.

SQL> host vi $/dbs/initXE.ora

SQL> host vi $ORACLE_HOME/dbs/initXE.ora

*.control_files='/u01/app/oracle/oradata/XE/control.ctl','/u03/app/oracle/oradata/XE/control.ctl'

重啟資料庫

SQL> startup nomount pfile=?/dbs/initXE.ora

ORACLE instance started.

Total System Global Area 601272320 bytes

Fixed Size         2228848 bytes

Variable Size         180358544 bytes

Database Buffers     415236096 bytes

Redo Buffers         3448832 bytes

SQL> create spfile from pfile;

SQL> alter database mount;

Database altered.

SQL> alter database open;

Database altered.


控制檔案全部丟失,但是有一個曾經備份過的二進位制控制檔案

這種情景是資料庫在執行的過程當中,控制檔案丟失,但以前冷備過一個控制檔案,oracle的一致性狀態,控制檔案的頭部和資料庫檔案的頭部有SCN號,來保證資料庫檔案的一致性。我們使用以前備份過的控制檔案需要一些額外的恢復操作,下面演示恢復步驟。

oracle@oracledb:~$ rm -rf /u01/app/oracle/oradata/XE/control.ctl

oracle@oracledb:~$ rm -rf /u02/app/oracle/oradata/XE/control.ctl

強制關閉資料庫

SQL> shutdown abort;

ORACLE instance shut down.

拷貝老的備份的控制檔案

oracle@oracledb:~$ cp /upload/control.ctl /u01/app/oracle/oradata/XE/

oracle@oracledb:~$ cp /upload/control.ctl /u02/app/oracle/oradata/XE/

資料庫開啟到mount狀態

SQL> startup mount;

ORACLE instance started.

 

Total System Global Area 601272320 bytes

Fixed Size         2228848 bytes

Variable Size         180358544 bytes

Database Buffers     415236096 bytes

Redo Buffers         3448832 bytes

Database mounted.

資料庫在mount時,並不會提示什麼錯誤資訊,接下來我們嘗試開啟資料庫,會提示錯誤。

SQL> alter database open;

alter database open

*

ERROR at line 1:

ORA-01190: control file or data file 1 is from before the last RESETLOGS

ORA-01110: data file 1: '/u01/app/oracle/oradata/XE/system.dbf'

恢復資料庫

我們使用的是一個老的控制檔案,在恢復資料庫時需要使用using backup controlfile子句。

恢復的過程當中,資料庫會提示我們使用歸檔日誌檔案來恢復資料庫。如果資料庫處於非歸檔模式的情況下,我們只能使用線上重做日誌檔案來恢復資料庫 

SQL> recover database using backup controlfile until cancel;

ORA-00279: change 458993 generated at 03/31/2018 06:52:10 needed for thread 1

ORA-00289: suggestion :

/u01/app/oracle/fast_recovery_area/XE/archivelog/2018_03_31/o1_mf_1_5_%u_.arc

ORA-00280: change 458993 for thread 1 is in sequence #5

Specify log: {<RET>=suggested | filename | AUTO | CANCEL}

/u01/app/oracle/oradata/XE/redo1.log

Log applied.

Media recovery complete.


開啟資料庫

SQL> alter database open resetlogs;

Database altered.

控制檔案全部丟失,重建控制檔案

如果控制檔案沒有多慮複用,存在單點故障的問題,控制檔案一旦丟失,沒有備份,我們需要重建控制檔案.重建控制檔案的sql語句,我們可以通過alert_sid日誌中找到。但可能存在一些問題,需要我們注意的:如果找到一個最古老的的控制檔案,在這個控制檔案建立之後,又新建了表空間,我們需要找到這些表空間,並把表空間的資訊加入到重建控制檔案中的sql語句中。

oracle@oracledb:~$ rm -rf /u01/app/oracle/oradata/XE/control.ctl

oracle@oracledb:~$ rm -rf /u03/app/oracle/oradata/XE/control.ctl

強制停止資料庫

SQL> shutdown abort;

ORACLE instance shut down.

將資料庫開啟到nomount狀態

SQL> startup nomount

ORACLE instance started.

 

Total System Global Area 601272320 bytes

Fixed Size         2228848 bytes

Variable Size         180358544 bytes

Database Buffers     415236096 bytes

Redo Buffers         3448832 bytes

create controlfile語句可以在資料庫的alert日誌檔案中找到,我的日誌檔案位於: /u01/app/oracle/diag/rdbms/xe/XE/trace/alert_XE.log.

或者以前以文字形式備份過的控制檔案:

SQL> alter database backup controlfile to trace as '/upload/control1.bak';

下面這個語句是線上重做日誌檔案和歸檔日誌檔案都可用的情況下使用,注意引數NORESETLOGS NOARCHIVELOG和DATAFILE,需要補充後來新建的表空間檔案.

CREATE CONTROLFILE REUSE DATABASE "XE" NORESETLOGS NOARCHIVELOG

MAXLOGFILES 16

MAXLOGMEMBERS 3

MAXDATAFILES 100

MAXINSTANCES 8

MAXLOGHISTORY 292

LOGFILE

GROUP 1 '/u01/app/oracle/oradata/XE/redo1.log' SIZE 50M BLOCKSIZE 512,

GROUP 2 '/u01/app/oracle/oradata/XE/redo2.log' SIZE 50M BLOCKSIZE 512

-- STANDBY LOGFILE

DATAFILE

'/u01/app/oracle/oradata/XE/system.dbf',

'/u01/app/oracle/oradata/XE/sysaux.dbf',

'/u01/app/oracle/oradata/XE/undotbs1.dbf',

'/u01/app/oracle/oradata/XE/users.dbf',

'/u01/app/oracle/oradata/XE/itreasury1.dbf'

CHARACTER SET AL32UTF8;

recover資料庫

SQL> recover database;

Media recovery complete.

啟動資料庫

SQL> alter database open;

 

Database altered.