控制檔案恢復測試

studywell發表於2016-04-08

控制檔案恢復測試
 
 參考:
 http://blog.chinaunix.net/uid-17143914-id-2824664.html
 http://blog.itpub.net/30162081/viewspace-1678479/
 
測試環境:
SQL> conn / as sysdba
SQL> show parameter control

NAME                     TYPE     VALUE
------------------------------------ ----------- ------------------------------
control_file_record_keep_time         integer     7
control_files                 string     /oracle/app/oracle/oradata/orcl/control01.ctl, /oracle/app/oracle/fast_recovery_area/orcl/control02.ctl
control_management_pack_access         string     DIAGNOSTIC+TUNING
SQL> show parameter pfile;

NAME                     TYPE     VALUE
------------------------------------ ----------- ------------------------------
spfile                     string     /oracle/app/oracle/product/11.2.0/dbs/spfileorcl.ora

 
 
 控制檔案損壞:

控制檔案(control file)是一個相當小的檔案(最多能增長到64M左右),其中包含Oracle需要的其他檔案的一個目錄。引數檔案告知例項控制檔案的位置,控制檔案則告知示例資料庫和線上重做日誌檔案的位置。控制檔案還告知了Oracle其他一些事情,如已發生檢查點的有關資訊、資料庫名(必須和db_name引數匹配)、建立資料庫的時間戳、歸檔重做日誌的歷史(有時這會讓控制檔案變大)、RMAN資訊等。
控制檔案應該透過硬體(RAID)多路儲存,如果不支援映象,則要透過Oracle多路儲存。應該有不止一個副本,而且它們應該儲存在不同的磁碟上,以防止萬一出現磁碟故障而丟失控制檔案。丟失控制檔案並不是致命的,但是會使恢復變得困難很多。
可以透過查詢資料庫的日誌檔案來定位損壞了的控制檔案。

本文如下3部分;
一、損壞單個控制檔案:
二、損壞所有的控制檔案:
三、控制檔案完全丟失,重新建立;

一、損壞單個控制檔案:
1. 確保資料庫已經關閉:shutdown immediate;   或shutdown abort
2. 檢視初始化檔案$ORACLE_BASE/admin/pfile/initORCL.ora,或檢視alert日誌確定所有控制檔案的路徑。
3. 用作業系統命令將其它正確的控制檔案覆蓋錯誤的控制檔案。
4. 重新啟動資料庫:startup;
5. 檢查日誌有無報錯,資料庫操作有無異常;


二、損壞所有的控制檔案:
1. 確保資料庫已經關閉,
2. 從相應的備份結果集中恢復最近的控制檔案;
 restore controlfile from '/backup/c-1368494897-20160407-00';

3. 用下面的命令來建立產生資料庫控制檔案的指令碼:
startup mount;
alter database backup controlfile to trace;
具體trace檔案目錄可見alert日誌;
也可透過語句查詢:
 select tracefile from v$process where addr in (select paddr from v$session where sid in (select sid from v$mystat));


4. 修改第三步產生的trace檔案,將其中關於建立控制檔案的一部分語句複製出來並做些修改,使得它能夠體現最新的資料庫結構。將產生的sql檔名字為createcontrol.sql.

CREATE CONTROLFILE REUSE DATABASE "ORCL" NORESETLOGS  ARCHIVELOG
    MAXLOGFILES 16
    MAXLOGMEMBERS 3
    MAXDATAFILES 100
    MAXINSTANCES 8
    MAXLOGHISTORY 292
LOGFILE
  GROUP 1 (
    '/oracle/app/oracle/oradata/orcl/redo01.log',
    '/oracle/app/oracle/oradata/orcl/redo11.log'
  ) SIZE 50M BLOCKSIZE 512,
  GROUP 2 (
    '/oracle/app/oracle/oradata/orcl/redo21.log',
    '/oracle/app/oracle/oradata/orcl/redo02.log'
  ) SIZE 50M BLOCKSIZE 512,
  GROUP 3 (
    '/oracle/app/oracle/oradata/orcl/redo03.log',
    '/oracle/app/oracle/oradata/orcl/redo31.log'
  ) SIZE 50M BLOCKSIZE 512,
  GROUP 4 (
    '/oracle/app/oracle/oradata/orcl/redo4_1.log',
    '/oracle/app/oracle/oradata/orcl/redo4_2.log'
  ) SIZE 50M BLOCKSIZE 512
