Oracle DB備份恢復篇之丟失控制文件

一、實驗目的

本篇主要模擬控制文件丟失後,如何根據實際情況恢復數據庫,才能使數據庫儘可能不丟失數據。

二、實驗環境

1)Linux系統環境

[oracle@DG1 ~]$ lsb_release -a
LSB Version: :core-3.1-ia32:core-3.1-noarch:graphics-3.1-ia32:graphics-3.1-noarch
Distributor ID: RedHatEnterpriseServer
Description:    Red Hat Enterprise Linux Server release 5.4 (Tikanga)
Release:        5.4
Codename:       Tikanga

2)Oracle數據庫版本信息

SQL> select * from v$version;
 
BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod
PL/SQL Release 10.2.0.1.0 - Production
CORE    10.2.0.1.0      Production
TNS for Linux: Version 10.2.0.1.0 - Production
NLSRTL Version 10.2.0.1.0 – Production

3)查看數據庫是否歸檔

[oracle@DG1 ~]$sqlplus / as sysdba
SQL> archive logfile list;
SP2-0734: unknown command beginning "archive lo..." - rest of line ignored.
SQL> archive list;
SP2-0734: unknown command beginning "archive li..." - rest of line ignored.
SQL> archive log list
Database log mode              Archive Mode
Automatic archival             Enabled
Archive destination            USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence     1
Next log sequence to archive   1
Current log sequence           1

三、實驗模擬種類及解決方案

1)丟失部分控制文件,其餘控制文件還在

解決方案:一致性關庫後,通過copy剩下的控制文件恢復

2)在無備份的情況下丟失了所有的控制文件,但對控制文做了追蹤備份

解決方案:通過相應的trace文件,生成腳本,重新創建controlfile

3)在歸檔模式下,對數據庫有完備,丟失全部控制文件

解決方案:通過備份集中的控制文件進行恢復

四、實驗過程

1)丟失部分控制文件,其餘控制文件還在

查看數據庫中控制文件

SQL> select '!rm '||name from v$controlfile;
 
'!RM '||NAME
-------------------------------------------------------------------------------
!rm /u01/app/oracle/oradata/lzcdb/control01.ctl
!rm /u01/app/oracle/oradata/lzcdb/control02.ctl
!rm /u01/app/oracle/oradata/lzcdb/control03.ctl

刪除control02.ctl和control03.ctl控制文件

SQL> !rm /u01/app/oracle/oradata/lzcdb/control02.ctl
!rm /u01/app/oracle/oradata/lzcdb/control03.ctl

查看控制文件

SQL> !ls /u01/app/oracle/oradata/DG1/
control01.ctl  redo01.log  redo02.log  redo03.log  system01.dbf  undotbs01.dbf
redo01_a.log  redo02_a.log redo03_a.log sysaux01.dbf temp01.dbf    users01.dbf

關閉數據庫再重新啓動數據庫(關閉時要執行一致性關閉)

SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.

重新啓動數據庫

SQL> startup
ORACLE instance started.
Total System Global Area  285212672 bytes
Fixed Size                  1218992 bytes
Variable Size              88082000 bytes
Database Buffers          192937984 bytes
Redo Buffers                2973696 bytes
ORA-00205: error in identifying control file, check alert log for more info

警告日誌信息如下

Wed Jun 13 23:38:18 2012

ALTER DATABASE   MOUNT

Wed Jun 13 23:38:18 2012

ORA-00202: control file: '/u01/app/oracle/oradata/DG1/control02.ctl'

ORA-27037: unable to obtain file status

Linux Error: 2: No such file or directory

Additional information: 3

Wed Jun 13 23:38:18 2012

ORA-205 signalled during: ALTER DATABASE MOUNT在由nomount啓動到mount時錯誤

 

解決方案:將數據庫一致性關閉之後把control01.ctl複製兩份,然後改名成刪除的控制文件

SQL> shutdownimmediate;
ORA-01507: databasenot mounted
ORACLE instance shutdown.
 
SQL> !cp/u01/app/oracle/oradata/lzcdb/control01.ctl/u01/app/oracle/oradata/lzcdb/control02.ctl
SQL> !cp/u01/app/oracle/oradata/lzcdb/control01.ctl/u01/app/oracle/oradata/lzcdb/control03.ctl

再次重新啓動數據庫

