nocode 发表于 2011-12-23 03:00

RAC备份集恢复到单实例数据库(ASM环境)

<DIV>从RAC数据库恢复到单实例的数据库,需要DBA做的工作还是有一些的---我是指除了常规恢复操作之外。
<P>  设定环境如下: </P>
<P>  源端:192.168.10.11:12 </P>
<P>  目标端:192.168.10.101 ,机器名jssnode1 </P>
<P>  目标端已安装好数据库软件,并升级至与源端相同的版本,参数配置合理并且磁盘空间充足,源端创建的备份集也已复制至目标端。 </P>
<P>  别的就不废话了,接下来小跑进入实战演练部分吧,首先检查目标端设置环境变量: </P>
<DIV class=articleBlockGrey>
<UL>
<P>$ env | grep ORA </P>
<P>ORACLE_SID=jssdb </P>
<P>ORACLE_BASE=/data/ora10g </P>
<P>ORACLE_TERM=xterm </P>ORACLE_HOME=/data/ora10g/product/10.2.0/db_1 </UL></DIV>
<P>  进入RMAN命令行模式,并启动到NOMOUNT状态: </P>
<DIV class=articleBlockGrey>
<UL>
<P>$ rman target / </P>
<P>Recovery Manager: Release 10.2.0.4.0 - Production on Thu Feb 4 15:49:12 2010 </P>
<P>Copyright (c) 1982, 2007, Oracle. All rights reserved. </P>
<P>connected to target database (not started) </P>
<P>RMAN&gt; startup nomount </P>
<P>startup failed: ORA-01078: failure in processing system parameters </P>
<P>LRM-00109: could not open parameter file ¨/data/ora10g/product/10.2.0/db_1/dbs/initjssdb.ora¨ </P>
<P>starting Oracle instance without parameter file for retrival of spfile </P>
<P>Oracle instance started </P>
<P>Total System Global Area 159383552 bytes </P>
<P>Fixed Size 2082400 bytes </P>
<P>Variable Size 67111328 bytes </P>
<P>Database Buffers 83886080 bytes </P>Redo Buffers 6303744 bytes </UL></DIV>
<P>  脑袋里蹦出了个大问号:怎么没见创建初始化参数文件,也能启动到NOMOUNT呢?当然可以啦,具体参考"涂抹ORACLE--<A title=点击阅读三思笔记---诙谐幽默简单易读的ORACLE学习文章 href="http://www.5ienet.com/note" target=_blank>三思</A>笔记"中9.2.4.2小节中的相关内容。 </P>
<P>  启动过程中报错了,不管它,这里startup的目的只是为了给ORACLE分配相应的内存区,以便让他能够执行下面的restore操作。 </P>
<P>  从备份集中恢复spfile并保存成pfile,操作如下: </P>
<DIV class=articleBlockGrey>
<UL>
<P>RMAN&gt; restore spfile to pfile ¨/data1/pfile.ora¨ from ¨/data/backup/07l53d5s_1_1¨; </P>
<P>Starting restore at 04-FEB-10 </P>
<P>using target database control file instead of recovery catalog </P>
<P>allocated channel: ORA_DISK_1 </P>
<P>channel ORA_DISK_1: sid=36 devtype=DISK </P>
<P>channel ORA_DISK_1: autobackup found: /data/backup/07l53d5s_1_1 </P>
<P>channel ORA_DISK_1: SPFILE restore from autobackup complete </P>Finished restore at 04-FEB-10 </UL></DIV>
<P>  接下来要做的是个体力活,修改pfile.ora中的初始化参数,主要有两方面的修改: </P>
<UL>
<LI>修改含文件路径的参数,达到符合当前服务器环境的实际情况
<LI>修改多实例相关的参数 </LI></UL>
<P>  原文件内容如下: </P>
<DIV class=articleBlockGrey>
<UL>
<P>jssdbn1.__db_cache_size=104857600 </P>
<P>jssdbn2.__db_cache_size=100663296 </P>
<P>jssdbn1.__java_pool_size=4194304 </P>
<P>jssdbn2.__java_pool_size=4194304 </P>
<P>jssdbn1.__large_pool_size=4194304 </P>
<P>jssdbn2.__large_pool_size=4194304 </P>
<P>jssdbn1.__shared_pool_size=163577856 </P>
<P>jssdbn2.__shared_pool_size=167772160 </P>
<P>jssdbn1.__streams_pool_size=0 </P>
<P>jssdbn2.__streams_pool_size=0 </P>
<P>*.audit_file_dest=¨/data/ora10g/admin/jssdb/adump¨ </P>
<P>*.background_dump_dest=¨/data/ora10g/admin/jssdb/bdump¨ </P>
<P>*.cluster_database_instances=2 </P>
<P>*.cluster_database=true </P>
<P>*.compatible=¨10.2.0.1.0¨ </P>
<P>*.control_files=¨+ASMDISK1/jssdb/control01.ctl¨,¨+ASMDISK1/jssdb/control02.ctl¨,¨+ASMDISK1/jssdb/control03.ctl¨ </P>
<P>*.core_dump_dest=¨/data/ora10g/admin/jssdb/cdump¨ </P>
<P>*.db_block_size=8192 </P>
<P>*.db_create_file_dest=¨+ASMDISK1¨ </P>
<P>*.db_domain=¨¨ </P>
<P>*.db_file_multiblock_read_count=16 </P>
<P>*.db_name=¨jssdb¨ </P>
<P>jssdbn1.instance_number=1 </P>
<P>jssdbn2.instance_number=2 </P>
<P>*.job_queue_processes=10 </P>
<P>jssdbn1.log_archive_dest_1=¨location=/data/oradata/jssdbn1/archivelog¨ </P>
<P>jssdbn2.log_archive_dest_1=¨location=/data/oradata/jssdbn2/archivelog¨ </P>
<P>*.log_archive_dest_2=¨¨ </P>
<P>jssdbn1.log_archive_dest_2=¨service=jssdbn2¨ </P>
<P>jssdbn1.log_archive_local_first=FALSE </P>
<P>*.open_cursors=300 </P>
<P>*.pga_aggregate_target=94371840 </P>
<P>*.processes=150 </P>
<P>*.remote_listener=¨LISTENERS_JSSDB¨ </P>
<P>*.remote_login_passwordfile=¨exclusive¨ </P>
<P>*.sga_target=283115520 </P>
<P>jssdbn2.thread=2 </P>
<P>jssdbn1.thread=1 </P>
<P>*.undo_management=¨AUTO¨ </P>
<P>jssdbn1.undo_tablespace=¨UNDOTBS1¨ </P>
<P>jssdbn2.undo_tablespace=¨UNDOTBS2¨ </P>*.user_dump_dest=¨/data/ora10g/admin/jssdb/udump¨ </UL></DIV>
<P>  最终修改完之后,<A title=点击阅读三思笔记---诙谐幽默简单易读的ORACLE学习文章 href="http://www.5ienet.com/note" target=_blank>三思</A>这里的初始化参数如下,比如原来的文件精简不少: </P>
<DIV class=articleBlockGrey>
<UL>
<P>*.audit_file_dest=¨/data/ora10g/admin/jssdb/adump¨ </P>
<P>*.background_dump_dest=¨/data/ora10g/admin/jssdb/bdump¨ </P>
<P>*.compatible=¨10.2.0.1.0¨ </P>
<P>*.control_files=¨/data1/jssdb/control01.ctl¨,¨/data1/jssdb/control02.ctl¨,¨/data1/jssdb/control03.ctl¨ </P>
<P>*.core_dump_dest=¨/data/ora10g/admin/jssdb/cdump¨ </P>
<P>*.db_block_size=8192 </P>
<P>*.db_domain=¨¨ </P>
<P>*.db_file_multiblock_read_count=16 </P>
<P>*.db_name=¨jssdb¨ </P>
<P>*.job_queue_processes=10 </P>
<P>*.log_archive_dest_1=¨location=/data1/jssdb/archivelog¨ </P>
<P>*.open_cursors=300 </P>
<P>*.pga_aggregate_target=94371840 </P>
<P>*.processes=150 </P>
<P>*.remote_login_passwordfile=¨exclusive¨ </P>
<P>*.sga_target=283115520 </P>
<P>*.undo_management=¨AUTO¨ </P>
<P>*.undo_tablespace=¨UNDOTBS1¨ </P>*.user_dump_dest=¨/data/ora10g/admin/jssdb/udump¨ </UL></DIV>
<P>  然后进入sqlplus命令行环境,通过编辑好的pfile创建spfile,并重启oracle到nomount状态: </P>
<DIV class=articleBlockGrey>
<UL>
<P>SQL&gt; create spfile from pfile =¨/data1/pfile.ora¨; </P>
<P>File created. </P>
<P>SQL&gt; shutdown immediate </P>
<P>ORA-01507: database not mounted </P>
<P>ORACLE instance shut down. </P>
<P>SQL&gt; startup nomount </P>
<P>ORACLE instance started. </P>
<P>Total System Global Area 285212672 bytes </P>
<P>Fixed Size 2083368 bytes </P>
<P>Variable Size 88081880 bytes </P>
<P>Database Buffers 188743680 bytes </P>Redo Buffers 6303744 bytes </UL></DIV>
<P>  接下来要恢复控制文件了,再次进入RMAN命令行,注意操作前别忘了设置dbid(如何获取dbid就不说了吧),执行操作如下: </P>
<DIV class=articleBlockGrey>
<UL>
<P>RMAN&gt; set dbid=953576437 </P>
<P>executing command: SET DBID </P>
<P>RMAN&gt; restore controlfile from ¨/data/backup/07l53d5s_1_1¨; </P>
<P>Starting restore at 04-FEB-10 </P>
<P>using target database control file instead of recovery catalog </P>
<P>allocated channel: ORA_DISK_1 </P>
<P>channel ORA_DISK_1: sid=156 devtype=DISK </P>
<P>channel ORA_DISK_1: restoring control file </P>
<P>channel ORA_DISK_1: restore complete, elapsed time: 00:00:04 </P>
<P>output filename=/data1/jssdb/control01.ctl </P>
<P>output filename=/data1/jssdb/control02.ctl </P>
<P>output filename=/data1/jssdb/control03.ctl </P>Finished restore at 04-FEB-10 </UL></DIV>
<P>  控制文件成功恢复到指定路径下。 </P>
<P>  下面就可以进入到mount状态了: </P>
<DIV class=articleBlockGrey>
<UL>
<P>RMAN&gt; alter database mount; </P>
<P>database mounted </P>released channel: ORA_DISK_1 </UL></DIV>
<P>  注册表库备份后生成的归档文件备份集: </P>
<DIV class=articleBlockGrey>
<UL>
<P>RMAN&gt; catalog backuppiece ¨/data/backup/08l53d64_1_1¨; </P>
<P>cataloged backuppiece </P>backup piece handle=/data/backup/08l53d64_1_1 recid=7 stamp=710179350 </UL></DIV>
<P>  由于之前在RMAN中配置了默认通道,这里也要将这些配置清除,操作如下: </P>
<DIV class=articleBlockGrey>
<UL>
<P>RMAN&gt; configure channel 1 device type disk clear; </P>
<P>old RMAN configuration parameters: </P>
<P>CONFIGURE CHANNEL 1 DEVICE TYPE DISK CONNECT ¨*¨; </P>
<P>old RMAN configuration parameters are successfully deleted </P>
<P>RMAN&gt; configure channel 2 device type disk clear; </P>
<P>old RMAN configuration parameters: </P>
<P>CONFIGURE CHANNEL 2 DEVICE TYPE DISK CONNECT ¨*¨; </P>
<P>old RMAN configuration parameters are successfully deleted </P>
<P>RMAN&gt; configure device type disk clear; </P>
<P>old RMAN configuration parameters: </P>
<P>CONFIGURE DEVICE TYPE DISK PARALLELISM 2 BACKUP TYPE TO BACKUPSET; </P>RMAN configuration parameters are successfully reset to default value </UL></DIV>
<P>  接下来先别忙着做restore,有下列文件是需要我们预先进行处理的: </P>
<DIV class=articleBlockGrey>
<UL>
<P>SQL&gt; select file#,name from v$datafile; </P>
<P>FILE# NAME </P>
<P>---------- ------------------------------------------------------------ </P>
<P>1 +ASMDISK1/jssdb/datafile/system.260.703671683 </P>
<P>2 +ASMDISK1/jssdb/datafile/undotbs1.259.703671695 </P>
<P>3 +ASMDISK1/jssdb/datafile/sysaux.266.703671697 </P>
<P>4 +ASMDISK1/jssdb/datafile/undotbs2.258.703671705 </P>
<P>5 +ASMDISK1/jssdb/datafile/users.257.703671709 </P>
<P>6 +ASMDISK1/jssdb/datafile/jsstbs.269.703779631 </P>
<P>6 rows selected. </P>
<P>SQL&gt; select file#,name from v$tempfile; </P>
<P>FILE# NAME </P>
<P>---------- ------------------------------------------------------------ </P>
<P>1 +ASMDISK1/jssdb/tempfile/temp.265.703671701 </P>
<P>SQL&gt; select member from v$logfile; </P>
<P>MEMBER </P>
<P>------------------------------------------------------------ </P>
<P>+ASMDISK1/jssdb/onlinelog/group_1.263.703671679 </P>
<P>+ASMDISK1/jssdb/onlinelog/group_2.261.703671681 </P>
<P>+ASMDISK1/jssdb/onlinelog/group_3.256.703672257 </P>+ASMDISK1/jssdb/onlinelog/group_4.268.703672257 </UL></DIV>
<P>  RMAN 中的SET命令可以用来为数据文件和临时文件重命名,这里<A title=点击阅读三思笔记---诙谐幽默简单易读的ORACLE学习文章 href="http://www.5ienet.com/note" target=_blank>三思</A>就使用set命令对数据文件和临时文件的路径进行重定义,然后再执行恢复操作,如下: </P>
<DIV class=articleBlockGrey>
<UL>
<P>RMAN&gt; RUN { </P>
<P>2&gt; SET NEWNAME FOR DATAFILE 1 to ¨/data1/jssdb/system01.dbf¨; </P>
<P>3&gt; SET NEWNAME FOR DATAFILE 2 to ¨/data1/jssdb/undoa01.dbf¨; </P>
<P>4&gt; SET NEWNAME FOR DATAFILE 3 to ¨/data1/jssdb/sysaux01.dbf¨; </P>
<P>5&gt; SET NEWNAME FOR DATAFILE 4 to ¨/data1/jssdb/undob01.dbf¨; </P>
<P>6&gt; SET NEWNAME FOR DATAFILE 5 to ¨/data1/jssdb/users01.dbf¨; </P>
<P>7&gt; SET NEWNAME FOR DATAFILE 6 to ¨/data1/jssdb/jsstbs01.dbf¨; </P>
<P>8&gt; SET NEWNAME FOR TEMPFILE 1 to ¨/data1/jssdb/temp01.dbf¨; </P>
<P>9&gt; RESTORE DATABASE; </P>
<P>10&gt; SWITCH DATAFILE ALL; </P>
<P>11&gt; SWITCH TEMPFILE ALL; </P>
<P>12&gt; } </P>
<P>executing command: SET NEWNAME </P>
<P>executing command: SET NEWNAME </P>
<P>executing command: SET NEWNAME </P>
<P>executing command: SET NEWNAME </P>
<P>executing command: SET NEWNAME </P>
<P>executing command: SET NEWNAME </P>
<P>executing command: SET NEWNAME </P>
<P>Starting restore at 04-FEB-10 </P>
<P>allocated channel: ORA_DISK_1 </P>
<P>channel ORA_DISK_1: sid=159 devtype=DISK </P>
<P>channel ORA_DISK_1: starting datafile backupset restore </P>
<P>channel ORA_DISK_1: specifying datafile(s) to restore from backup set </P>
<P>restoring datafile 00001 to /data1/jssdb/system01.dbf </P>
<P>restoring datafile 00002 to /data1/jssdb/undoa01.dbf </P>
<P>restoring datafile 00003 to /data1/jssdb/sysaux01.dbf </P>
<P>restoring datafile 00004 to /data1/jssdb/undob01.dbf </P>
<P>restoring datafile 00005 to /data1/jssdb/users01.dbf </P>
<P>restoring datafile 00006 to /data1/jssdb/jsstbs01.dbf </P>
<P>channel ORA_DISK_1: reading from backup piece /data/backup/06l53d53_1_1 </P>
<P>channel ORA_DISK_1: restored backup piece 1 </P>
<P>piece handle=/data/backup/06l53d53_1_1 tag=TAG20100203T133531 </P>
<P>channel ORA_DISK_1: restore complete, elapsed time: 00:00:25 </P>
<P>Finished restore at 04-FEB-10 </P>
<P>datafile 1 switched to datafile copy </P>
<P>input datafile copy recid=7 stamp=710096833 filename=/data1/jssdb/system01.dbf </P>
<P>datafile 2 switched to datafile copy </P>
<P>input datafile copy recid=8 stamp=710096833 filename=/data1/jssdb/undoa01.dbf </P>
<P>datafile 3 switched to datafile copy </P>
<P>input datafile copy recid=9 stamp=710096833 filename=/data1/jssdb/sysaux01.dbf </P>
<P>datafile 4 switched to datafile copy </P>
<P>input datafile copy recid=10 stamp=710096833 filename=/data1/jssdb/undob01.dbf </P>
<P>datafile 5 switched to datafile copy </P>
<P>input datafile copy recid=11 stamp=710096833 filename=/data1/jssdb/users01.dbf </P>
<P>datafile 6 switched to datafile copy </P>
<P>input datafile copy recid=12 stamp=710096833 filename=/data1/jssdb/jsstbs01.dbf </P>renamed temporary file 1 to /data1/jssdb/temp01.dbf in control file </UL></DIV>
<P>  对数据库执行recover,由于我们只复制了备份集,而没有复制源库中新归档以及online redo文件,这里只能进行不完全的恢复(创建的备份并非一致性冷备份),也就是说,报错是必然的,不过没关系,只要能修复到一致性状态就好: </P>
<DIV class=articleBlockGrey>
<UL>
<P>RMAN&gt; recover database; </P>
<P>Starting recover at 04-FEB-10 </P>
<P>using channel ORA_DISK_1 </P>
<P>starting media recovery </P>
<P>unable to find archive log </P>
<P>archive log thread=2 sequence=98 </P>
<P>RMAN-00571: =========================================================== </P>
<P>RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS =============== </P>
<P>RMAN-00571: =========================================================== </P>
<P>RMAN-03002: failure of recover command at 02/04/2010 17:24:11 </P>RMAN-06054: media recovery requesting unknown log: thread 2 seq 98 lowscn 15874447 </UL></DIV>
<P>  接下来,我们不得不重建控制文件,以修复重做日志文件的路径: </P>
<DIV class=articleBlockGrey>
<UL>
<P>SQL&gt; alter database backup controlfile to trace; </P>Database altered. </UL></DIV>
<P>  你也许在想,可以通过"alter database rename file"方式修改重做日志文件路径的啊,事实上"alter database rename file"方式极有可能触发" ORA-00600: internal error code, arguments: , [], [], [], [], [], [], [] " 错误,经查这是ORACLE的一个BUG,对应BUG为7207932,通常是RAC环境从asm向文件系统迁移时被触发,在10204版本中依然存在,Doc ID: 742289.1对此有详细说明,号称11g版本中对该问题进行了修复。 </P>
<P>  获取控制文件创建脚本之后,稍加修改(主要是改redolog的路径),然后在sqlplus命令行环境下执行: </P>
<DIV class=articleBlockGrey>
<UL>
<P>SQL&gt; shutdown immediate </P>
<P>ORA-01109: database not open </P>
<P>Database dismounted. </P>
<P>ORACLE instance shut down. </P>
<P>SQL&gt; startup nomount </P>
<P>ORACLE instance started. </P>
<P>Total System Global Area 285212672 bytes </P>
<P>Fixed Size 2083368 bytes </P>
<P>Variable Size 92276184 bytes </P>
<P>Database Buffers 184549376 bytes </P>
<P>Redo Buffers 6303744 bytes </P>
<P>SQL&gt; CREATE CONTROLFILE REUSE DATABASE "JSSDB" RESETLOGS ARCHIVELOG </P>
<P>2 MAXLOGFILES 192 </P>
<P>3 MAXLOGMEMBERS 3 </P>
<P>4 MAXDATAFILES 1024 </P>
<P>5 MAXINSTANCES 32 </P>
<P>6 MAXLOGHISTORY 292 </P>
<P>7 LOGFILE </P>
<P>8 GROUP 1 ¨/data1/jssdb/redo01.dbf¨ SIZE 50M, </P>
<P>9 GROUP 2 ¨/data1/jssdb/redo02.dbf¨ SIZE 50M </P>
<P>10 -- STANDBY LOGFILE </P>
<P>11 DATAFILE </P>
<P>12 ¨/data1/jssdb/system01.dbf¨, </P>
<P>13 ¨/data1/jssdb/undoa01.dbf¨, </P>
<P>14 ¨/data1/jssdb/sysaux01.dbf¨, </P>
<P>15 ¨/data1/jssdb/undob01.dbf¨, </P>
<P>16 ¨/data1/jssdb/users01.dbf¨, </P>
<P>17 ¨/data1/jssdb/jsstbs01.dbf¨ </P>
<P>18 CHARACTER SET ZHS16GBK </P>
<P>19 ; </P>
<P>Control file created. </P>
<P>SQL&gt; ALTER DATABASE ADD LOGFILE THREAD 2 </P>
<P>2 GROUP 3 ¨/data1/jssdb/redo03.dbf¨ SIZE 50M, </P>
<P>3 GROUP 4 ¨/data1/jssdb/redo04.dbf¨ SIZE 50M; </P>Database altered. </UL></DIV>
<P>  搞定,下面就可以打开数据库了: </P>
<DIV class=articleBlockGrey>
<UL>
<P>SQL&gt; alter database open resetlogs; </P>Database altered. </UL></DIV>
<P>  接下来别忘了重建临时表空间的数据文件: </P>
<DIV class=articleBlockGrey>
<UL>
<P>SQL&gt; ALTER TABLESPACE TEMP ADD TEMPFILE ¨/data1/jssdb/temp01.dbf¨ size 50m; </P>Tablespace altered. </UL></DIV>
<P>  哎,做到这步,都还没有完啊,只是说目的基本达成,最后还需要收尾的工作。 </P>
<P>  清除未使用线程的redo日志组,操作如下: </P>
<DIV class=articleBlockGrey>
<UL>
<P>SQL&gt; select thread#,status,enabled from v$thread; </P>
<P>THREAD# STATUS ENABLED </P>
<P>---------- ------ -------- </P>
<P>1 OPEN PUBLIC </P>
<P>2 CLOSED PRIVATE </P>
<P>SQL&gt; select group#,thread#,archived,status from v$log; </P>
<P>GROUP# THREAD# ARC STATUS </P>
<P>---------- ---------- --- ---------------- </P>
<P>1 1 YES INACTIVE </P>
<P>2 1 NO CURRENT </P>
<P>3 2 YES INACTIVE </P>
<P>4 2 NO CURRENT </P>
<P>SQL&gt; alter database disable thread 2; </P>
<P>Database altered. </P>
<P>SQL&gt; alter database drop logfile group 3; </P>
<P>Database altered. </P>
<P>SQL&gt; alter database clear unarchived logfile group 4; </P>
<P>Database altered. </P>
<P>SQL&gt; alter database drop logfile group 4; </P>Database altered. </UL></DIV>
<P>  清除多余的undo文件。 </P>
<DIV class=articleBlockGrey>
<UL>
<P>SQL&gt; select name from v$tablespace where name like ¨UNDO%¨; </P>
<P>NAME </P>
<P>------------------------------ </P>
<P>UNDOTBS1 </P>
<P>UNDOTBS2 </P>
<P>SQL&gt; show parameter undo_tablespace; </P>
<P>NAME TYPE VALUE </P>
<P>------------------------------------ ----------- ------------------------------ </P>
<P>undo_tablespace string UNDOTBS1 </P>
<P>SQL&gt; drop tablespace undotbs2 including contents and datafiles; </P>Tablespace dropped. </UL>
<UL>竣工! </UL></DIV></DIV>
页: [1]
查看完整版本: RAC备份集恢复到单实例数据库(ASM环境)