-- STANDBY LOGFILE
DATAFILE
  '/oracle/app/oracle/oradata/orcl/system01.dbf',
  '/oracle/app/oracle/oradata/orcl/sysaux01.dbf',
  '/oracle/app/oracle/oradata/orcl/undotbs01.dbf',
  '/oracle/app/oracle/oradata/orcl/users01.dbf',
  '/oracle/app/oracle/oradata/orcl/tb01.dbf',
  '/oracle/app/oracle/oradata/orcl/tbsalert01.dbf',
  '/oracle/app/oracle/oradata/orcl/streams01.dbf'
CHARACTER SET ZHS16GBK
;
-- Configure RMAN configuration record 1
VARIABLE RECNO NUMBER;
EXECUTE :RECNO := SYS.DBMS_BACKUP_RESTORE.SETCONFIG('CONTROLFILE AUTOBACKUP','ON');
-- Configure RMAN configuration record 2
VARIABLE RECNO NUMBER;
EXECUTE :RECNO := SYS.DBMS_BACKUP_RESTORE.SETCONFIG('CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE','DISK TO ''/backup/%F''');
-- Configure RMAN configuration record 3
VARIABLE RECNO NUMBER;
EXECUTE :RECNO := SYS.DBMS_BACKUP_RESTORE.SETCONFIG('RETENTION POLICY','TO REDUNDANCY 2');
-- Configure RMAN configuration record 4
VARIABLE RECNO NUMBER;
EXECUTE :RECNO := SYS.DBMS_BACKUP_RESTORE.SETCONFIG('CHANNEL','DEVICE TYPE DISK FORMAT   ''/backup/%U''');


5. 用下面命令重新建立控制檔案:
shutdown abort;
startup nomount;
@createcontrol.sql;

根據實際情況將歸檔日誌註冊到資料庫上;
-- ALTER DATABASE REGISTER LOGFILE '/oracle/app/oracle/fast_recovery_area/ORCL/archivelog/2016_04_08/o1_mf_1_1_%u_.arc';
-- Recovery is required if any of the datafiles are restored backups,
-- or if the last shutdown was not normal or immediate.
RECOVER DATABASE
-- All logs need archiving and a log switch is needed.
ALTER SYSTEM ARCHIVE LOG ALL;
-- Database can now be opened normally.
ALTER DATABASE OPEN;
ALTER TABLESPACE TEMP ADD TEMPFILE '/oracle/app/oracle/oradata/orcl/temp01.dbf' REUSE;
ALTER TABLESPACE TEMP ADD TEMPFILE '/oracle/app/oracle/oradata/orcl/temp02.dbf' REUSE;

如不新增臨時空間檔案,則在dba_temp_files看不到該臨時檔案;


NORESETLOGS VS RESETLOGS
從trace檔案可以看出,提供了兩個建立控制檔案的指令碼,分別針對兩種不同的應用場景:NORESETLOGS適用於當前redo log可用,而RESETLOGS適用於當前redo log不可用。

NORESETLOGS重建步驟
1.執行指令碼,重建控制檔案(CREATE CONTROLFILE REUSE DATABASE "HOEGH" NORESETLOGS NOARCHIVELOG......)
2.執行介質恢復RECOVER DATABASE
3.開啟資料庫ALTER DATABASE OPEN;
4.新增臨時表空間

RESETLOGS重建步驟
1.執行指令碼,重建控制檔案(CREATE CONTROLFILE REUSE DATABASE "HOEGH" RESETLOGS NOARCHIVELOG......)
2.執行介質恢復RECOVER DATABASE USING BACKUP CONTROLFILE
3.開啟資料庫ALTER DATABASE OPEN RESETLOGS;
4.新增臨時表空間

6. 用適當的方法進行資料庫全備份。


三、控制檔案完全丟失,重新建立;
如果丟失了所有的控制檔案並且沒有任何的備份,我們可以透過重建控制檔案來開啟資料庫。其中,重建控制檔案至少需要以下資訊:
1.資料庫名
2.字符集
3.資料檔名稱
4.初始化引數,包括MAXLOGFILES、MAXLOGMEMBERS、MAXDATAFILES、MAXINSTANCES、MAXLOGHISTORY等;


1、啟動資料庫,根據引數檔案找到控制檔案,rm刪除掉;
rm /oracle/app/oracle/oradata/orcl/control01.ctl
rm /oracle/app/oracle/fast_recovery_area/orcl/control02.ctl

2、強制關閉資料庫,然後重啟資料庫,報ORA-00205錯誤。需要注意的是,此時執行shutdown immediate命令,資料庫無法正常關閉,只能關閉到mounted狀態;需要使用shutdown abort命令強制關閉資料庫。