SQL> startup
ORACLE instancestarted.
Total System GlobalArea  285212672 bytes
Fixed Size                  1218992 bytes
Variable Size              83887696 bytes
DatabaseBuffers          197132288 bytes
Redo Buffers                2973696 bytes
Database mounted.
Database opened.

成功啓動!這種恢復控制文件,一定要在控制文件丟失後一致性關閉數據庫,這樣才能保證恢復出的控制文件課數據文件的SCN一致,打開數據庫是不會出錯(但如果是在歸檔模式子,即便不一致性關庫,通過此方式也應該能恢復數據庫吧!但我還沒做實驗驗證!)。

2)在沒有備份的情況下丟失了所有的控制文件,但是對控制文件做了追蹤備份

    在這裏羅嗦一點,注意一定要先將控制文件做追蹤備份到trace文件中,才能刪除全部控制,否則你刪除全部控制文件,數據庫必然掛掉了,你怎麼可能再去將控制文件做追蹤備份到trace文件中呢?千萬不要犯這樣的低級錯誤。

將控制文件備份到跟蹤文件

SQL> alter database backup controlfile to trace;
Database altered.

查看跟蹤文件的位置

SQL> show parameter user;
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
license_max_users                   integer     0
parallel_adaptive_multi_user        boolean     TRUE
user_dump_dest                      string      /u01/app/oracle/admin/DG1/udump

找到剛剛生成的trace文件,將trace文件中創建控制文件的sql語句讀取出來

[oracle@DG1 ~]$ cd /u01/app/oracle/admin/
dataguard1/ DG1/       
[oracle@DG1 ~]$ cd /u01/app/oracle/admin/DG1/udump/
[oracle@DG1 udump]$ ls -lrt|tail -1
-rw-r----- 1 oracle oinstall    8397 Jun 13 23:04 dg1_ora_30712.trc

查看生成的讀取的trace內容

[oracle@DG1 udump]$ cat dg1_ora_30712.trc
/u01/app/oracle/admin/DG1/udump/dg1_ora_30712.trc
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options
ORACLE_HOME = /u01/app/oracle/product/10.2.0.1/db_1
System name:    Linux
Node name:      DG1
Release:        2.6.18-164.el5
Version:        #1 SMP Tue Aug 18 15:51:54 EDT 2009
Machine:        i686
Instance name: DG1
Redo thread mounted by this instance: 1
Oracle process number: 15
Unix process pid: 30712, image: oracle@DG1 (TNS V1-V3)
 
*** SERVICE NAME:(SYS$USERS) 2012-06-13 23:04:23.363
*** SESSION ID:(159.3) 2012-06-13 23:04:23.363
*** 2012-06-13 23:04:23.363
-- The following are current System-scope REDO Log Archival related
-- parameters and can be included in the database initialization file.
--
-- LOG_ARCHIVE_DEST=''
-- LOG_ARCHIVE_DUPLEX_DEST=''
--
-- LOG_ARCHIVE_FORMAT=%t_%s_%r.dbf
--
-- DB_UNIQUE_NAME="DG1"
--
-- LOG_ARCHIVE_CONFIG='SEND, RECEIVE, NODG_CONFIG'
-- LOG_ARCHIVE_MAX_PROCESSES=2
-- STANDBY_FILE_MANAGEMENT=MANUAL
-- STANDBY_ARCHIVE_DEST=?/dbs/arch
-- FAL_CLIENT=''
-- FAL_SERVER=''
--
-- LOG_ARCHIVE_DEST_10='LOCATION=USE_DB_RECOVERY_FILE_DEST'
-- LOG_ARCHIVE_DEST_10='OPTIONAL REOPEN=300 NODELAY'
-- LOG_ARCHIVE_DEST_10='ARCH NOAFFIRM NOEXPEDITE NOVERIFY SYNC'
-- LOG_ARCHIVE_DEST_10='REGISTER NOALTERNATE NODEPENDENCY'
-- LOG_ARCHIVE_DEST_10='NOMAX_FAILURE NOQUOTA_SIZE NOQUOTA_USED NODB_UNIQUE_NAME'
-- LOG_ARCHIVE_DEST_10='VALID_FOR=(PRIMARY_ROLE,ONLINE_LOGFILES)'
-- LOG_ARCHIVE_DEST_STATE_10=ENABLE
--
-- Below are two sets of SQL statements, each of which creates a new
-- control file and uses it to open the database. The first set opens
-- the database with the NORESETLOGS option and should be used only if
-- the current versions of all online logs are available. The second
-- set opens the database with the RESETLOGS option and should be used
-- if online logs are unavailable.
-- The appropriate set of statements can be copied from the trace into
-- a script file, edited as necessary, and executed when there is a
-- need to re-create the control file.
--
--     Set #1. NORESETLOGS case
--
-- The following commands will create a new control file and use it
-- to open the database.
-- Data used by Recovery Manager will be lost.
-- Additional logs may be required for media recovery of offline
-- Use this only if the current versions of all online logs are
-- available.
-- After mounting the created controlfile, the following SQL
-- statement will place the database in the appropriate
-- protection mode:
--  ALTER DATABASE SET STANDBY DATABASE TO MAXIMIZE PERFORMANCE
STARTUP NOMOUNT
CREATE CONTROLFILE REUSE DATABASE "DG1" NORESETLOGS  ARCHIVELOG
    MAXLOGFILES 16
    MAXLOGMEMBERS 3
    MAXDATAFILES 100
    MAXINSTANCES 8
    MAXLOGHISTORY 292
