1. 程式人生 > >控制文件

控制文件

bms use immediate ada cif oar 一個 sql header

一、控制文件的特征 1控制文件的特征:二進制文件: 查詢More,cat亂碼,使用命令strings =>linux 控制文件很小 [oracle@yang hukou]$ ls -lh total 37M -rw-r----- 1 oracle oinstall 19M Oct 31 04:28 ora_control1 -rw-r----- 1 oracle oinstall 19M Oct 31 04:28 ora_control2 2.功能記錄數據庫的物理結構,數據文件,日誌文件等信息 如何查詢控制文件: SQL> show parameter control_files NAME TYPE VALUE ------------------------------------ ----------- control_files string /picclife/app/oracle/oradata/hukou/ora_control1, /picclife/app/oracle/oradata/hukou/ora_control2 --將二進制控制文件轉儲到trace告警日誌文件中 SQL>alter session set events ‘immediate trace name controlf level 12‘; --告警日誌查看:show parameter dump cd $ORACLE_BASE/diag/rdbms/db_unique_name/sid/trace [oracle@yang /]$ cd /picclife/app/oracle/diag/rdbms/hukou/hukou/trace ll -lrt ---最下面的最新生成的文件, sid_ora_xxx.trc more sid_ora_xxx.trc => 輸入 /DUMP --可以發現記錄著數據庫名稱、日誌文件、數據文件、表空間、RMAN信息 3:通過檢查點:數據庫開啟條件,數據文件,redo日誌文件可以正常訪問;讀控制文件,查看當前數據庫有什麽文件; 檢查數據一致性,控制文件,數據文件頭部的檢查點是否一致,以及日誌文件是否一致; ##帶來的影響就是,不完全恢復就是,控制文件及數據文件都回到一個節點,當前的日誌文件與控制文件記錄的日誌文件不一致,導致開啟數據庫需要resertlogs,重建日誌; 而完全恢復是指,某個數據文件不一致,控制文件與日誌文件完好,可以使用redo日誌,重演數據文件的操作; 二、控制文件參數的修改:
SQL> show parameter spfile;  ---查詢數據是什麽參數啟動的:默認spfile

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------ spfile string /picclife/app/oracle/product/11.2.0/dbhome_1/dbs/spfilehukou.ora SQL> show parameter control ----查詢控制文件的參數 NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ control_file_record_keep_time integer
7 control /picclife/app/oracle/oradata/hukou/ora_control1, /u01/app/control2 ####SQL> host cp /picclife/app/oracle/oradata/hukou/ora_control1 /picclife/control5 (測試環境可以) --修改參數,可以再次查詢SQL> show parameter control --驗證 SQL> alter system set control_files=/picclife/app/oracle/oradata/hukou/ora_control1,/picclife/control5
scope=spfile; SQL> shutdown immediate; cp /picclife/app/oracle/oradata/hukou/ora_control1 /picclife/control5 !sql startup 如果新增加的控制文件,實際環境不同的目錄,可能需要新建文件夾+權限屬主 mkdir -p /u01/app chown -R oracle.oinstall /u01/app -----------------小結,可以要幾個加幾個,當然也可以減少----加需要cp控制文件--------- --方法二、使用vi編輯參數文件,不是在線alter system set修改;因為控制文件參數是初始化參數,不論怎麽改,都需要重啟生效,防止特殊需求; cp拷貝控制文件去新的路徑,新的控制文件名稱: cp /picclife/app/oracle/oradata/hukou/ora_control1 /picclife/control5 mkdir -p /u01/app chown -R oracle.oinstall /u01/app create pfile from spfile; 使用spfile二進制文件生成最新的文本可編輯文件; [oracle@yang ~]$ cd $ORACLE_HOME/dbs ---為了防止錯誤,可以先cp initsid.ora initsid.ora.abc文件拷貝備份 vi 編輯,*.control_files=/picclife/app/oracle/oradata/hukou/ora_control1,/u01/app/control2,/u01/app1/control3 --!sql -> create spfile from pfile; startup=>成功OK