3、獲取資料庫名
資料庫啟動報錯,但可檢視引數;
idle> show parameter db_name

NAME                     TYPE            VALUE
------------------------------------ ---------------------- ------------------------------
db_name                  string            orcl
idle>

4、啟動到nomount狀態,獲取字符集

idle> select userenv('language') from dual;

USERENV('LANGUAGE')
--------------------------------------------------------------------------------------------------------
AMERICAN_AMERICA.US7ASCII


5、獲取資料檔名稱
透過ls命令獲取資料檔案列表。
查詢各redo檔案列表



6、生成建立控制檔案指令碼
這樣,建立控制檔案所需的基本資訊都已經有了,我們來生成建立控制檔案指令碼。
 

CREATE CONTROLFILE REUSE DATABASE "ORCL" NORESETLOGS  ARCHIVELOG
    MAXLOGFILES 16
    MAXLOGMEMBERS 3
    MAXDATAFILES 100
    MAXINSTANCES 8
    MAXLOGHISTORY 292
LOGFILE
  GROUP 1 (
    '/oracle/app/oracle/oradata/orcl/redo01.log',
    '/oracle/app/oracle/oradata/orcl/redo11.log'
  ) SIZE 50M BLOCKSIZE 512,
  GROUP 2 (
    '/oracle/app/oracle/oradata/orcl/redo21.log',
    '/oracle/app/oracle/oradata/orcl/redo02.log'
  ) SIZE 50M BLOCKSIZE 512,
  GROUP 3 (
    '/oracle/app/oracle/oradata/orcl/redo03.log',
    '/oracle/app/oracle/oradata/orcl/redo31.log'
  ) SIZE 50M BLOCKSIZE 512,
  GROUP 4 (
    '/oracle/app/oracle/oradata/orcl/redo4_1.log',
    '/oracle/app/oracle/oradata/orcl/redo4_2.log'
  ) SIZE 50M BLOCKSIZE 512
-- STANDBY LOGFILE
DATAFILE
  '/oracle/app/oracle/oradata/orcl/system01.dbf',
  '/oracle/app/oracle/oradata/orcl/sysaux01.dbf',
  '/oracle/app/oracle/oradata/orcl/undotbs01.dbf',
  '/oracle/app/oracle/oradata/orcl/users01.dbf',
  '/oracle/app/oracle/oradata/orcl/tb01.dbf',
  '/oracle/app/oracle/oradata/orcl/tbsalert01.dbf',
  '/oracle/app/oracle/oradata/orcl/streams01.dbf'
CHARACTER SET US7ASCII
;

7、重建控制檔案
將資料庫啟動到nomount狀態下;

執行上述建立控制檔案指令碼後,資料庫狀態為mount狀態;


根據實際情況將歸檔日誌註冊到資料庫上;
-- ALTER DATABASE REGISTER LOGFILE '/oracle/app/oracle/fast_recovery_area/ORCL/archivelog/2016_04_08/o1_mf_1_1_%u_.arc';
-- Recovery is required if any of the datafiles are restored backups,
-- or if the last shutdown was not normal or immediate.
RECOVER DATABASE
-- All logs need archiving and a log switch is needed.
ALTER SYSTEM ARCHIVE LOG ALL;
-- Database can now be opened normally.
ALTER DATABASE OPEN;
ALTER TABLESPACE TEMP ADD TEMPFILE '/oracle/app/oracle/oradata/orcl/temp01.dbf' REUSE;
ALTER TABLESPACE TEMP ADD TEMPFILE '/oracle/app/oracle/oradata/orcl/temp02.dbf' REUSE;

如不新增臨時空間檔案,則在dba_temp_files看不到該臨時檔案;

8、總結
下面總結一下重建控制檔案的步驟:
1.獲取資料庫名;
2.獲取字符集名;
3.獲取資料檔名和redo檔名,temp檔名;
4.重建控制檔案;
5.執行介質恢復;
6.開啟資料庫,新增臨時檔案。

附錄:
當前資料庫字符集為ZHS16GBK,但在刪除控制檔案後,查詢字符集卻為US7ASCII,該字符集為ZHS16GBK子集;
idle> select userenv('language') from dual;

USERENV('LANGUAGE')
--------------------------------------------------------------------------------------------------------
AMERICAN_AMERICA.US7ASCII

控制檔案建立後,將資料庫open,在alert日誌中會提示資料庫字符集自動轉換。如下:
*********************************************************************
Updating character set in controlfile to ZHS16GBK
No Resource Manager plan active
**********************************************************




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

相關文章