ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 一次用rman做数据迁移的实战经历

一次用rman做数据迁移的实战经历

Linux操作系统 作者:Mr_Man 时间:2016-05-03 13:26:00 0 删除 编辑
今天接到一个任务:用户要求把生产库的数据刷新到开发库,因为数据量较大(1T),如果采用常用的export/import方法,时间会很久,又因为生产库和开发库环境一模一样,因此我决定用rman备份恢复的方式进行数据刷新。生产库名为O02RCD3,开发库名为O03RCD0,生产库和开发库都是两节点的RAC,操作系统都为Solaris Spac。

参考文档 (HowTo Restore RMAN Disk backups of RAC Database to Single Instance On Another Node [ID 415579.1]),主要步骤如下:

1.用rman备份生产库:
run{
CONFIGURE CONTROLFILE AUTOBACKUP ON;
CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '/drcd04/rcd/o02rcd3dump/DONT_TOUCH/rman/cf_O02RCD3_%F';
CONFIGURE DEVICE TYPE DISK BACKUP TYPE TO COMPRESSED BACKUPSET PARALLELISM 20;
backup database format '/drcd04/rcd/o02rcd3dump/DONT_TOUCH/rman/O02RCD3_%U.bak';
}
因为生产库是运行在归档模式下,所以我们可以采用热备,不需要停机时间。我们需要备份的有:数据文件、控制文件。

2.备份开发库,以防万一数据迁移失败,开发库可恢复原样:
因为开发库不是运行在归档模式下,我们必须得用冷备的方式备份数据库。
关闭RAC的所有节点:
srvctl stop database -d O03RCD0 -o immediate
mount其中一个节点(O03RCD0A)
再用rman冷备数据库:
run{
CONFIGURE CONTROLFILE AUTOBACKUP ON;
 CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '/db_dumps/O03RCD0/DONT_TOUCH/rman/cf_O03RCD0_%F';
 CONFIGURE DEVICE TYPE DISK BACKUP TYPE TO COMPRESSED BACKUPSET PARALLELISM 10;
 backup database format '/db_dumps/O03RCD0/DONT_TOUCH/rman/O03RCD0_%U.bak';
}
上面只备份了数据文件和控制文件,因此我们还要拷贝参数文件和密码文件。

3.为开发库创建新的pfile
因为新的开发库是从生产库的备份集里恢复过来的,所以开发库原来的参数文件无法使用,我们可以参考开发库的参数文件为生产库临时创建一个新的参数。
首先利用生产库的spfile创建pfile:
SYS@O02RCD3>create pfile='/drcd04/rcd/o02rcd3dump/DONT_TOUCH/rman/initO02RCD3.ora' from spfile;
把该pfile拷贝至开发库的主机上,并做如下修改:
1) 修改包含具体路径的参数:audit_file_dest, background_dump_dest, control_files, core_dump_dest,log_archive_dest_1, user_dump_dest等。
2) 删除和RAC相关的参数:cluster_database_instances, cluster_database等
3) 修改和内存相关的参数:sga_max_size,sga_target,pga_aggregate_target等

4.在开发库上删除RAC数据库
参考文档:How To Drop A RAC Database Using RMAN [ID 732042.1]
1) 关闭所有节点
2) 修改参数cluster_database=false
3) 以mount restrict方式启动其中某一节点:startup mount exclusive restrict pfile='/db_dumps/O03RCD0/DONT_TOUCH/initO03RCD0.ora_old'
4) 用rman删除RAC数据库:RMAN> drop database  --注意,这里千万不要加including backups,否则第2步的备份也会一起被删除!
   
5. 恢复控制文件
首先把第1步产生的生产库备份集传到开发库的主机上。
接着在开发库中使用新的pfile启动至nomount状态:
1) 设置ORACLE_SID为生产库的数据库名:
    setenv ORACLE_SID O02RCD3A