三、控制文件的恢復:備份: 01 備份二進制文件; 02 使用完好的控制文件進行拷貝恢復; 03,使用trace文件重建控制文件; 01: 二進制備份,輸出一個文件 如果丟失一個控制文件,最好不要使用備份進行恢復:恢復方式操作系統cp拷貝 情況一,使用備份控制文件還原,啟動數據庫包,SCN版本不一致: 情況二,使用備份文件進行所有控制文件覆蓋,啟動數據庫報,日誌文件SCN不一致 ---那麽為什麽以上兩種情況說明備份二進制控制文件不靠譜還做這備份有何意義呢?
====>可以讓數據庫沒有完好的備份情況下,使用冷備的所有文件,進行不完全恢復:

 SQL>  select name from v$datafile union all select member from v$logfile union all select name from v$controlfile;

---查詢備份語句,編輯備份腳本

select host cp ‘||name||  /u01/app/lengbei/‘||substr(name,instr(name,/‘,-1‘)+1)||;from v$datafile union all select host cp ‘||name||  /u01/app/lengbei/‘||substr(name,instr(name,/‘,-1‘)+1)||;from v$controlfile union all select host cp ‘||member|| /u01/app/lengbei/‘||substr(member,instr(member,/‘,-1‘)+1)||;from v$logfile;

--輸出的信息,vi /home/oracle/lengbei.sql

SQL>  select host cp /u01/app/lengbei/‘||substr(name,instr(name,/‘,-1‘)+1)||‘||name||;from v$datafile union all select host cp /u01/app/lengbei/‘||substr(name,instr(name,/‘,-1‘)+1)||‘||name||;from v$controlfile union all select host cp /u01/app/lengbei/‘||substr(member,instr(member,/‘,-1‘)+1)||‘||member||;from v$logfile;

--輸出的信息,vi /home/oracle/huanyuan.sql

---創建備份目錄,權限:

[oracle@yang trace]$ mkdir -p /u01/app/lengbei

[oracle@yang trace]$ ll /u01/app

drwxr-xr-x 2 oracle oinstall     4096 Oct 31 08:23 lengbei

 

--執行備份--

SQL> shutdown immediate;

@/home/oracle/lengbei             ---等待備份完成;

--破壞:

[oracle@yang app]$ rm /picclife/app/oracle/oradata/hukou/ora_control1

[oracle@yang app]$ rm /picclife/control5

SQL> startup

ORA-00205: error in identifying control file, check alert log for more info

---告警日誌內容      ---

ALTER DATABASE   MOUNT

ORA-00210: cannot open the specified control file

ORA-00202: control file: /picclife/control5

ORA-27037: unable to obtain file status

Linux-x86_64 Error: 2: No such file or directory

Additional information: 3

ORA-00210: cannot open the specified control file

ORA-00202: control file: /picclife/app/oracle/oradata/hukou/ora_control1‘

--執行恢復腳本:

SQL> @/home/oracle/huanyuan.sql
alter database mount; alter database open;
02:測試二,實驗環境,控制文件兩個,破壞其中一個,使用存活下來的控制文件進行拷貝還原恢復 SQL> shutdown abort ---模擬數據庫掉電,某個磁盤損壞 開啟alter.log日誌,cd $ORACLE_BASE/diag/rdbms/db_unqie_name/sid_name/trace --tail -f *.log [oracle@yang trace]$ !sql SQL> startup --啟動數據庫 ORA-00205: error in identifying control file, check alert log for more info 報錯了,具體信息無法查詢 ORA-00210: cannot open the specified control file ---日誌輸出 --查看alter 日誌,提示控制文件沒了 ORA-00202: control file: /picclife/control5 ORA-27037: unable to obtain file status Linux-x86_64 Error: 2: No such file or directory cd /picclife/ --ls 經查詢,缺失丟失控制文件; SQL> show parameter contr ----nomount 狀態可以查看控制文件,數量及位置 NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ control_files string /picclife/app/oracle/oradata/hukou/ora_control1 , /picclife/control5 SQL> host ls /picclife/app/oracle/oradata/hukou/ --查看是否有好的 ora_control1 SQL> host cp /picclife/app/oracle/oradata/hukou/ora_control1 /picclife/control5 SQL> alter database mount; SQL> alter database open; 03:測試三,實驗環境,控制文件兩個,破壞其中一個,使用備份的控制文件進行還原恢復,啟動數據庫Open,無法啟動,因為使用的備份控制文件是老的與數據文件不一致; 因此實驗采用trace文件,生成重建控制文件腳本,進行控制文件重建測試操作; 當前數據塊狀態OPEN,備份數據文件,指定位置文件名稱 SQL> alter database backup controlfile to /u01/app/hukou_contr.bk; --show parameter control --查詢參數,控制文件名稱,位置 /picclife/app/oracle/oradata/hukou/ora_control1, /picclife/control5 --關閉數據庫一致性關庫後,當前的數據文件與備份的控制文件SCN不一致,當前的控制文件SCN,數據文件,都比備份片記錄的SCN大 SQL> shutdown immediate; --破壞控制文件 [oracle@yang picclife]$ rm control5 startup --此時告警日誌查詢,沒有控制文件 ---使用備份的控制文件,cp備份的控制文件,拷貝至丟失控制文件的路徑+改名 [oracle@yang picclife]$ cp /u01/app/hukou_contr.bk control5 ---報錯 SQL> startup ORA-00214: control file /picclife/app/oracle/oradata/hukou/ora_control1‘ version 310 inconsistent with file /picclife/control5‘ version 290 ---報錯提示兩個版本不一致 ---操作使用備份的控制文件對未破壞的控制文件進行覆蓋: [oracle@yang picclife]$ cp /picclife/app/oracle/oradata/hukou/ora_control1 ---註意此時,相當於我用備份的控制文件,將所有的控制文件都恢復到了備份的控制文件SCN SQL> alter database mount;---數據庫可以mount; SQL> startup ORA-01589: must use RESETLOGS or NORESETLOGS option for database open SQL> select name,checkpoint_change# from v$datafile; --查詢控制文件的SCN號信息 NAME CHECKPOINT_CHANGE# -------------------------------------------------------------------------------- /picclife/app/hukou/data/system01.dbf 334031 SQL> select name,checkpoint_change# from v$datafile_header; ----查詢數據文件頭部,數據文件記錄的SCN NAME CHECKPOINT_CHANGE# -------------------------------------------------------------------------------- /picclife/app/hukou/data/system01.dbf 355197 SQL> select MEMBERS,FIRST_CHANGE#,NEXT_CHANGE# from v$log; ---查詢日誌文件組的SCN MEMBERS FIRST_CHANGE# NEXT_CHANGE# ---------- ------------- ------------ 3 334030 2.8147E+14 2 313897 334030 1 287062 313897 SQL> archive log list ---查詢歸檔模式,非歸檔 Database log mode No Archive Mode SQL> alter database open RESETLOGS; -------無法no resetlogs方式打開,因為控制文件與數據文件都無法一致,更何談與日誌文件SCN保持一致或者重建了 alter database open RESETLOGS * ERROR at line 1: ORA-01113: file 1 needs media recovery ORA-01110: data file 1: /picclife/app/hukou/data/system01.dbf 此時-------遇到這麽尷尬的時候怎麽辦? 使用第一種冷備恢復可以,如果可以有trace文件,那最好了; --- alter database backup controlfile to trace; --- SQL> show parameter dump /picclife/app/oracle/diag/rdbms/hukou/hukou/trace cd $ORACLE_BASE/diag/rdbms/db_unique_name/sid/trace ll -lrt [oracle@yang trace]$ more hukou_ora_24415.trc --最近的一個文件,sid_ora_xx.trc = /STARTUP --找到控制文件重建腳本:復制,vi編輯一個腳本: vi /home/oracle/chongjian.sql CREATE CONTROLFILE REUSE DATABASE "HUKOU" RESETLOGS NOARCHIVELOG MAXLOGFILES 7 MAXLOGMEMBERS 5 MAXDATAFILES 1500 MAXINSTANCES 1 MAXLOGHISTORY 292 LOGFILE GROUP 1 ( /picclife/app/hukou/log/redo01a.log, /picclife/app/hukou/log/redo01b.log ) SIZE 30M BLOCKSIZE 512, GROUP 2 ( /picclife/app/hukou/log/redo02a.log, /picclife/app/hukou/log/redo02b.log ) SIZE 30M BLOCKSIZE 512, GROUP 3 ( /picclife/app/hukou/log/redo03a.log, /picclife/app/hukou/log/redo03b.log ) SIZE 30M BLOCKSIZE 512 -- STANDBY LOGFILE DATAFILE /picclife/app/hukou/data/system01.dbf, /picclife/app/hukou/data/sysaux01.dbf, /picclife/app/hukou/data/undotbs01.dbf, /picclife/app/hukou/data/users01.dbf CHARACTER SET US7ASCII ; SQL> startup force nomount; -此時的測試環境,是因為使用舊的控制文件,啟動到了mount狀態,但是無法open,無法讀取數據文件,不得已,采取的方式,次方式等同於丟失所有控制文件; --重建控制文件 SQL> @/home/oracle/chongjian.sql SQL> select status from v$instance; STATUS ------------ MOUNTED SQL> select distinct CHECKPOINT_CHANGE# from v$datafile; CHECKPOINT_CHANGE# ------------------ 355197 SQL> select distinct CHECKPOINT_CHANGE# from v$datafile_header; CHECKPOINT_CHANGE# ------------------ 355197 alter database open * ERROR at line 1: ORA-01589: must use RESETLOGS or NORESETLOGS option for database open SQL> select MEMBERS,FIRST_CHANGE#,NEXT_CHANGE# from v$log; MEMBERS FIRST_CHANGE# NEXT_CHANGE# ---------- ------------- ------------ 2 0 0 2 0 0 2 0 0 SQL> alter database open RESETLOGS; SQL> select MEMBERS,FIRST_CHANGE#,NEXT_CHANGE# from v$log; MEMBERS FIRST_CHANGE# NEXT_CHANGE# ---------- ------------- ------------ 2 355198 2.8147E+14 2 0 0 2 0 0 SQL> alter system switch logfile; System altered. SQL> / System altered. SQL> / System altered. SQL> select MEMBERS,FIRST_CHANGE#,NEXT_CHANGE# from v$log; MEMBERS FIRST_CHANGE# NEXT_CHANGE# ---------- ------------- ------------ 2 355328 355331 2 355331 2.8147E+14 2 355325 355328 -----------------到此為止,數據開啟了,open了; 但是這種方式,有個問題:###執行腳本,ALTER日誌開啟狀態,出現警告信息; WARNING: The following temporary tablespaces contain no files. This condition can occur when a backup controlfile has been restored. It may be necessary to add files to these tablespaces. That can be done using the SQL statement: ALTER TABLESPACE <tablespace_name> ADD TEMPFILE Alternatively, if these temporary tablespaces are no longer needed, then they can be dropped. Empty temporary tablespace: TEMPTS1 ---臨時表空間視圖查詢: SQL> select FILE_NAME,TABLESPACE_NAME,STATUS from dba_temp_files; no rows selected SQL> select TABLESPACE_NAME,CONTENTS from dba_tablespaces where CONTENTS=TEMPORARY; TABLESPACE_NAME CONTENTS ------------------------------ --------- TEMPTS1 TEMPORARY SQL> select name from v$datafile; /picclife/app/hukou/data/system01.dbf alter tablespace tempts1 add tempfile /picclife/app/hukou/data/temp01.dbf‘; --如果提示報錯提示文件已存在,‘xxx.dbf’ reuse; OK

控制文件