爲二進制文件,初始化大小由CREATE DATABASE指定,可使用RMAN備份數據庫
記錄了當前數據庫的結構信息,同時也包含數據文件及日誌文件的信息以及相關的狀態,歸檔信息等等vim
在參數文件中描述其位置,個數等等。一般採用分散放開,多路複用的原則。在mount階段被讀取,open階段一直被使用session
維護數據庫一致性(數據庫啓動時會比較控制文件與聯機日誌文件中的ckpt,即起始scn號,如相等則正常啓動,不然須要介質恢復)oracle
一個控制文件只能屬於一個數據庫app
控制文件的任意修改將寫入到初始化參數中指定的全部控制文件中,讀取時則僅讀取第一個控制文件ide
控制文件只能鏈接一個數據庫,控制文件的大小通常不要超過MB,最多爲個,最少一個,互爲鏡像spa
控制文件中包含的內容debug
數據庫的名字、ID、建立的時間戳日誌
表空間的名字code
聯機日誌文件、數據文件的位置、個數、名字
聯機日誌的Sequence號碼
檢查點的信息
撤銷段的開始或結束
歸檔信息
備份信息
V$CONTROLFILE --列出實例中全部控制文件的名字及狀態信息
SYS@userdata>select * from v$controlfile; STATUS NAME IS_RECOVE BLOCK_SIZE FILE_SIZE_BLKS --------------------- -------------------------------------------------- --------- ---------- -------------- /u01/app/oracle/oradata/userdata/control01.ctl NO 16384 508 /u01/app/oracle/oradata/userdata/control02.ctl NO 16384 508 /u01/app/oracle/oradata/userdata/control03.ctl NO 16384 508
V$PARAMETER --列出全部參數的位置及狀態信息
SYS@userdata>select name,value from v$parameter where name='control_files'; NAME -------------------------------------------------- VALUE -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- control_files /u01/app/oracle/oradata/userdata/control01.ctl, /u01/app/oracle/oradata/userdata/control02.ctl, /u01/app/oracle/oradata/userdata/control03.ctl
V$CONTROLFILE_RECORD_SECTION --列出控制文件中記錄的部分信息
SHOW PARAMETER CONTROL_FILES --列出控制文件的名字、狀態、位置等
SYS@userdata>show parameter control_files; NAME TYPE VALUE ------------------------------------ --------------------------------- ------------------------------ control_files string /u01/app/oracle/oradata/userda ta/control01.ctl, /u01/app/ora cle/oradata/userdata/control02 .ctl, /u01/app/oracle/oradata/ userdata/control03.ctl
$ strings /u01/app/oracle/oradata/userdata/control01.ctl
SYS@userdata>alter database backup controlfile to trace as '/home/oracle/ctl.txt'; Database altered.
SYS@userdata>alter system set events 'immediate trace name controlf level 10'; System altered. SYS@userdata>show parameter user_dump; NAME TYPE VALUE ------------------------------------ --------------------------------- ------------------------------ user_dump_dest string /u01/app/oracle/admin/userdata /udump SYS@userdata>! ls -ltr /u01/app/oracle/admin/userdata/udump total 1344 -.............. -rw-r----- 1 oracle oinstall 136039 Sep 13 16:49 userdata_ora_9476.trc
或者
SYS@userdata>oradebug setmypid Statement processed. SYS@userdata>select spid from v$process where addr=(select paddr from v$session where sid=(select sid from v$mystat where rownum=1)); SPID ------------------------------------ 9476 SYS@userdata>oradebug dump controlf 12 Statement processed. SYS@userdata>show parameter user_dump; NAME TYPE VALUE ------------------------------------ --------------------------------- ------------------------------ user_dump_dest string /u01/app/oracle/admin/userdata /udump SYS@userdata>! ls -lh /u01/app/oracle/admin/userdata/udump/*9476* -rw-r----- 1 oracle oinstall 182K Sep 13 17:04 /u01/app/oracle/admin/userdata/udump/userdata_ora_9476.trc
spfile或pfile均可以實現對控制文件的個數及位置管理
spfile步驟
修改spfile參數中的control_files -- alter system ... scope = spfile | both |memory
一致性關閉數據庫
增長或減小控制文件(cp or mv)
啓動數據庫使用spfile
驗證結果
pfile步驟
一致性關閉數據庫
修改pfile參數(vi或vim) 修改*.control_files=......這一段
增長或減小控制文件(cp or mv)
啓動數據庫使用pfile
驗證結果
SYS@userdata>show parameter control_files; NAME TYPE VALUE ------------------------------------ --------------------------------- ------------------------------ control_files string /u01/app/oracle/oradata/userda ta/control01.ctl, /u01/app/ora cle/oradata/userdata/control02 .ctl, /u01/app/oracle/oradata/ userdata/control03.ctl SYS@userdata>alter system set control_files='/u01/app/oracle/oradata/userdata/control01.ctl' scope=spfile; System altered. SYS@userdata>shutdown immediate; Database closed. Database dismounted. ORACLE instance shut down. SYS@userdata>startup mount; ORACLE instance started. Total System Global Area 314572800 bytes Fixed Size 2083592 bytes Variable Size 255853816 bytes Database Buffers 50331648 bytes Redo Buffers 6303744 bytes Database mounted. SYS@userdata>show parameter control_files; NAME TYPE VALUE ------------------------------------ --------------------------------- ------------------------------ control_files string /u01/app/oracle/oradata/userda ta/control01.ctl
SYS@userdata>show parameter control_files; NAME TYPE VALUE ------------------------------------ --------------------------------- ------------------------------ control_files string /u01/app/oracle/oradata/userda ta/control01.ctl SYS@userdata>alter system set control_files='/u01/app/oracle/oradata/userdata/control01.ctl','/u01/app/oracle/oradata/userdata/control02.ctl','/u01/app/oracle/oradata/userdata/control03.ctl' scope=spfile; System altered. SYS@userdata>shutdown immediate; ORA-01109: database not open Database dismounted. ORACLE instance shut down. SYS@userdata>startup mount; ORACLE instance started. Total System Global Area 314572800 bytes Fixed Size 2083592 bytes Variable Size 255853816 bytes Database Buffers 50331648 bytes Redo Buffers 6303744 bytes ORA-00214: control file '/u01/app/oracle/oradata/userdata/control01.ctl' version 740 inconsistent with file '/u01/app/oracle/oradata/userdata/control02.ctl' version 738 SYS@userdata>! cp /u01/app/oracle/oradata/userdata/control01.ctl /u01/app/oracle/oradata/userdata/control02.ctl SYS@userdata>! cp /u01/app/oracle/oradata/userdata/control01.ctl /u01/app/oracle/oradata/userdata/control03.ctl SYS@userdata>alter database mount; Database altered. SYS@userdata>alter database open; Database altered.
SYS@userdata>alter database backup controlfile to '/home/oracle/ctl_20170913.bak'; #歸檔模式下備份 Database altered. SYS@userdata>alter database backup controlfile to trace as '/home/oracle/ctl_20170913.txt'; #歸檔非非歸檔都可 Database altered. RMAN> backup current controlfile format '/home/oracle/ctl_rman.bak'; #採用rman方式備份 Starting backup at 2017-09-13 17:28:21 using channel ORA_DISK_1 channel ORA_DISK_1: starting full datafile backupset channel ORA_DISK_1: specifying datafile(s) in backupset including current control file in backupset channel ORA_DISK_1: starting piece 1 at 2017-09-13 17:28:22 channel ORA_DISK_1: finished piece 1 at 2017-09-13 17:28:25 piece handle=/home/oracle/ctl_rman.bak tag=TAG20170913T172821 comment=NONE channel ORA_DISK_1: backup set complete, elapsed time: 00:00:04 Finished backup at 2017-09-13 17:28:25 RMAN> list backup; List of Backup Sets =================== BS Key Type LV Size Device Type Elapsed Time Completion Time ------- ---- -- ---------- ----------- ------------ ------------------- 1 Full 7.98M DISK 00:00:02 2017-09-13 17:28:23 BP Key: 1 Status: AVAILABLE Compressed: NO Tag: TAG20170913T172821 Piece Name: /home/oracle/ctl_rman.bak Control File Included: Ckp SCN: 1133796 Ckp time: 2017-09-13 17:28:21
SYS@userdata>archive log list; Database log mode No Archive Mode Automatic archival Disabled Archive destination /arch Oldest online log sequence 17 Current log sequence 19 SYS@userdata>show parameter control_files; NAME TYPE VALUE ------------------------------------ --------------------------------- ------------------------------ control_files string /u01/app/oracle/oradata/userda ta/control01.ctl SYS@userdata>alter database backup controlfile to trace as '/home/oracle/ctl_20170913.txt'; Database altered. SYS@userdata>create table temp_tb(id int,name varchar2(32)); Table created. SYS@userdata>insert into temp_tb values(1,'bill');
SYS@userdata>insert into temp)tb values(2,'sames'); 1 row created. SYS@userdata>commit; Commit complete. SYS@userdata>shutdown immediate; Database closed. Database dismounted. ORACLE instance shut down. SYS@userdata>host rm -rf /u01/app/oracle/oradata/userdata/control01.ctl SYS@userdata>startup; ORACLE instance started. Total System Global Area 314572800 bytes Fixed Size 2083592 bytes Variable Size 255853816 bytes Database Buffers 50331648 bytes Redo Buffers 6303744 bytes ORA-00205: error in identifying control file, check alert log for more info SYS@userdata>host tail -n 10 /u01/app/oracle/admin/userdata/bdump/alert_userdata.log starting up 1 shared server(s) ... Wed Sep 13 19:17:55 2017 ALTER DATABASE MOUNT Wed Sep 13 19:17:55 2017 ORA-00202: control file: '/u01/app/oracle/oradata/userdata/control01.ctl' ORA-27037: unable to obtain file status Linux-x86_64 Error: 2: No such file or directory Additional information: 3 Wed Sep 13 19:17:58 2017 ORA-205 signalled during: ALTER DATABASE MOUNT...
能夠看到惟一的控制文件丟失後,數據庫啓動到mount狀態下報錯,此時只能經過手動新建控制文件的方法來解決,完整的建立控制文件的語句以下所示
--重建控制文件主要有三個須要考慮的是
--搞清各個日誌文件的大小及位置
--搞清各個數據文件的位置
--設置正確的字符集
CREATE CONTROLFILE REUSE DATABASE "USERDATA" RESETLOGS NOARCHIVELOG MAXLOGFILES 16 MAXLOGMEMBERS 3 MAXDATAFILES 200 MAXINSTANCES 8 MAXLOGHISTORY 292 LOGFILE GROUP 1 '/u01/app/oracle/oradata/userdata/redo01.log' SIZE 100M, GROUP 2 '/u01/app/oracle/oradata/userdata/redo02.log' SIZE 100M, GROUP 3 '/u01/app/oracle/oradata/userdata/redo03.log' SIZE 100M DATAFILE '/u01/app/oracle/oradata/userdata/system01.dbf', '/u01/app/oracle/oradata/userdata/undotbs01.dbf', '/u01/app/oracle/oradata/userdata/sysaux01.dbf', '/u01/app/oracle/oradata/userdata/users01.dbf', '/u01/app/oracle/oradata/userdata/example01.dbf' CHARACTER SET AL32UTF8 ;
SYS@userdata> CREATE CONTROLFILE REUSE DATABASE "USERDATA" NORESETLOGS NOARCHIVELOG MAXLOGFILES 16 MAXLOGMEMBERS 3 MAXDATAFILES 200 MAXINSTANCES 8 MAXLOGHISTORY 292 LOGFILE GROUP 1 '/u01/app/oracle/oradata/userdata/redo01.log' SIZE 100M, GROUP 2 '/u01/app/oracle/oradata/userdata/redo02.log' SIZE 100M, GROUP 3 '/u01/app/oracle/oradata/userdata/redo03.log' SIZE 100M DATAFILE '/u01/app/oracle/oradata/userdata/system01.dbf', '/u01/app/oracle/oradata/userdata/undotbs01.dbf', '/u01/app/oracle/oradata/userdata/sysaux01.dbf', '/u01/app/oracle/oradata/userdata/users01.dbf', '/u01/app/oracle/oradata/userdata/example01.dbf' 17 CHARACTER SET AL32UTF8; Control file created. SYS@userdata>alter database open; Database altered. SYS@userdata>select * from temp_tb; ID NAME ---------- -------------------------------------------------- 1 bill 2 sames
SYS@userdata>archive log list; Database log mode Archive Mode Automatic archival Enabled Archive destination /arch Oldest online log sequence 19 Next log sequence to archive 21 Current log sequence 21 SYS@userdata>show parameter control_files; NAME TYPE VALUE ------------------------------------ --------------------------------- ------------------------------ control_files string /u01/app/oracle/oradata/userda ta/control01.ctl SYS@userdata>insert into temp_tb values(3,'jerry'); 1 row created. YS@userdata>shutdown immediate; Database closed. Database dismounted. ORACLE instance shut down. SYS@userdata>host rm -rf /u01/app/oracle/oradata/userdata/control01.ctl SYS@userdata>startup ORACLE instance started. Total System Global Area 314572800 bytes Fixed Size 2083592 bytes Variable Size 255853816 bytes Database Buffers 50331648 bytes Redo Buffers 6303744 bytes ORA-00205: error in identifying control file, check alert log for more info SYS@userdata>host tail -n 10 /u01/app/oracle/admin/userdata/bdump/alert_userdata.log starting up 1 shared server(s) ... Wed Sep 13 19:59:08 2017 ALTER DATABASE MOUNT Wed Sep 13 19:59:08 2017 ORA-00202: control file: '/u01/app/oracle/oradata/userdata/control01.ctl' ORA-27037: unable to obtain file status Linux-x86_64 Error: 2: No such file or directory Additional information: 3 Wed Sep 13 19:59:11 2017 ORA-205 signalled during: ALTER DATABASE MOUNT... SYS@userdata>host cp /home/oracle/archctl.ctl /u01/app/oracle/oradata/userdata/control01.ctl SYS@userdata>alter database mount; Database altered. SYS@userdata>alter database open; alter database open * ERROR at line 1: ORA-01589: must use RESETLOGS or NORESETLOGS option for database open SYS@userdata>shutdown immediate; ORA-01109: database not open Database dismounted. ORACLE instance shut down. SYS@userdata>startup mount; ORACLE instance started. Total System Global Area 314572800 bytes Fixed Size 2083592 bytes Variable Size 255853816 bytes Database Buffers 50331648 bytes Redo Buffers 6303744 bytes Database mounted. SYS@userdata>alter database open resetlogs; Database altered. YS@userdata>select * from temp_tb; ID NAME ---------- -------------------------------------------------- 1 bill 2 sames 3 jerry SYS@userdata>archive log list; Database log mode Archive Mode Automatic archival Enabled Archive destination /arch Oldest online log sequence 1 Next log sequence to archive 2 Current log sequence 2 SYS@userdata>select * from temp_tb; ID NAME ---------- -------------------------------------------------- 1 bill 2 sames 3 jerry