2) 以新的pfile启动数据库:
    sqlplus "/as sysdba"
    startup nomount pfile='/db_dumps/O03RCD0/DONT_TOUCH/initO03RCD0.ora_new'
然后,恢复控制文件:
RMAN> restore controlfile from '/db_dumps/O02RCD3/DONT_TOUCH/rman/cf_O02RCD3_c-2567883139-20111125-00';
Starting restore at 28-NOV-11
using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: sid=1463 devtype=DISK

channel ORA_DISK_1: restoring control file
channel ORA_DISK_1: restore complete, elapsed time: 00:00:35
output filename=/drcdd2/rcd/o03rcd0suprt1/control01.O03RCD0
output filename=/drcdd2/rcd/o03rcd0data1/control02.O03RCD0
output filename=/drcdd2/rcd/o03rcd0ndx1/control03.O03RCD0
Finished restore at 28-NOV-11

恢复的控制文件的位置由参数pfile里control_files指定。

有了控制文件之后,我们就可以mount数据库:
RMAN> alter database mount;

6.恢复数据文件
首先,让新恢复的控制文件可以找到备份集:
RMAN> catalog start with '/db_dumps/O02RCD3/DONT_TOUCH/rman';
更新控制文件里的备份集信息:
RMAN> crosscheck backup;
因为数据文件恢复之后的路径和备份集里记录的路径不一样,因此在做restore之前,要先用set newname for datafile # to '新路径‘ 语句设置数据文件恢复后的新路径。
run
{
configure device type disk parallelism 12;
set newname for datafile  1 to '/drcdd2/rcd/o03rcd0suprt1/system01.O03RCD0'      ;                                  
set newname for datafile  2 to '/drcdd2/rcd/o03rcd0rbs/undotbs01.O03RCD0'        ;                              
..............................................
restore database;
switch datafile all;
}   
restore成功之后,用以下语句确认一下是否控制文件中记录的数据文件的位置是正确的:
select name from v$datafile

在做recover之前,我们得找到能应用到的最新的归档日志是哪个。
首先,查看备份集里归档信息:
  Thrd Seq     Low SCN    Low Time  Next SCN   Next Time
  ---- ------- ---------- --------- ---------- ---------
  1    456891  10006743141075 03-DEC-11 10006743645190 03-DEC-11
  1    456892  10006743645190 03-DEC-11 10006744304286 04-DEC-11
  2    192242  10006743139569 03-DEC-11 10006744304293 04-DEC-11
在这个例子中,我们选取加黑两个归档日志中Next SCN较小的一个:
run {
set until sequence 456892 thread 1;
recover database;
}

7. 重命名联机日志文件
在控制文件中记录的联机日志文件依然指向生产库,在open数据库之前,我们必须使它们指向开发库。
当前控制文件记录的联机日志文件如下:
idel>select member from v$logfile;

MEMBER
------------------------------------------------------------------------------------------------------------------------
/drcdd4/rcd/o05rcd0redo1/redo01.O05RCD0
/drcdd4/rcd/o05rcd0redo2/redo01.O05RCD0
/drcdd4/rcd/o05rcd0redo1/redo02.O05RCD0
/drcdd4/rcd/o05rcd0redo2/redo02.O05RCD0
/drcdd4/rcd/o05rcd0redo1/redo03.O05RCD0
/drcdd4/rcd/o05rcd0redo2/redo03.O05RCD0
/drcdd4/rcd/o05rcd0redo1/redo04.O05RCD0
/drcdd4/rcd/o05rcd0redo2/redo04.O05RCD0
修改联机日志文件路径如下:
alter database rename file '/drcdd4/rcd/o05rcd0redo1/redo01.O05RCD0' to '/drcdd2/rcd/o03rcd0redo1/redo01.O03RCD0';
alter database rename file '/drcdd4/rcd/o05rcd0redo2/redo01.O05RCD0' to '/drcdd2/rcd/o03rcd0redo2/redo01.O03RCD0';
alter database rename file '/drcdd4/rcd/o05rcd0redo1/redo02.O05RCD0' to '/drcdd2/rcd/o03rcd0redo1/redo02.O03RCD0';
alter database rename file '/drcdd4/rcd/o05rcd0redo2/redo02.O05RCD0' to '/drcdd2/rcd/o03rcd0redo2/redo02.O03RCD0';
alter database rename file '/drcdd4/rcd/o05rcd0redo1/redo03.O05RCD0' to '/drcdd2/rcd/o03rcd0redo1/redo03.O03RCD0';
alter database rename file '/drcdd4/rcd/o05rcd0redo2/redo03.O05RCD0' to '/drcdd2/rcd/o03rcd0redo2/redo03.O03RCD0';
alter database rename file '/drcdd4/rcd/o05rcd0redo1/redo04.O05RCD0' to '/drcdd2/rcd/o03rcd0redo1/redo04.O03RCD0';
alter database rename file '/drcdd4/rcd/o05rcd0redo2/redo04.O05RCD0' to '/drcdd2/rcd/o03rcd0redo2/redo04.O03RCD0';

