--RMAN数据库异机迁移步骤
----------------------------2013/09/28
测试环境:AIX+ora11g
一. source数据库准备。
1.获取数据文件编号和路径
SQL> select file_id,file_name from dba_data_files order by file_id;
FILE_ID FILE_NAME
---------- ------------------------------------------------------------
1 /u01/app/oracle/oradata/august/august/system01.dbf
2 /u01/app/oracle/oradata/august/august/sysaux01.dbf
3 /u01/app/oracle/oradata/august/august/undotbs01.dbf
4 /u01/app/oracle/oradata/august/august/users01.dbf
2.获取临时文件编号和路径
SQL> select file#, name from v$tempfile;
FILE# NAME
---------- --------------------------------------------------
1 /u01/app/oracle/oradata/august/august/temp01.dbf
2.获取在线日志文件组和路径
SQL> select group#,member from v$logfile;
GROUP# MEMBER
---------- ------------------------------------------------------------
3 /u01/app/oracle/oradata/august/august/redo03.log
2 /u01/app/oracle/oradata/august/august/redo02.log
1 /u01/app/oracle/oradata/august/august/redo01.log
二. source数据库备份。
1. rman备份脚本
run {
Allocate channel rman_1 type disk;
Allocate channel rman_2 type disk;
Allocate channel rman_2 type disk;
sql ‘alter system switch logfile’;
backup database format ‘/~dir/df_%T_%U.dbf’; --备份数据文件
backup current controlfile format ‘/~dir/cf_%T_%U.ctf’; --备份控制文件
backup spfile format ‘/~dir/sp_%T_%U.sp’; --备份参数文件
sql ‘alter system archive log current’; --归档备份期间日志,手动添加到备份集中。
release channel rman_1;
release channel rman_2;
release channel rman_3;
}
备份归档日志到备份集中。
2. FTP传输备份介质到异机。
三. 目标数据库异机恢复。
1. 恢复参数文件
设置目标实例名环境变量,启动rman连接。
[Oracle@localhost ~]$ export ORACLE_SID=ors
[Oracle@localhost ~]$ rman target /
Recovery Manager: Release 11.2.0.1.0 - Production on Fri Sep 27 20:13:47 2013
Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved.
connected to target database (not started)
启动到实例到nomount下。
RMAN> startup nomount;
startup failed: ORA-01078: failure in processing system parameters
LRM-00109: could not open parameter file '/u01/app/oracle/product/11.2.0/db_1/dbs/initors.ora'
starting Oracle instance without parameter file for retrieval of spfile
Oracle instance started
Total System Global Area 159019008 bytes
Fixed Size 1335192 bytes
Variable Size 75497576 bytes
Database Buffers 79691776 bytes
Redo Buffers 2494464 bytes
RMAN> quit
Recovery Manager complete.
[Oracle@localhost ~]$ rman target /
Recovery Manager: Release 11.2.0.1.0 - Production on Fri Sep 27 20:16:56 2013
Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved.
connected to target database: DUMMY (not mounted)
RMAN>
可以看到这里没有参数文件,rman启动连接到了DUMMY实例。(在AIX平台上会报错,不会自动连接到DUMMY实例)
à*如果没能自行连接到DUMMY实例,可以按照如下方式恢复参数文件。
1).如果整个数据库环境没有其他实例,则先不设置ORACLE_SID启动空实例。
export ORACLE_SID= --或者直接不写
rman target /
startup nomount; --将启动dummy实例到nomount
2). 如果环境中有其他实例,则先连接到其他实例的rman。
export ORACLE_SID=cospndb;
rman target /
à连接到可用的rman后,恢复spfile和pfile
SPFILE
RMAN> restore spfile from ‘传输过来的参数文件备份片路径和文件名’;
PFILE
RMAN> restore spfile to pfile ‘目标pfile的存储路径和文件名’ from ‘传输过来的参数文件备份片路径和文件名’;
*建议先恢复参数文件PFILE,因为要做出修改,等一切都修改完成后,再由PFILE创建SPFILE。
SQL> create spfile from pfile;
2. 修改参数文件中,对应的目录信息,并根据参数文件信息,创建系统中没有的目录,注意目录权限(oracle)。
3. 有了修改好的参数文件,我们可以将rman退出DUMMY实例或者别的实例,启动链接到欲恢复的实例。
export ORACLE_SID=ors;
rman target / --将连接到此实例
à利用参数文件打开实例到nomount模式。
RMAN> startup force nomount pfile=‘上一个步骤恢复回来并修改的参数文件路径和文件名’;
重要:根据修改好的pfile创建新的spfile。 RMAN> create spfile from pfile;
原因:下次重启oracle的时候,oracle优先用spfile打开数据库,如果spfile还是旧的话,那么就会报错,打不开数据库。
4. 恢复控制文件
RMAN> restore contorlfile from ‘传输过来的控制文件备份片路径和文件名’; --恢复控制文件到参数文件指定目录
5. 由控制文件,将数据库打开到mount模式。
RMAN> alter database mount;
6. 恢复数据库数据文件。
根据实际环境设置新的数据文件恢复目录,这里要使用我们之前准备的source数据库文件结构信息。
RMAN> run {
set newname for datafile 1 to "/u01/oradata/system01.dbf";
set newname for datafile 2 to "/u01/oradata/sysaux01.dbf";
set newname for datafile 3 to "/u01/oradata/undotbs01.dbf";
set newname for datafile 4 to "/u01/oradata/users01.dbf";
restore database;
switch datafile all;
}
对switch datafile all的说明:
-------------------------------------------------------------------
对于nocatalog 模式下,rman备份的信息是保存在控制文件里的,包括文件的路径信息。 这里的switch datafile all的作用,就是更新控制文
件里的信息。
-------------------------------------------------------------------
7. 数据库介质恢复
SQL> recover database using backup controlfile until cancel;
--指定归档日志目录
--cancel
完成介质恢复
注意:完成介质恢复后就可以打开数据库了alter database open resetlogs;
需要说明的就是:在open resetlogs 之后,自动在原来默认的路径创建了temp 表空间和online redo 日志文件。
为了方便起见,我建议先在controlfile中进行这些目录的更改。
8. 更改temp表空间目录
SQL> alter database rename file '/u01/app/oracle/oradata/august/august/temp01.dbf' to '/u01/oradata/temp01.dbf';
Database altered.
9. online redo log的处理
方案1: 在alter database open resetlogs之前更改contorlfile中的路径情况。
SQL> alter database rename file '/dir_old/redo01.log' ,'/dir_old/redo02.log','/dir_old/orcl/redo03.log' to '/dir_new/redo01.rdo','/dir_new/redo02.rdo','/dir_new/redo03.rdo' ;
----修改完临时文件和在线redo日志文件后,就可以打开数据库了。< SQL> alter database open resetlogs; >
方案2:采用DAVE的,打开数据库后再修改。
SQL> alter database open resetlog;
SQL> select group#,bytes/1024/1024||'M',status from v$log;
GROUP# BYTES/1024/1024||'M' STATUS
---------- ----------------------------------------- ----------------
1 50M INACTIVE
2 50M CURRENT
3 50M UNUSED
SQL> select group#,member from v$logfile;
GROUP# MEMBER
---------- ---------------------------------------------------------------------
3 /u01/app/oracle/oradata/dave/redo03.log
2 /u01/app/oracle/oradata/dave/redo02.log
1 /u01/app/oracle/oradata/dave/redo01.log
oracle 至少有2组redo log。 所以我们可以将已经完成归档的redo drop掉, 重新创建。
SQL> alter database drop logfile group 3;
Database altered.
SQL> alter database add logfile group 3 ('/u01/oradata/redo03.log') size 50m;
Database altered.
SQL> alter system switch logfile;
System altered.
SQL> select group#,bytes/1024/1024||'M',status from v$log;
GROUP# BYTES/1024/1024||'M' STATUS
---------- ----------------------------------------- ----------------
1 50M INACTIVE
2 50M ACTIVE
3 50M CURRENT
SQL> alter database drop logfile group 1;
Database altered.
SQL> alter database add logfile group 1 ('/u01/oradata/redo01.log') size 50m;
Database altered.
SQL> alter system switch logfile;
System altered.
SQL> alter database drop logfile group 2;
Database altered.
SQL> alter database add logfile group 2 ('/u01/oradata/redo02.log') size 50m;
Database altered.
SQL> select group#,member from v$logfile;
GROUP# MEMBER
---------- ---------------------------------------------------------------------
3 /u01/oradata/redo03.log
2 /u01/oradata/redo02.log
1 /u01/oradata/redo01.log
(2)处理temp 临时表空间
SQL> select name from v$tempfile;
NAME
--------------------------------------------------------------------------------
/u01/app/oracle/oradata/dave/temp01.dbf
--表空间offline
SQL> alter database tempfile '/u01/app/oracle/oradata/dave/temp01.dbf' offline;
Database altered.
--在OS 级别移动temp 的数据文件
SQL> !mv /u01/app/oracle/oradata/dave/temp01.dbf /u01/oradata/temp01.dbf
--修改控制文件中temp文件的信息
SQL> alter database rename file '/u01/app/oracle/oradata/dave/temp01.dbf' to '/u01/oradata/temp01.dbf';
Database altered.
--temp 表空间online
SQL> alter database tempfile '/u01/oradata/temp01.dbf' online;
Database altered.
--验证
SQL> select name from v$tempfile;
NAME
--------------------------------------------------------------------------------
/u01/oradata/temp01.dbf
--------------------------------------------
异常问题解答
--------------------------------------------
1. 如果没有更改online redo log目录的情况下打开了数据库,但是数据库在新环境中有没有这个目录,导致不能创建online redo log,oracle将当做日志损坏处理,导致数据库无法打开。
解决办法:
修改controlfile中的online redo log路径。
SQL> alter database rename file '/dir_old/redo01.log' ,'/dir_old/redo02.log','/dir_old/orcl/redo03.log' to '/dir_new/redo01.rdo','/dir_new/redo02.rdo','/dir_new/redo03.rdo' ;
重建在线日志,对于不是current redo的日志文件,用clear命令清除。
SQL> alter database clear logfile group m;
SQL> alter database clear logfile group n;
如果是当前current redo日志组文件,由于我们是恢复的数据库,很显然当前日志组并没有未决的事务信息,使用命令
SQL> alter database clear unarchived logfile group x;
来重建。
接着就可以打开数据库
alter database open resetlogs;
2. AIX磁盘不足,扩容。
使用命令 # chfs -a size=+78G /oracle/BWP/oraarch
意思是给/oracle/BWP/oraarch增加78G的空间(注意G是大写)
3. 如果在没有更改temp file目录的情况下打开了数据库(alter database open resetlogs),但是在旧的目录上又没能成功创建temp file。
此时,更改database到mount下。修改controlfile中的tempfile信息。
SQL> alter database rename file '/orasvr/oradata/rsdp/dat/ors/temp01.dbf' to '/orasvr/oradata/cmb/dat/ors/temp01.dbf';
然后重新打开数据库即可。
这里应用的oracle 10g后的新特性,tempfile会自动重建。
4. 如果ORACLE运行中报错ORA-25153:Temporary tablespace is empty.
解决办法就是:添加tempfile,原有的tempfile可能损坏或丢失,在dba_temp_file中查不到此tempfile,但是对应路径我们又能看到此文件,我们可以简单的重新添加。
SQL> alter tablespace temp add tempfile 'D:APPHUJIEORADATAAUGUSTTEMP01.DBF';