LOGFILE
  GROUP 1 (
    '/u01/app/oracle/oradata/DG1/redo01.log',
    '/u01/app/oracle/oradata/DG1/redo01_a.log'
  ) SIZE 50M,
  GROUP 2 (
    '/u01/app/oracle/oradata/DG1/redo02.log',
    '/u01/app/oracle/oradata/DG1/redo02_a.log'
  ) SIZE 50M,
  GROUP 3 (
    '/u01/app/oracle/oradata/DG1/redo03.log',
    '/u01/app/oracle/oradata/DG1/redo03_a.log'
  ) SIZE 50M
-- STANDBY LOGFILE
DATAFILE
  '/u01/app/oracle/oradata/DG1/system01.dbf',
  '/u01/app/oracle/oradata/DG1/undotbs01.dbf',
  '/u01/app/oracle/oradata/DG1/sysaux01.dbf',
  '/u01/app/oracle/oradata/DG1/users01.dbf',
  '/u01/app/oracle/product/10.2.0.1/db_1/dbs/soe.dbf'
CHARACTER SET US7ASCII
;
-- Configure RMAN configuration record 1
VARIABLE RECNO NUMBER;
EXECUTE :RECNO := SYS.DBMS_BACKUP_RESTORE.SETCONFIG('CHANNEL','DEVICE TYPE DISK FORMAT   ''/home/oracle/DiskBackupLocation/%U''');
-- Configure RMAN configuration record 2
VARIABLE RECNO NUMBER;
EXECUTE :RECNO := SYS.DBMS_BACKUP_RESTORE.SETCONFIG('CONTROLFILE AUTOBACKUP','ON');
-- Configure RMAN configuration record 3
VARIABLE RECNO NUMBER;
EXECUTE :RECNO := SYS.DBMS_BACKUP_RESTORE.SETCONFIG('CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE','DISK TO ''/home/oracle/DiskBackupLocation/%F''');
-- Configure RMAN configuration record 4
VARIABLE RECNO NUMBER;
EXECUTE :RECNO := SYS.DBMS_BACKUP_RESTORE.SETCONFIG('RETENTION POLICY','TO NONE');
-- Commands to re-create incarnation table
-- Below log names MUST be changed to existing filenames on
-- disk. Any one log file from each branch can be used to
-- re-create incarnation records.
-- ALTER DATABASE REGISTER LOGFILE '/home/oracle/FlashRecovery/DG1/archivelog/2012_06_13/o1_mf_1_1_%u_.arc';
-- ALTER DATABASE REGISTER LOGFILE '/home/oracle/FlashRecovery/DG1/archivelog/2012_06_13/o1_mf_1_1_%u_.arc';
-- ALTER DATABASE REGISTER LOGFILE '/home/oracle/FlashRecovery/DG1/archivelog/2012_06_13/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;
-- Commands to add tempfiles to temporary tablespaces.
-- Online tempfiles have complete space information.
-- Other tempfiles may require adjustment.
ALTER TABLESPACE TEMP ADD TEMPFILE '/u01/app/oracle/oradata/DG1/temp01.dbf'
     SIZE 419430400  REUSE AUTOEXTEND ON NEXT 655360  MAXSIZE 32767M;