现在可以open数据库了:
alter database open resetlogs;

确保已经没有数据文件需要recover:
SYS@O05RCD0>select * from V$RECOVER_FILE; --该语句没有返回结果

8. 重建临时表空间
当前的临时表空间指向生产库:
SYS@O05RCD0>select FILE_NAME,TABLESPACE_NAME from dba_temp_files;

FILE_NAME                                                    TABLESPACE_NAME
------------------------------------------------------------ ------------------------------
/drcdd4/rcd/o05rcd0temp/temp01.O05RCD0                       TEMP

我们需要重建一个临时表空间,把默认临时表空间设为新的临时表空间,并把原临时表空间删除:
SYS@O05RCD0>create temporary tablespace TEMP1 tempfile '/drcdd2/rcd/o03rcd0temp/temp01.O03RCD0' size 2400M;
SYS@O05RCD0>alter database default temporary tablespace TEMP1;
SYS@O05RCD0>drop tablespace TEMP;

9. 使用NID修改dbname和dbid
参考:Changing DBNAME and DBID of RAC Database Using NID [ID 464922.1]
1) CLUSTER_DATABASE设为false (在之前已经做过)
2) 只启动其中一个instance为mount状态:
    关闭数据库之前修改sys用户的密码:
    alter user sys identified by oracle account unlock;
    shutdown immediate;
    startup mount pfile='/db_dumps/O03RCD0/DONT_TOUCH/initO03RCD0.ora_new'
3) 用nid根据修改数据库名:
    nid TARGET=SYS/oracle DBNAME=O03RCD0
4) 在参数文件中把db_name参数设为新的数据库名O03RCD0
5) 以resetlogs方式打开数据库:
    setenv ORACLE_SID O03RCD0A
    startup mount pfile='/db_dumps/O03RCD0/DONT_TOUCH/initO03RCD0.ora_new'
    alter database open resetlogs;

10. 改单节点数据库为RAC
我们之前一直采用的是修改后的生产库上的pfile启动数据库的,现在只要改为用原来开发库上的spfile启动数据库,就可以以RAC启动。
先关闭单节点数据库:
shutdown immediate
接着启动RAC(注意,此时使用的是原来开发库上的spfile)
在用srvctl启动数据库之前,最好分别在RAC的两个节点上单独启动,如果都可以启动,再执行下面命令:
srvctl start service -d O03RCD0
记得还要启动listener。
最后,远程连接数据库,验证:
A105024@O03RCD0>select instance_name from gv$instance;

INSTANCE_NAME
----------------
O03RCD0B
O03RCD0A









   

   

   


   















来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/31123655/viewspace-2092626/ ,如需转载,请注明出处,否则将追究法律责任。

下一篇: lftp详解
请登录后发表评论 登录
全部评论

注册时间:2016-04-09

  • 博文量
    82
  • 访问量
    280481