在平时工作中,我们可能会或多或少遇到数据迁移问题,比如:数据库之前在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库,所以备份的信息存储在控制文件中,当还原数据时,首先还原控制文件,控制文件记录了你的备份信息,如果先备份控制文件,那么在备份的控制文件之后做的备份信息,就没有记录在此备份的控制文件中,请大家注意哈)
全库备份
[email protected]:/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方式来修改数据库名)
[email protected]:/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.
[email protected]:/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完成。
二:在目标库恢复
创建目标库需要的目录,此处省略…………
创建目标库的口令文件
[email protected]:/u01/oracle> orapwd file=?/dbs/orapwdoric password=oracle
创建初始化参数文件
将源库的pfile文件拷贝过来,修改里面的实例名和路径,然后 启动oric实例到nomount状态
[email protected]:/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
[email protected]:/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
原文地址:https://www.cnblogs.com/hftian/p/12698634.html