-- End of tempfile additions.
--
--     Set #2. RESETLOGS case
--
-- The following commands will create a new control file and use it
-- to open the database.
-- Data used by Recovery Manager will be lost.
-- The contents of online logs will be lost and all backups will
-- be invalidated. Use this only if online logs are damaged.
-- After mounting the created controlfile, the following SQL
-- statement will place the database in the appropriate
-- protection mode:
--  ALTER DATABASE SET STANDBY DATABASE TO MAXIMIZE PERFORMANCE
STARTUP NOMOUNT
CREATE CONTROLFILE REUSE DATABASE "DG1" RESETLOGS  ARCHIVELOG
    MAXLOGFILES 16
    MAXLOGMEMBERS 3
    MAXDATAFILES 100
    MAXINSTANCES 8
    MAXLOGHISTORY 292
LOGFILE
  GROUP 1 (
    '/u01/app/oracle/oradata/DG1/redo01.log',
    '/u01/app/oracle/oradata/DG1/redo01_a.log'
  ) SIZE 50M,
  GROUP 2 (
    '/u01/app/oracle/oradata/DG1/redo02.log',
    '/u01/app/oracle/oradata/DG1/redo02_a.log'
  ) SIZE 50M,
  GROUP 3 (
    '/u01/app/oracle/oradata/DG1/redo03.log',
    '/u01/app/oracle/oradata/DG1/redo03_a.log'
  ) SIZE 50M
-- STANDBY LOGFILE
DATAFILE
  '/u01/app/oracle/oradata/DG1/system01.dbf',
  '/u01/app/oracle/oradata/DG1/undotbs01.dbf',
  '/u01/app/oracle/oradata/DG1/sysaux01.dbf',
  '/u01/app/oracle/oradata/DG1/users01.dbf',
  '/u01/app/oracle/product/10.2.0.1/db_1/dbs/soe.dbf'
CHARACTER SET US7ASCII
;
-- Configure RMAN configuration record 1
VARIABLE RECNO NUMBER;
EXECUTE :RECNO := SYS.DBMS_BACKUP_RESTORE.SETCONFIG('CHANNEL','DEVICE TYPE DISK FORMAT   ''/home/oracle/DiskBackupLocation/%U''');
-- Configure RMAN configuration record 2
VARIABLE RECNO NUMBER;
EXECUTE :RECNO := SYS.DBMS_BACKUP_RESTORE.SETCONFIG('CONTROLFILE AUTOBACKUP','ON');
-- Configure RMAN configuration record 3
VARIABLE RECNO NUMBER;
EXECUTE :RECNO := SYS.DBMS_BACKUP_RESTORE.SETCONFIG('CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE','DISK TO ''/home/oracle/DiskBackupLocation/%F''');
-- Configure RMAN configuration record 4
VARIABLE RECNO NUMBER;
EXECUTE :RECNO := SYS.DBMS_BACKUP_RESTORE.SETCONFIG('RETENTION POLICY','TO NONE');
-- Commands to re-create incarnation table
-- Below log names MUST be changed to existing filenames on
-- disk. Any one log file from each branch can be used to
-- re-create incarnation records.
-- ALTER DATABASE REGISTER LOGFILE '/home/oracle/FlashRecovery/DG1/archivelog/2012_06_13/o1_mf_1_1_%u_.arc';
-- ALTER DATABASE REGISTER LOGFILE '/home/oracle/FlashRecovery/DG1/archivelog/2012_06_13/o1_mf_1_1_%u_.arc';
-- ALTER DATABASE REGISTER LOGFILE '/home/oracle/FlashRecovery/DG1/archivelog/2012_06_13/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 USING BACKUP CONTROLFILE
-- Database can now be opened zeroing the online logs.
ALTER DATABASE OPEN RESETLOGS;
-- Commands to add tempfiles to temporary tablespaces.
-- Online tempfiles have complete space information.
-- Other tempfiles may require adjustment.
ALTER TABLESPACE TEMP ADD TEMPFILE '/u01/app/oracle/oradata/DG1/temp01.dbf'
     SIZE 419430400  REUSE AUTOEXTEND ON NEXT 655360  MAXSIZE 32767M;
-- End of tempfile additions.
--

