Oracle異機恢復處理
在平時工作中,我們可能會或多或少遇到數據遷移問題,比如:數據庫之前在windows機器上,然后我們由於更換新服務器,想把數據遷移到新服務器上,新服務器安裝的是linux系統。由於系統不同,目錄結構肯定也不一樣,所以在備份恢復數據時,我們就遇到很多問題。下面分享下我處理這種問題的恢復方法。
環境:SUSE linux10(由於資源有限,源庫和目標庫都在此服務器上,但不影響操作方法,源庫和目標庫的文件位置不同,這個是重點,因為異構系統的文件存放路徑肯定不一致,比如上面提到windows系統的庫恢復到linux系統上)。
源庫:db_name:ceshidb,instance_name: ceshidb
目標庫:db_name: ceshidb,instance_name: oric
測試版本:10.2.0.5
幾點說明:
(1) RMAN 恢復的時候,db_name必須相同。如果說要想改成其他的數據庫名,可以在恢復成功后,用nid 命令修改。數據庫名的信息會記錄到控制文件里,所以如果在恢復的時候,如果db_name不一致,恢復的時候會報錯。
(2) 如果恢復的路徑和源庫不一致,就需要在restore時用set 命令指定新位置。 並且使用switch datafile all將信息更新的到控制文件。
開始實戰操作
一:備份源庫數據
先做全庫備份(可以把歸檔備份和控制文件備份寫到一個run里面,我是分開備份的,目的在於說明下備份順序,全庫備份-歸檔日志備份-控制文件備份,建議大家采用這樣的順序來備份數據,因為一般都沒有配置catalog庫,所以備份的信息存儲在控制文件中,當還原數據時,首先還原控制文件,控制文件記錄了你的備份信息,如果先備份控制文件,那么在備份的控制文件之后做的備份信息,就沒有記錄在此備份的控制文件中,請大家注意哈)
全庫備份
oracle@nwsj:/u01/oracle/oradata> rman target /
Recovery Manager: Release 10.2.0.5.0 - Production on Thu Jan 21 18:49:522016
Copyright (c) 1982, 2007, Oracle. All rights reserved.
connected to target database: CESHIDB (DBID=2027504492)
RMAN> run {
allocate channel d1 type disk;
allocate channel d2 type disk;
backup database format '/u01/backup_full_%U';
release channel d1;
release channel d2;
}
allocate channel d1 type disk;
allocate channel d2 type disk;
Starting backup at 21-JAN-16
allocated channel: ORA_DISK_1
channel ORA_DISK_1: sid=142 devtype=DISK
channel ORA_DISK_1: starting full datafile backupset
channel ORA_DISK_1: specifying datafile(s) in backupset
input datafile fno=00009 name=/u01/oracle/oradata/ceshiku/cs_dir03.dbf
input datafile fno=00004 name=/u01/oracle/oradata/ceshiku/users01.dbf
input datafile fno=00002 name=/u01/oracle/oradata/ceshiku/undotbs01.dbf
input datafile fno=00001 name=/u01/oracle/oradata/ceshiku/system01.dbf
input datafile fno=00003 name=/u01/oracle/oradata/ceshiku/sysaux01.dbf
input datafile fno=00006 name=/u01/oracle/oradata/ceshiku/CS_DIR02.dbf
input datafile fno=00007 name=/u01/oracle/oradata/ceshiku/aa01.dbf
input datafile fno=00005 name=/u01/oracle/oradata/ceshiku/cs_dir01.dbf
input datafile fno=00010 name=/u01/oracle/oradata/ceshiku/b02.dbf
input datafile fno=00008 name=/u01/oracle/oradata/ceshiku/b01.dbf
channel ORA_DISK_1: starting piece 1 at 21-JAN-16
channel ORA_DISK_1: finished piece 1 at 21-JAN-16
piece handle=/u01/backup_full_01qrurnv_1_1 tag=TAG20160121T185039comment=NONE
channel ORA_DISK_1: backup set complete, elapsed time: 00:00:15
channel ORA_DISK_1: starting full datafile backupset
channel ORA_DISK_1: specifying datafile(s) in backupset
including current control file in backupset
including current SPFILE in backupset
channel ORA_DISK_1: starting piece 1 at 21-JAN-16
channel ORA_DISK_1: finished piece 1 at 21-JAN-16
piece handle=/u01/backup_full_02qruroe_1_1 tag=TAG20160121T185039comment=NONE
channel ORA_DISK_1: backup set complete, elapsed time: 00:00:01
released channel: d1
released channel: d2
Finished backup at 21-JAN-16
切換下日志
RMAN> sql 'alter system switch logfile';
sql statement: alter system switch logfile
RMAN> sql 'alter system switch logfile';
sql statement: alter system switch logfile
歸檔日志備份
RMAN> backup archivelog all format '/u01/backup_arch_%U';
Starting backup at 21-JAN-16
current log archived
using channel ORA_DISK_1
channel ORA_DISK_1: starting archive log backupset
channel ORA_DISK_1: specifying archive log(s) in backup set
input archive log thread=1 sequence=1 recid=1 stamp=901738168
input archive log thread=1 sequence=2 recid=2 stamp=901738171
input archive log thread=1 sequence=3 recid=3 stamp=901738174
input archive log thread=1 sequence=4 recid=4 stamp=901738276
input archive log thread=1 sequence=5 recid=5 stamp=901738282
input archive log thread=1 sequence=6 recid=6 stamp=901738288
input archive log thread=1 sequence=7 recid=7 stamp=901738309
channel ORA_DISK_1: starting piece 1 at 21-JAN-16
channel ORA_DISK_1: finished piece 1 at 21-JAN-16
piece handle=/u01/backup_arch_03qrurq5_1_1 tag=TAG20160121T185149comment=NONE
channel ORA_DISK_1: backup set complete, elapsed time: 00:00:02
Finished backup at 21-JAN-16
控制文件備份
RMAN> backup current controlfile format'/u01/backup_con_%U';
Starting backup at 21-JAN-16
using channel ORA_DISK_1
channel ORA_DISK_1: starting full datafilebackupset
channel ORA_DISK_1: specifying datafile(s)in backupset
including current control file in backupset
channel ORA_DISK_1: starting piece 1 at21-JAN-16
channel ORA_DISK_1: finished piece 1 at21-JAN-16
piece handle=/u01/backup_con_04qrurr1_1_1tag=TAG20160121T185217 comment=NONE
channel ORA_DISK_1: backup set complete,elapsed time: 00:00:01
Finished backup at 21-JAN-16
然后關閉源庫ceshidb(因為我是在同一台服務器上做的,所以需要修改下源庫的db_name,否則在目標庫恢復了控制文件后,不能mount的,會提示:cannot mount database inEXCLUSIVE mode,因為在$ORACLE_HOME/dbs下面的lkceshidb文件存在,進程在運行中,所以會有這個提示。如果是不同的服務器,則不需要此操作,順便練習下nid方式來修改數據庫名)
oracle@nwsj:/u01/oracle> nid target=/dbname=ceshiku
DBNEWID: Release 10.2.0.5.0 - Production onThu Jan 21 18:53:52 2016
Copyright (c) 1982, 2007, Oracle. All rights reserved.
Connected to database CESHIDB(DBID=2027504492)
Connected to server version 10.2.0
Control Files in database:
/u01/oracle/oradata/ceshiku/control01.ctl
/u01/oracle/oradata/ceshiku/control02.ctl
/u01/oracle/oradata/ceshiku/control03.ctl
Change database ID and database nameCESHIDB to CESHIKU? (Y/[N]) => y
Proceeding with operation
Changing database ID from 2027504492 to429152512
Changing database name from CESHIDB toCESHIKU
Control File /u01/oracle/oradata/ceshiku/control01.ctl - modified
Control File /u01/oracle/oradata/ceshiku/control02.ctl - modified
Control File/u01/oracle/oradata/ceshiku/control03.ctl - modified
Datafile /u01/oracle/oradata/ceshiku/system01.dbf - dbid changed, wrotenew name
Datafile /u01/oracle/oradata/ceshiku/undotbs01.dbf - dbid changed, wrotenew name
Datafile /u01/oracle/oradata/ceshiku/sysaux01.dbf - dbid changed, wrotenew name
Datafile /u01/oracle/oradata/ceshiku/users01.dbf - dbid changed, wrotenew name
Datafile /u01/oracle/oradata/ceshiku/cs_dir01.dbf - dbid changed, wrotenew name
Datafile /u01/oracle/oradata/ceshiku/CS_DIR02.dbf - dbid changed, wrotenew name
Datafile /u01/oracle/oradata/ceshiku/aa01.dbf - dbid changed, wrote newname
Datafile /u01/oracle/oradata/ceshiku/b01.dbf - dbid changed, wrote newname
Datafile /u01/oracle/oradata/ceshiku/cs_dir03.dbf - dbid changed, wrote new name
Datafile /u01/oracle/oradata/ceshiku/b02.dbf - dbid changed, wrote newname
Control File /u01/oracle/oradata/ceshiku/control01.ctl - dbid changed,wrote new name
Control File /u01/oracle/oradata/ceshiku/control02.ctl - dbid changed,wrote new name
Control File /u01/oracle/oradata/ceshiku/control03.ctl - dbid changed,wrote new name
Instance shut down
Database name changed to CESHIKU.
Modify parameter file and generate a newpassword file before restarting.
Database ID for database CESHIKU changed to429152512.
All previous backups and archived redo logsfor this database are unusable.
Database is not aware of previous backupsand archived logs in Recovery Area.
Database has been shutdown, open databasewith RESETLOGS option.
Succesfully changed database name and ID.
DBNEWID - Completed succesfully.
oracle@nwsj:/u01/oracle> sqlplus / assysdba
SQL*Plus: Release 10.2.0.5.0 - Productionon Thu Jan 21 18:54:03 2016
Copyright (c) 1982, 2010, Oracle. All Rights Reserved.
Connected to an idle instance.
SQL> alter system set db_name='ceshiku'scope=spfile;
System altered.
SQL> shutdown immediate;
ORA-01109: database not open
Database dismounted.
ORACLE instance shut down.
SQL> startup;
ORACLE instance started.
Total System Global Area 2147483648 bytes
Fixed Size 2097624 bytes
Variable Size 939527720 bytes
Database Buffers 1174405120 bytes
Redo Buffers 31453184 bytes
Database mounted.
ORA-01589: must use RESETLOGS orNORESETLOGS option for database open
SQL> alter database open resetlogs;
Database altered.
Ok,至此,源庫修改db_name完成。
二:在目標庫恢復
創建目標庫需要的目錄,此處省略…………
創建目標庫的口令文件
oracle@nwsj:/u01/oracle> orapwd file=?/dbs/orapwdoric password=oracle
創建初始化參數文件
將源庫的pfile文件拷貝過來,修改里面的實例名和路徑,然后 啟動oric實例到nomount狀態
oracle@nwsj:/u01/oracle>export ORACLE_SID=oric
SQL> create spflie from pfile=’/home/oracle/initoric.pfile’;
spfile created.
SQL> STARTUP NOMOUNT;
ORACLE instance started.
Total System Global Area 1073741824 bytes
Fixed Size 2101608 bytes
Variable Size 260050584 bytes
Database Buffers 788529152 bytes
Redo Buffers 23060480 bytes
RMAN恢復控制文件並啟動數據庫到mount
oracle@nwsj:/u01/oracle/product/10.2.0/db_1/dbs>$ORACLE_HOME/bin/rman target /
Recovery Manager: Release 10.2.0.5.0 -Production on Thu Jan 21 19:33:34 2016
Copyright (c) 1982, 2007, Oracle. All rights reserved.
connected to target database: ceshidb (notmounted)
RMAN> restore controlfile from'/u01/backup_con_04qrurr1_1_1';
Starting restore at 21-JAN-16
using target database control file insteadof recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: sid=152 devtype=DISK
channel ORA_DISK_1: restoring control file
channel ORA_DISK_1: restore complete,elapsed time: 00:00:01
outputfilename=/u01/oracle/oradata/oric/control01.ctl
outputfilename=/u01/oracle/oradata/oric/control02.ctl
outputfilename=/u01/oracle/oradata/oric/control03.ctl
Finished restore at 21-JAN-16
RMAN> alter database mount;
database mounted
released channel: ORA_DISK_1
RMAN恢復數據文件
RMAN> run
2> {
3> allocate channel d1 type disk;
4> allocate channel d2 type disk;
5> set newname for datafile'/u01/oracle/oradata/ceshiku/system01.dbf' to '/u01/oracle/oradata/oric/system01.dbf';
6> set newname for datafile'/u01/oracle/oradata/ceshiku/undotbs01.dbf' to'/u01/oracle/oradata/oric/undotbs01.dbf';
7> set newname for datafile'/u01/oracle/oradata/ceshiku/sysaux01.dbf' to '/u01/oracle/oradata/oric/sysaux01.dbf';
8> set newname for datafile'/u01/oracle/oradata/ceshiku/users01.dbf' to'/u01/oracle/oradata/oric/users01.dbf';
9> set newname for datafile'/u01/oracle/oradata/ceshiku/cs_dir01.dbf' to'/u01/oracle/oradata/oric/cs_dir01.dbf';
10> set newname for datafile'/u01/oracle/oradata/ceshiku/CS_DIR02.dbf' to'/u01/oracle/oradata/oric/CS_DIR02.dbf';
11> set newname for datafile'/u01/oracle/oradata/ceshiku/aa01.dbf' to '/u01/oracle/oradata/oric/aa01.dbf';
12> set newname for datafile '/u01/oracle/oradata/ceshiku/b01.dbf'to '/u01/oracle/oradata/oric/b01.dbf';
13> set newname for datafile'/u01/oracle/oradata/ceshiku/cs_dir03.dbf ' to'/u01/oracle/oradata/oric/cs_dir03.dbf ';
14> set newname for datafile'/u01/oracle/oradata/ceshiku/b02.dbf' to '/u01/oracle/oradata/oric/b02.dbf';
15> restore database;
16> switch datafile all;
17> release channel d1;
18> release channel d2;
19> }
allocated channel: d1
channel d1: sid=152 devtype=DISK
allocated channel: d2
channel d2: sid=151 devtype=DISK
executing command: SET NEWNAME
executing command: SET NEWNAME
executing command: SET NEWNAME
executing command: SET NEWNAME
executing command: SET NEWNAME
executing command: SET NEWNAME
executing command: SET NEWNAME
executing command: SET NEWNAME
executing command: SET NEWNAME
executing command: SET NEWNAME
Starting restore at 21-JAN-16
Starting implicit crosscheck backup at21-JAN-16
Crosschecked 3 objects
Finished implicit crosscheck backup at21-JAN-16
Starting implicit crosscheck copy at 21-JAN-16
Finished implicit crosscheck copy at21-JAN-16
searching for all files in the recoveryarea
cataloging files...
no files cataloged
channel d1: starting datafile backupsetrestore
channel d1: specifying datafile(s) torestore from backup set
restoring datafile 00001 to/u01/oracle/oradata/oric/system01.dbf
restoring datafile 00002 to/u01/oracle/oradata/oric/undotbs01.dbf
restoring datafile 00003 to/u01/oracle/oradata/oric/sysaux01.dbf
restoring datafile 00004 to/u01/oracle/oradata/oric/users01.dbf
restoring datafile 00005 to/u01/oracle/oradata/oric/cs_dir01.dbf
restoring datafile 00006 to/u01/oracle/oradata/oric/CS_DIR02.dbf
restoring datafile 00007 to/u01/oracle/oradata/oric/aa01.dbf
restoring datafile 00008 to/u01/oracle/oradata/oric/b01.dbf
restoring datafile 00009 to/u01/oracle/oradata/oric/cs_dir03.dbf
restoring datafile 00010 to/u01/oracle/oradata/oric/b02.dbf
channel d1: reading from backup piece/u01/backup_full_01qrurnv_1_1
channel d1: restored backup piece 1
piece handle=/u01/backup_full_01qrurnv_1_1tag=TAG20160121T185039
channel d1: restore complete, elapsed time:00:01:05
Finished restore at 21-JAN-16
datafile 1 switched to datafile copy
input datafile copy recid=11 stamp=901740940filename=/u01/oracle/oradata/oric/system01.dbf
datafile 2 switched to datafile copy
input datafile copy recid=12stamp=901740940 filename=/u01/oracle/oradata/oric/undotbs01.dbf
datafile 3 switched to datafile copy
input datafile copy recid=13 stamp=901740940filename=/u01/oracle/oradata/oric/sysaux01.dbf
datafile 4 switched to datafile copy
input datafile copy recid=14stamp=901740940 filename=/u01/oracle/oradata/oric/users01.dbf
datafile 5 switched to datafile copy
input datafile copy recid=15stamp=901740940 filename=/u01/oracle/oradata/oric/cs_dir01.dbf
datafile 6 switched to datafile copy
input datafile copy recid=16stamp=901740940 filename=/u01/oracle/oradata/oric/CS_DIR02.dbf
datafile 7 switched to datafile copy
input datafile copy recid=17stamp=901740940 filename=/u01/oracle/oradata/oric/aa01.dbf
datafile 8 switched to datafile copy
input datafile copy recid=18stamp=901740940 filename=/u01/oracle/oradata/oric/b01.dbf
datafile 9 switched to datafile copy
input datafile copy recid=19stamp=901740940 filename=/u01/oracle/oradata/oric/cs_dir03.dbf
datafile 10 switched to datafile copy
input datafile copy recid=20stamp=901740940 filename=/u01/oracle/oradata/oric/b02.dbf
released channel: d1
released channel: d2
(注意,因為我們的路徑不同,所以我們需要使用set 命令轉換一下路徑。
還需要switch datafile all,是用來更新控制文件里的信息。因為數據文件的路徑信息等存在控制文件中)
RECOVER DB
RMAN> recover database;
Starting recover at 21-JAN-16
using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: sid=153 devtype=DISK
starting media recovery
archive log thread 1 sequence 4 is already on disk as file/u01/backup/ceshiku/archivelog/1_4_901735878.dbf
archive log thread 1 sequence 5 is already on disk as file/u01/backup/ceshiku/archivelog/1_5_901735878.dbf
archive log thread 1 sequence 6 is already on disk as file/u01/backup/ceshiku/archivelog/1_6_901735878.dbf
archive log thread 1 sequence 7 is already on disk as file/u01/backup/ceshiku/archivelog/1_7_901735878.dbf
archive log filename=/u01/backup/ceshiku/archivelog/1_4_901735878.dbfthread=1 sequence=4
archive log filename=/u01/backup/ceshiku/archivelog/1_5_901735878.dbfthread=1 sequence=5
archive log filename=/u01/backup/ceshiku/archivelog/1_6_901735878.dbfthread=1 sequence=6
archive log filename=/u01/backup/ceshiku/archivelog/1_7_901735878.dbfthread=1 sequence=7
unable to find archive log
archive log thread=1 sequence=8
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: failure of recover command at 01/21/2016 19:41:13
RMAN-06054: media recovery requesting unknown log: thread 1 seq 8 lowscn9671019808993
因為缺少online redolog,所以提示找不到thread 1 seq 8日志組,我們可以在recover database時候,通過set until scn或者setuntil time命令設置恢復到的scn號或時間。就可以避免這個錯誤。
查詢下v$datafile_header記錄的scn和v$datafile記錄的scn,以及系統scn,還有數據文件終止scn,如下:
SQL> selectname,to_char(checkpoint_change#) from v$datafile_header;
NAME
--------------------------------------------------------------------------------
TO_CHAR(CHECKPOINT_CHANGE#)
----------------------------------------
/u01/oracle/oradata/oric/system01.dbf
9671019808993
/u01/oracle/oradata/oric/undotbs01.dbf
9671019808993
/u01/oracle/oradata/oric/sysaux01.dbf
9671019808993
NAME
--------------------------------------------------------------------------------
TO_CHAR(CHECKPOINT_CHANGE#)
----------------------------------------
/u01/oracle/oradata/oric/users01.dbf
9671019808993
/u01/oracle/oradata/oric/cs_dir01.dbf
9671019808993
/u01/oracle/oradata/oric/CS_DIR02.dbf
9671019808993
NAME
--------------------------------------------------------------------------------
TO_CHAR(CHECKPOINT_CHANGE#)
----------------------------------------
/u01/oracle/oradata/oric/aa01.dbf
9671019808993
/u01/oracle/oradata/oric/b01.dbf
9671019808993
/u01/oracle/oradata/oric/cs_dir03.dbf
9671019808993
NAME
--------------------------------------------------------------------------------
TO_CHAR(CHECKPOINT_CHANGE#)
----------------------------------------
/u01/oracle/oradata/oric/b02.dbf
9671019808993
10 rows selected.
SQL> selectname,to_char(checkpoint_change#) from v$datafile;
NAME
--------------------------------------------------------------------------------
TO_CHAR(CHECKPOINT_CHANGE#)
----------------------------------------
/u01/oracle/oradata/oric/system01.dbf
9671019808993
/u01/oracle/oradata/oric/undotbs01.dbf
9671019808993
/u01/oracle/oradata/oric/sysaux01.dbf
9671019808993
NAME
--------------------------------------------------------------------------------
TO_CHAR(CHECKPOINT_CHANGE#)
----------------------------------------
/u01/oracle/oradata/oric/users01.dbf
9671019808993
/u01/oracle/oradata/oric/cs_dir01.dbf
9671019808993
/u01/oracle/oradata/oric/CS_DIR02.dbf
9671019808993
NAME
--------------------------------------------------------------------------------
TO_CHAR(CHECKPOINT_CHANGE#)
----------------------------------------
/u01/oracle/oradata/oric/aa01.dbf
9671019808993
/u01/oracle/oradata/oric/b01.dbf
9671019808993
/u01/oracle/oradata/oric/cs_dir03.dbf
9671019808993
NAME
--------------------------------------------------------------------------------
TO_CHAR(CHECKPOINT_CHANGE#)
----------------------------------------
/u01/oracle/oradata/oric/b02.dbf
9671019808993
10 rows selected.
SQL> selectto_char(checkpoint_change#) from v$database;
TO_CHAR(CHECKPOINT_CHANGE#)
----------------------------------------
9671019808993
SQL> selectname,to_char(last_change#) from v$datafile;
NAME
--------------------------------------------------------------------------------
TO_CHAR(LAST_CHANGE#)
----------------------------------------
/u01/oracle/oradata/oric/system01.dbf
/u01/oracle/oradata/oric/undotbs01.dbf
/u01/oracle/oradata/oric/sysaux01.dbf
NAME
--------------------------------------------------------------------------------
TO_CHAR(LAST_CHANGE#)
----------------------------------------
/u01/oracle/oradata/oric/users01.dbf
/u01/oracle/oradata/oric/cs_dir01.dbf
/u01/oracle/oradata/oric/CS_DIR02.dbf
NAME
--------------------------------------------------------------------------------
TO_CHAR(LAST_CHANGE#)
----------------------------------------
/u01/oracle/oradata/oric/aa01.dbf
/u01/oracle/oradata/oric/b01.dbf
/u01/oracle/oradata/oric/cs_dir03.dbf
NAME
--------------------------------------------------------------------------------
TO_CHAR(LAST_CHANGE#)
----------------------------------------
/u01/oracle/oradata/oric/b02.dbf
10 rows selected.
數據庫重新啟動的時候,Oracle將文件頭中的那個啟動scn(v$datafile_header中記錄的scn)與數據庫文件檢查點scn進行比較,如果這兩個值相互匹配,oracle接下來還要比較數據文件頭中的啟動scn和控制文件中數據文件的終止scn。如果這兩個值也一致,就意味着所有數據塊多已經提交,所有對數據庫的修改都沒有在關閉數據庫的過程中丟失,因此這次啟動數據庫的過程也不需要任何恢復操作,此時數據庫就可以打開了。當所有的數據庫都打開之后,存儲在控制文件中的數據文件終止scn的值再次被更改為null,這表示數據文件已經打開並能夠正常使用了。如果數據庫是異常關閉或者通過不完全恢復過來的,那么終止scn會是null,所以啟動數據庫時,就需要做實例恢復,利用online redolog來恢復數據庫,這也就是實例啟動時,SMON進程會去利用redolog做恢復,俗稱‘前滾‘數據庫。
通過查詢上述SCN號,我們可以看到,我們做了不完全恢復,需要以open resetlogs方式打開數據庫。
嘗試openresetlogs啟動數據庫
SQL> alter database openresetlogs;
alter database open resetlogs
*
ERROR at line 1:
ORA-00344: unable to re-createonline log
'/u01/oracle/oradata/ceshiku/redo01.log'
ORA-27040: file create error,unable to create file
Linux-x86_64 Error: 2: No suchfile or directory
發現啟動不了的,提示不能創建redo01.log,沒有此目錄(我是把/u01/oracle/oradata/ceshiku這個目錄改名了,異構系統的話,也不會存在源庫這樣的目錄,比如windows到linux)
接下來我們查詢日志文件信息,如下:
SQL> select * fromv$logfile;
GROUP# STATUS TYPE
---------- ------- -------
MEMBER
--------------------------------------------------------------------------------
IS_
---
2 ONLINE
/u01/oracle/oradata/ceshiku/redo02.log
NO
1 ONLINE
/u01/oracle/oradata/ceshiku/redo01.log
NO
GROUP# STATUS TYPE
---------- ------- -------
MEMBER
--------------------------------------------------------------------------------
IS_
---
3 ONLINE
/u01/oracle/oradata/ceshiku/redo03.log
NO
可以看到控制文件記錄的日志信息還是源庫的,查詢v$log視圖
SQL> select sequence#,group#,status from v$log;
SEQUENCE# GROUP# STATUS
---------- ---------- ----------------
8 1 CURRENT
9 2 INACTIVE
10 3 INACTIVE
可以看到日志8處於current,那么想通過新增日志組,刪除8,9,10日志組是不行的,因為current日志組是不能刪掉的。
我們雖然不能刪除8這個日志組,但是可以新增日志組文件,然后重建控制文件,清除控制文件保留的日志信息,然后以open resetlogs方式打開數據庫。具體操作如下:
SQL> alter database addlogfile group 4'/u01/oracle/oradata/oric/redo04.dbf' size 50M;
Database altered.
SQL> alter database addlogfile group 5 '/u01/oracle/oradata/oric/redo05.dbf' size 50M;
Database altered.
SQL> alter database addlogfile group 6 '/u01/oracle/oradata/oric/redo06.dbf' size 50M;
Database altered.
備份控制文件到trace文件
SQL> alter database backupcontrolfile to trace as '/home/oracle/aaa.ctl';
Database altered.
然后打開這個trace文件,摘出里面重建控制文件,制作腳本。
關閉數據庫,重新啟動到nomount,然后重建控制文件。(注意,以resetlogs方式重建控制文件)
SQL> shutdown immediate;
ORA-01109: database not open
Database dismounted.
ORACLE instance shut down.
SQL> STARTUP NOMOUNT;
ORACLE instance started.
Total System Global Area1073741824 bytes
Fixed Size 2101608 bytes
Variable Size 260050584 bytes
Database Buffers 788529152 bytes
Redo Buffers 23060480 bytes
SQL> CREATE CONTROLFILE REUSEDATABASE "CESHIDB" RESETLOGS ARCHIVELOG
2 MAXLOGFILES 16
3 MAXLOGMEMBERS 3
4 MAXDATAFILES 100
5 MAXINSTANCES 8
6 MAXLOGHISTORY 292
7 LOGFILE
8 GROUP 4 '/u01/oracle/oradata/oric/redo04.dbf' SIZE 50M,
9 GROUP 5'/u01/oracle/oradata/oric/redo05.dbf' SIZE 50M,
10 GROUP 6 '/u01/oracle/oradata/oric/redo06.dbf' SIZE 50M
11 --STANDBY LOGFILE
12 DATAFILE
13 '/u01/oracle/oradata/oric/system01.dbf',
14 '/u01/oracle/oradata/oric/undotbs01.dbf',
15 '/u01/oracle/oradata/oric/sysaux01.dbf',
16 '/u01/oracle/oradata/oric/users01.dbf',
17 '/u01/oracle/oradata/oric/cs_dir01.dbf',
18 '/u01/oracle/oradata/oric/CS_DIR02.dbf',
19 '/u01/oracle/oradata/oric/aa01.dbf',
20 '/u01/oracle/oradata/oric/b01.dbf',
21 '/u01/oracle/oradata/oric/cs_dir03.dbf ',
22 '/u01/oracle/oradata/oric/b02.dbf'
23 CHARACTER SET ZHS16GBK;
Control file created.
然后以open resetlogs方式打開庫。
SQL> alter database openresetlogs;
Database altered.
完成后,還需要善后工作,重建temp表空間
SQL> create temporary tablespace TEMP1 TEMPFILE '/u01/oracle/oradata/oric/temp01.DBF'SIZE 512M REUSE AUTOEXTEND ON NEXT 1M MAXSIZE UNLIMITED;
至此所有工作順利完畢。
后記:之前看過很多人寫的異機恢復數據庫,目錄結構也不同,在做完recover database,就以open resetlogs方式打開庫了,然后才去處理online redolog和temp表空間,可是仔細想下下此問題,包括我上面的實驗,可以看到,實際上是不能直接open resetlogs,因為控制文件屬於源庫的,還原到目標庫上,在restoredatabase時,通過set new name for的方式把數據文件恢復到了新的目錄上,通過switch datafile all,把數據文件的路徑信息更新到控制文件中,但是onlineredolog的信息一點都沒有變化的,所以在嘗試直接open resetlogs啟動數據庫時,會報錯的。除非你可以創建一個和源庫一樣的目錄,來記錄online redolog,然后open resetlogs后,在添加日志組,刪除之前舊的日志組。(如果是異構系統,比如windows到linux,是創建不了這樣的目錄的,所以異構系統,建議采用上述方式來處理)
————————————————
版權聲明:本文為CSDN博主「renhui1234」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/qq_22935429/java/article/details/50558321