創建用於恢復控制文件的sql腳本

[oracle@DG1 udump]$ vi dg1_ora_30712.trc
:set nu
53,125 w! /home/oracle/controlfile_trace1_1.sql

查看用於恢復控制文件的sql腳本

[oracle@DG1 ~]$ ls
10201_database_linux32.zip  database  DiskBackupLocation
controlfile_trace1_1.sql    Desktop   FlashRecovery

刪除所有控制文件

SQL> select '!rm '||name from v$controlfile;
'!RM'||NAME
-------------------------------------------------------------------------------
!rm/u01/app/oracle/oradata/lzcdb/control01.ctl
!rm/u01/app/oracle/oradata/lzcdb/control02.ctl
!rm/u01/app/oracle/oradata/lzcdb/control03.ctl
SQL> !rm /u01/app/oracle/oradata/DG1/control01.ctl
!rm /u01/app/oracle/oradata/DG1/control02.ctl
!rm /u01/app/oracle/oradata/DG1/control03.ctl

查看控制文件是否被刪除

SQL> !ls /u01/app/oracle/oradata/DG1/
redo01_a.log redo02_a.log redo03_a.log  sysaux01.dbf  temp01.dbf  users01.dbf
redo01.log  redo02.log  redo03.log    system01.dbf  undotbs01.dbf

關閉數據庫

SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.

重新啓動

SQL> startup
ORACLE instance started.
Total System Global Area  285212672 bytes
Fixed Size                  1218992 bytes
Variable Size              83887696 bytes
Database Buffers          197132288 bytes
Redo Buffers                2973696 bytes
ORA-00205: error in identifying control file, check alert log for more info

警告日誌出現如下錯誤

 

Wed Jun 13 23:20:37 2012

ALTER DATABASE   MOUNT

Wed Jun 13 23:20:37 2012

ORA-00202: control file: '/u01/app/oracle/oradata/DG1/control01.ctl'

ORA-27037: unable to obtain file status

Linux Error: 2: No such file or directory

Additional information: 3

Wed Jun 13 23:20:40 2012

ORA-205 signalled during: ALTER DATABASE   MOUNT...

 

現在解決問題

將實例關閉,執行上面創建的恢復控制文件的腳本controlfile_trace1_1.sql

SQL> @controlfile_trace1_1.sql
ORACLE instance started.
Total System Global Area  285212672 bytes
Fixed Size                  1218992 bytes
Variable Size              83887696 bytes
Database Buffers          197132288 bytes
Redo Buffers                2973696 bytes
Control file created.
PL/SQL procedure successfully completed.
PL/SQL procedure successfully completed.
PL/SQL procedure successfully completed.
PL/SQL procedure successfully completed.
ORA-00283: recovery session canceled due to errors
ORA-00264: no recovery required
ALTER SYSTEM ARCHIVE LOG ALL
*
ERROR at line 1:
ORA-00271: there are no logs that need archiving
Database altered.
Tablespace altered.

恢復成功

 

查看數據庫當前狀態

SQL> selectstatus from v$instance
STATUS
------------
OPEN

 

恢復成功!爲了確保數據不丟失,我們應該定期將控制文件做追蹤備份到trace文件,生成恢復控制文件的sql腳本,以防控制文件全部丟失之後,在沒有歸檔模式下的全備份,我們可以通過這種方法恢復數據庫。

3)在歸檔模式下,對數據庫有完備,丟失全部控制文件

注意這裏一定要清楚自己備份集中控制文件備份存放的位置,否則當你幹掉全部控制文件後,進入RMAN模式是在NOMOUNT狀態,此時你無法查用RMAN來看備份集中控制文件的備份位置,更何談用備份集中的控制文件來恢復幹掉的所有控制文件然後再恢復數據庫。

先進入RMAN模式查看備份集中控制文件存放的位置

[oracle@DG1 ~]$ rman target sys/oracle@DG1
Recovery Manager: Release 10.2.0.1.0 - Production on Wed Jun 13 22:09:16 2012
Copyright (c) 1982, 2005, Oracle.  All rights reserved.
connected to target database: DG1 (DBID=1762320829)
RMAN> list backup;
List of Backup Sets
===================
BS Key  Type LV Size       Device Type Elapsed Time Completion Time
------- ---- -- ---------- ----------- ------------ ---------------
2       Incr 0  3.39G      DISK        00:08:22     13-JUN-12     
        BP Key: 2   Status: AVAILABLE  Compressed: NO  Tag: BACKUP_DG1_000001_061312022053
        Piece Name: /home/oracle/DiskBackupLocation/02ndeh2i_1_1
  List of Datafiles in backup set 2
  File LV Type Ckp SCN    Ckp Time  Name
  ---- -- ---- ---------- --------- ----
  1    0  Incr 675126     13-JUN-12 /u01/app/oracle/oradata/DG1/system01.dbf
  2    0  Incr 675126     13-JUN-12 /u01/app/oracle/oradata/DG1/undotbs01.dbf
  3    0  Incr 675126     13-JUN-12 /u01/app/oracle/oradata/DG1/sysaux01.dbf
  4    0  Incr 675126     13-JUN-12 /u01/app/oracle/oradata/DG1/users01.dbf
  5    0  Incr 675126     13-JUN-12 /u01/app/oracle/product/10.2.0.1/db_1/dbs/soe.dbf
BS Key  Type LV Size       Device Type Elapsed Time Completion Time
------- ---- -- ---------- ----------- ------------ ---------------
3       Full    7.08M      DISK        00:00:05     13-JUN-12     
        BP Key: 3   Status: AVAILABLE  Compressed: NO  Tag: TAG20120613T142932
        Piece Name: /home/oracle/DiskBackupLocation/c-1762320829-20120613-00
  Control File Included: Ckp SCN: 677193       Ckp time: 13-JUN-12
  SPFILE Included: Modification time: 13-JUN-12
BS Key  Size       Device Type Elapsed Time Completion Time
------- ---------- ----------- ------------ ---------------
4       1.14G      DISK        00:03:47     13-JUN-12     
        BP Key: 4   Status: AVAILABLE  Compressed: NO  Tag: BACKUP_DG1_000001_061312022053
        Piece Name: /home/oracle/DiskBackupLocation/04ndehir_1_1
  List of Archived Logs in backup set 4
  Thrd Seq     Low SCN    Low Time  Next SCN   Next Time
  ---- ------- ---------- --------- ---------- ---------
  1    6       524597     20-MAY-12 528875     13-JUN-12
  1    7       528875     13-JUN-12 528877     13-JUN-12
  1    8       528877     13-JUN-12 528880     13-JUN-12
  1    9       528880     13-JUN-12 529115     13-JUN-12
  1    10      529115     13-JUN-12 529117     13-JUN-12
  1    11      529117     13-JUN-12 529120     13-JUN-12
  1    12      529120     13-JUN-12 529129     13-JUN-12
  1    13      529129     13-JUN-12 529131     13-JUN-12
  1    14      529131     13-JUN-12 529134     13-JUN-12
  1    15      529134     13-JUN-12 529136     13-JUN-12
  1    16      529136     13-JUN-12 529138     13-JUN-12
  1    17      529138     13-JUN-12 529140     13-JUN-12
  1    18      529140     13-JUN-12 529142     13-JUN-12
  1    19      529142     13-JUN-12 529144     13-JUN-12
  1    20      529144     13-JUN-12 529154     13-JUN-12
  1    21      529154     13-JUN-12 529156     13-JUN-12
  1    22      529156     13-JUN-12 529158     13-JUN-12
  1    23      529158     13-JUN-12 529160     13-JUN-12
  1    24      529160     13-JUN-12 529162     13-JUN-12
  1    25      529162     13-JUN-12 529164     13-JUN-12
  1    26      529164     13-JUN-12 529431     13-JUN-12
  1    27      529431     13-JUN-12 529433     13-JUN-12
  1    28      529433     13-JUN-12 529436     13-JUN-12
  1    29      529436     13-JUN-12 529438     13-JUN-12
  1    30      529438     13-JUN-12 529440     13-JUN-12
  1    31      529440     13-JUN-12 529442     13-JUN-12
  1    32      529442     13-JUN-12 529444     13-JUN-12
  1    33      529444     13-JUN-12 529446     13-JUN-12
  1    34      529446     13-JUN-12 529448     13-JUN-12
  1    35      529448     13-JUN-12 529450     13-JUN-12
  1    36      529450     13-JUN-12 529452     13-JUN-12
  1    37      529452     13-JUN-12 529454     13-JUN-12
  1    38      529454     13-JUN-12 529456     13-JUN-12
  1    39      529456     13-JUN-12 529458     13-JUN-12
  1    40      529458     13-JUN-12 529460     13-JUN-12
  1    41      529460     13-JUN-12 529462     13-JUN-12
  1    42      529462     13-JUN-12 529464     13-JUN-12
  1    43      529464     13-JUN-12 529466     13-JUN-12
  1    44      529466     13-JUN-12 529468     13-JUN-12
  1    45      529468     13-JUN-12 529470     13-JUN-12
  1    46      529470     13-JUN-12 534645     13-JUN-12
  1    47      534645     13-JUN-12 539056     13-JUN-12
  1    48      539056     13-JUN-12 543505     13-JUN-12
  1    49      543505     13-JUN-12 547897     13-JUN-12
  1    50      547897     13-JUN-12 552310     13-JUN-12
  1    51      552310     13-JUN-12 556688     13-JUN-12
  1    52      556688     13-JUN-12 561084     13-JUN-12
  1    53      561084     13-JUN-12 565473     13-JUN-12
  1    54      565473     13-JUN-12 569854     13-JUN-12
  1    55      569854     13-JUN-12 574302     13-JUN-12
  1    56      574302     13-JUN-12 579860     13-JUN-12
  1    57      579860     13-JUN-12 586089     13-JUN-12
  1    58      586089     13-JUN-12 592233     13-JUN-12
  1    59      592233     13-JUN-12 598391     13-JUN-12
  1    60      598391     13-JUN-12 604553     13-JUN-12
  1    61      604553     13-JUN-12 610704     13-JUN-12
  1    62      610704     13-JUN-12 616840     13-JUN-12
  1    63      616840     13-JUN-12 623696     13-JUN-12
  1    64      623696     13-JUN-12 631159     13-JUN-12
  1    65      631159     13-JUN-12 637993     13-JUN-12
  1    66      637993     13-JUN-12 644418     13-JUN-12
  1    67      644418     13-JUN-12 650775     13-JUN-12
  1    68      650775     13-JUN-12 659810     13-JUN-12
  1    69      659810     13-JUN-12 677285     13-JUN-12
BS Key  Type LV Size       Device Type Elapsed Time Completion Time
------- ---- -- ---------- ----------- ------------ ---------------
5       Full    7.08M      DISK        00:00:03     13-JUN-12     
        BP Key: 5   Status: AVAILABLE  Compressed: NO  Tag: TAG20120613T143358
        Piece Name: /home/oracle/DiskBackupLocation/c-1762320829-20120613-01
  Control File Included: Ckp SCN: 679052       Ckp time: 13-JUN-12
  SPFILE Included: Modification time: 13-JUN-12

可以看出上面紅色部分BP Key 5是備份集中最新控制文件的存放位置,我們記住這個目錄,稍後恢復控制文件時要使用。

查看控制文件

SQL> select '!rm '||name from v$controlfile;
'!RM '||NAME
-------------------------------------------------------------------------------
!rm /u01/app/oracle/oradata/DG1/control01.ctl
!rm /u01/app/oracle/oradata/DG1/control02.ctl
!rm /u01/app/oracle/oradata/DG1/control03.ctl

將控制文件全部刪除

SQL> !rm /u01/app/oracle/oradata/DG1/control01.ctl
!rm /u01/app/oracle/oradata/DG1/control02.ctl
!rm /u01/app/oracle/oradata/DG1/control03.ctl

查看控制文件是否還存在

SQL> !ls /u01/app/oracle/oradata/DG1
redo01_a.log  redo02.log    sysaux01.dbf  undotbs01.dbf
redo01.log    redo03_a.log  system01.dbf  users01.dbf
redo02_a.log  redo03.log    temp01.dbf

將數據庫關閉,然後重新啓動

SQL> shutdown immediate;
ORA-00210: cannot open the specified control file
ORA-00202: control file: '/u01/app/oracle/oradata/DG1/control01.ctl'
ORA-27041: unable to open file
Linux Error: 2: No such file or directory
Additional information: 3

竟然正常關閉不了(之前做測試都能正常關閉),直接強制關閉

SQL> shutdown abort;
ORACLE instance shut down.

重新啓動數據庫

SQL> startup
ORACLE instance started.
Total System Global Area  285212672 bytes
Fixed Size                  1218992 bytes
Variable Size              88082000 bytes
Database Buffers          192937984 bytes
Redo Buffers                2973696 bytes
ORA-00205: error in identifying control file, check alert log for more info

出現報錯信息,不能識別控制文件,這是肯定的,由於缺少控制文件,數據庫在由nomount狀態啓動到mount狀態時要讀取控制文件中的內容,控制文件都木有了,怎麼能啓動到mount,還別說open了,所以在數據庫只能啓動到nomount狀態。由於我們有歸檔模式下的RMAN全備,所以我們可以藉助RMAN備份集來恢復參數文件。

SQL> select status from v$instance;
STATUS
------------
STARTED

進入RMAN模式

[oracle@DG1 ~]$ rman target sys/oracle@DG1
Recovery Manager: Release 10.2.0.1.0 - Production on Wed Jun 13 22:01:19 2012
Copyright (c) 1982, 2005, Oracle.  All rights reserved.
connected to target database: DG1 (not mounted)

現在從RMAN完備數據庫的備份集中進行控制文件的恢復

RMAN> restore controlfile from '/home/oracle/DiskBackupLocation/c-1762320829-20120613-01';
Starting restore at 13-JUN-12
using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: sid=155 devtype=DISK
channel ORA_DISK_1: restoring control file
channel ORA_DISK_1: restore complete, elapsed time: 00:00:06
output filename=/u01/app/oracle/oradata/DG1/control01.ctl
output filename=/u01/app/oracle/oradata/DG1/control02.ctl
output filename=/u01/app/oracle/oradata/DG1/control03.ctl
Finished restore at 13-JUN-12

可以看到控制文件已經由全備份集中的控制文件成功恢復

 

恢復控制完畢,查看控制文件

[oracle@DG1 ~]$ ls /u01/app/oracle/oradata/DG1/
control01.ctl  redo01_a.log  redo02.log    sysaux01.dbf  undotbs01.dbf
control02.ctl  redo01.log    redo03_a.log  system01.dbf  users01.dbf
control03.ctl  redo02_a.log  redo03.log    temp01.dbf

將數據庫啓動到mount狀態恢復數據庫

RMAN> alter database mount;
database mounted
released channel: ORA_DISK_1

成功啓動到mount狀態

執行RMAN恢復數據庫的操作 

RMAN> recover database;
Starting recover at 13-JUN-12
Starting implicit crosscheck backup at 13-JUN-12
allocated channel: ORA_DISK_1
channel ORA_DISK_1: sid=155 devtype=DISK
Crosschecked 3 objects
Finished implicit crosscheck backup at 13-JUN-12
Starting implicit crosscheck copy at 13-JUN-12
using channel ORA_DISK_1
Finished implicit crosscheck copy at 13-JUN-12
searching for all files in the recovery area
cataloging files...
no files cataloged
using channel ORA_DISK_1
starting media recovery
archive log thread 1 sequence 70 is already on disk as file /u01/app/oracle/oradata/DG1/redo03.log
archive log thread 1 sequence 71 is already on disk as file /u01/app/oracle/oradata/DG1/redo01.log
archive log filename=/u01/app/oracle/oradata/DG1/redo03.log thread=1 sequence=70
archive log filename=/u01/app/oracle/oradata/DG1/redo01.log thread=1 sequence=71
media recovery complete, elapsed time: 00:00:01
Finished recover at 13-JUN-12

數據庫恢復成功 

打開數據庫

RMAN> alter database open resetlogs;
database opened              
RMAN>

成功恢復

 

由於數據庫一直處於歸檔模式,所以從歸檔下的完備份集恢復數據庫,可以保證數據不丟失,當由備份集恢復控制文件之後,接着會從數據庫的歸檔日誌和undo日誌文件中讀取SCN信息,將恢復的控制文件更新到最新狀態。

五、總結

沒有不丟失數據的數據庫,所以經常備份數據,是很有必要的,也許某一天數據庫就掛掉了,如果有備份,恢復當然容易,如果沒有,也許結果就不一樣了………無論你的數據庫是以何種方式恢復的,一定切記恢復後,做一次歸檔下的全備,這樣就可以儘可能降低恢復數據庫後數據庫再次掛掉後丟失數據的可能性。


原文來自:http://blog.sina.com.cn/s/blog_70e5638f01016s8b.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章