💫《博主介绍》:✨又是一天没白过,我是奈斯,DBA一名✨
💫《擅长领域》:✌️擅长Oracle、MySQL、SQLserver、阿里云AnalyticDB for MySQL(分布式数据仓库)、Linux,也在扩展大数据方向的知识面✌️
💖💖💖大佬们都喜欢静静的看文章,并且也会默默的点赞收藏加关注💖💖💖
话接上篇,上篇详解介绍了 如何使用RMAN从RAC环境的备份片中恢复数据到单机环境。然而,在实际操作中,我们也可能会遇到从 单机环境备份的数据恢复到RAC环境的需求 。这种恢复过程相较于前者可能更为复杂,因为它需要考虑到RAC环境的多个节点和共享存储等特性。
在企业的数据库运维过程中,备份和恢复是密不可分的两个环节。备份提供了数据安全的保障,而恢复则是确保在数据丢失或系统崩溃时能够迅速恢复业务运行的关键。特别是在单机环境到RAC环境的迁移过程中,恢复流程的正确性和高效性更是至关重要。
本文将详细介绍 如何使用RMAN从单机环境的备份片中恢复数据到RAC环境。我们将从恢复前的准备工作讲起,涵盖恢复步骤的每一个环节,包括恢复控制文件、数据文件、参数文件、归档等关键组件。同时,我们还将讨论在恢复过程中可能遇到的问题和解决方案,以确保整个恢复过程的顺利进行。
然而,RMAN所涉及的内容之广、之深,使得难以在单篇文章中全面涵盖。所以我将理论、命令、备份策略、异机恢复、坏块处理等分成八篇文章去讲,即使分为八篇也有不少内容没有涵盖到,所以这八篇文章都是精华,看完这八篇就可以解决95%以上的RMAN相关工作内容了。八篇文章的内容分别如下:
- 第一篇:rman物理备份工具的基础理论概述
- 第二篇:rman工具实用指南:常用命令详解与实践
- 第三篇:rman标准化全库备份策略:完整备份or增量备份
- 第四篇:rman全库异机恢复:从RAC环境到单机测试环境的转移
- 第五篇:rman全库异机恢复:从单机环境到RAC测试环境的转移(当前篇)
- 第六篇:rman时间点异机恢复:从单机环境到单机测试环境的转移
- 第七篇:Oracle数据库物理坏块处理:rman修复坏块实践与案例分析
- 第八篇:逻辑备份工具expdp(exp)/impdp(imp)和物理备份工具rman的区别和各自的使用场景总汇
恢复所使用的rman备份片:
在之前文章中, 我们都知道了rman有完整备份or增量备份,所以通过那种备份都可以实现全库的异机恢复 ,但是我的建议使用rman完整备份+归档备份即可 ,而不建议使用rman基本增量备份+rman差异增量备份+归档备份(为什么使用完整备份可以参考上篇文章的原因哦,我有详细介绍,直通车👉【Oracle篇】rman标准化全库备份策略:完整备份or增量备份(第三篇,总共八篇)_rman 全量备份-CSDN博客👈),所以这篇文章所使用的rman备份片为rman完整备份+归档备份。
兄弟们开始今天的内容!
FS源机:
一、对在FS上的实例进行全库备份。包括数据文件、控制文件、参数文件、归档。备份策略参考👉【Oracle篇】rman标准化全库备份策略:完整备份or增量备份(第三篇,总共八篇)_rman 全量备份-CSDN博客👈
二、通过nfs或者scp到目标RAC数据库。源库和异机的备份片的路径要一致,不然报找不到备份片。如果路径不一致可以通过catalog将未识别的RMAN备份集注册到控制文件:
scp拷贝到RAC异机的/backup/full目录下:
RAC异机:
一、通过手动注册rac实例的方式进行恢复,需要注册实例集群等。单机的db_name和rac的db_name要一致不然后面还要注册实例集群(db_unique_name、service_names、instance_name不会涉及在控制文件里,但db_name会涉及到控制文件和数据文件头部中。如果通过参数文件改完之后导致库启动不了ORA-01103: database name 'ORCL' in control file is not 'ORCLDG',如果参数文件改了控制文件也重置,那么在效验数据文件时文件的头部也是不能通过的,也会报ORA-01161: Database name ORCL in the file header does not match ORCLDG in the DATABASE clause)。所以db_name进行异机迁移,不管迁移到FS还是迁移到rac环境,db_name是不能变的。想要变动db_name就只能通过expdp这种逻辑迁移等。
Rac oracle用户节点一:
[oracle@rac1 dbs]$ cd $ORACLE_HOME/dbs [oracle@rac1 dbs]$ orapwd file=orapwliufei1 password=123456 [oracle@rac1 dbs]$ vi initliufei1.ora ---实例默认参数文件的保存路径为$ORACLE_HOME/dbs,init+SID_node.ora文件记录了以ASM方式启动参数文件的路径(ASM数据库启动时找不到spfileliufeidg1.ora,找到initliufeidg1.ora里的路径来通过asm管理的参数文件来启动) SPFILE='+DATA/liufei/spfileliufei.ora'
Rac oracle用户节点二:
[oracle@rac2 dbs]$ cd $ORACLE_HOME/dbs [oracle@rac2 dbs]$ orapwd file=orapwliufei2 password=123456 [oracle@rac2 dbs]$ vi initliufei2.ora ---实例默认参数文件的保存路径为$ORACLE_HOME/dbs,init+SID_node.ora文件记录了以ASM方式启动参数文件的路径(ASM数据库启动时找不到spfileliufeidg2.ora,找到initliufeidg2.ora里的路径来通过asm管理的参数文件来启动) SPFILE='+DATA/liufei/spfileliufei.ora'
节点二:
无须任何操作
节点一:迁移完成前的所有操作都在一个节点操作
(1)定义一个空实例的SID名,启动到nomount状态
注意:db_unique_name、service_names、instance_name不会涉及在控制文件里,但db_name会涉及到控制文件和数据文件头部中。所以db_name进行异机迁移,不管迁移到FS还是迁移到rac环境,db_name是不能变的。想要变动db_name就只能通过expdp这种逻辑迁移等。
[oracle@rac1 dbs]$ vi /oracle/app/oracle/product/11.2.0/db_1/dbs/liufei1.ora *.db_name='liufei' *.instance_name='liufei1' [oracle@11g ~]$ export ORACLE_SID=liufei1 SQL> startup pfile='/oracle/app/oracle/product/11.2.0/db_1/dbs/liufei1.ora' nomount
(2)还原参数文件
[oracle@rac1 ~]$ rman target / run { ALLOCATE CHANNEL ch00 TYPE disk; restore spfile to '/oracle/app/oracle/product/11.2.0/db_1/dbs/spfileliufei.ora' from '/backup/full/orcl_spfile_1684_1_20240123'; release channel ch00; } [grid@rac1~]$ asmcmd ASMCMD> cd +data ASMCMD> mkdir liufei [oracle@rac1 dbs]$ export ORACLE_SID=liufei1 [oracle@rac1 dbs]$ sqlplus / as sysdba
将rman恢复的spfile文件转换成可vi编辑的pfile文件: SQL> create pfile='/oracle/app/oracle/product/11.2.0/db_1/dbs/pfileliufei.ora' from spfile='/oracle/app/oracle/product/11.2.0/db_1/dbs/spfileliufei.ora'; [oracle@dg dbs]$ vi /oracle/app/oracle/product/11.2.0/db_1/dbs/pfileliufei.ora 标准的rac集群参数文件 liufei2.__db_cache_size=402653184 liufei1.__db_cache_size=301989888 liufei1.__java_pool_size=16777216 liufei2.__java_pool_size=16777216 liufei1.__large_pool_size=33554432 liufei2.__large_pool_size=33554432 liufei1.__pga_aggregate_target=452984832 liufei2.__pga_aggregate_target=486539264 liufei1.__sga_target=738197504 liufei2.__sga_target=704643072 liufei1.__shared_io_pool_size=0 liufei2.__shared_io_pool_size=0 liufei2.__shared_pool_size=234881024 liufei1.__shared_pool_size=369098752 liufei1.__streams_pool_size=0 liufei2.__streams_pool_size=0 *.audit_file_dest='/oracle/app/oracle/admin/orcl/adump' *.audit_trail='db' *.cluster_database=true *.compatible='11.2.0.4.0' *.control_files='+DATA/orcl/controlfile/current.269.1090195865' *.db_block_size=8192 *.db_create_file_dest='+DATA' *.db_domain='' *.db_name='liufei' *.diagnostic_dest='/oracle/app/oracle' *.dispatchers='(PROTOCOL=TCP) (SERVICE=orclXDB)' liufei1.instance_number=1 liufei2.instance_number=2 *.log_archive_dest_1='LOCATION=+DATA' *.log_archive_format='%t_%s_%r.dbf' *.memory_target=1189085184 *.open_cursors=300 *.processes=200 *.remote_listener='racscan:1521' *.remote_login_passwordfile='exclusive' *.sessions=225 liufei2.thread=2 liufei1.thread=1 liufei2.undo_tablespace='UNDOTBS2' liufei1.undo_tablespace='UNDOTBS1'
将vi编辑好的pfile文件转换成spfile文件在ASM磁盘中: SQL> create spfile='+DATA/liufei/spfileliufei.ora' from pfile='/oracle/app/oracle/product/11.2.0/db_1/dbs/pfileliufei.ora'; SQL> shutdown immediate SQL> startup nomount SQL> show parameter spfile
(3)还原控制文件
[oracle@rac1 ~]$ rman target / run { ALLOCATE CHANNEL ch00 TYPE disk; restore controlfile to '+data/liufei/controlfile/control.ctl' from '/backup/full/orcl_ctl_1683_1_20240123'; release channel ch00; } 查看asm路径是否有控制文件: [grid@rac1 ~]$ asmcmd ASMCMD> cd +data/liufei/controlfile ASMCMD> ls -l ---通过asm管理的文件会自动命名。设置自动命名的文件+DATA/liufei/CONTROLFILE/current.332.1090793947,和手动恢复的文件+data/liufei/controlfile/control.ctl都可以
修改控制文件的参数,启动至mount状态: SQL> show parameter control SQL> alter system set control_files='+DATA/liufei/CONTROLFILE/current.332.1090793947' scope=spfile; ---设置自动命名的文件+DATA/liufei/CONTROLFILE/current.332.1090793947,和手动恢复的文件+data/liufei/controlfile/control.ctl都可以 SQL> shutdown immediate SQL> startup mount SQL> show parameter control
(4)重命名redo日志组
注意:1)通过rman定义set newname for logfile设置路径失败,所以只能在sqlplus中重命名redo日志组。12c版本之后可能支持了在rman中定义set newname for logfile(待验证)
2)只进行重命名redo日志组操作,先不进行删除和重建redo日志组,如果同时进行重建redo日志组,就会导致在后续追归档日志阶段不能应用归档日志(执行recover database using backup controlfile until cancel;命令,报错ORA-01547: warning: RECOVER succeeded but OPEN RESETLOGS would get error below ORACLE)
3)先还原数据文件,然后再重命名redo日志组,可能会导致v$logfile里面日志组的路径全部直接成为了+ASM磁盘组没有具体路径的情况,比如:全部都成了+DATA这样,这样的话部分日志组因为当前在用删除不了,并且重命名redo日志组是需要具体路径的,但是都变成了+DATA就没有办法识别到是哪一个日志组。所以先进行redo日志组的重命名,然后再进行数据文件还原,就可以避免这个问题。
SQL> select * from v$logfile; ---重做日志组 SQL> select * from v$standby_log; ---镜像日志组(dg)
SQL> alter database rename file '/oracle/app/oracle/oradata/orcl/redo1.log' to '+data/liufei/onlinelog/redo1.log'; alter database rename file '/oracle/app/oracle/oradata/orcl/redo2.log' to '+data/liufei/onlinelog/redo2.log';
(5)还原数据文件
注意:rman备份记录在控制文件中,启动到mount状态时,就可以查到rman的备份信息。在恢复数据文件时,会自动找备份片的位置进行恢复,所以源库和异机的备份片的路径要一致,不然报找不到备份片。如果路径不一致可以通过catalog将未识别的RMAN备份集注册到控制文件。
RMAN> CATALOG START WITH '/backup/full'; ---注册目录(多用于批量注册归档,也可以用于注册备份片) RMAN> report schema; ---显示实例的信息。根据数据文件和临时文件ID恢复
RMAN> run { ALLOCATE CHANNEL ch00 TYPE disk; ALLOCATE CHANNEL ch01 TYPE disk; ###还原数据文件到新的路径 set newname for datafile 1 to '+data'; set newname for datafile 2 to '+data'; set newname for datafile 3 to '+data'; set newname for datafile 4 to '+data'; set newname for datafile 5 to '+data'; set newname for datafile 6 to '+data'; set newname for datafile 7 to '+data'; set newname for datafile 8 to '+data'; ###还原临时文件到新的路径 set newname for tempfile 2 to '+data'; ###自动全库恢复。restore database会导致所有文件覆盖还原所以谨慎,restore datafile是指定单个文件从rman中还原。 restore database; ###将已发出SET NEWNAME for DATAFILE命令的所有数据文件切换为其新名称。如果是asm管理的文件可能在设置路径时出现问题,导致控制文件的路径和物理路径不对应。所以建议源库为asm转文件系统时不设置这个参数,手动注册和通知控制文件路径catalog datafilecopy和switch datafile。 switch datafile all; release channel ch00; release channel ch01; }
(6)查看数据文件头部和控制文件头部还原的时间
SQL> select name from v$datafile; SQL> SELECT FILE#,to_char(checkpoint_change#,'999999999999') ,TO_CHAR(CHECKPOINT_TIME,'YYYY-MM-DD HH24:MI:SS') CPTIME FROM v$datafile_header; ---数据文件头部 SQL> SELECT FILE#,to_char(checkpoint_change#,'999999999999'),TO_CHAR(CHECKPOINT_TIME,'YYYY-MM-DD HH24:MI:SS') CPTIME FROM V$DATAFILE; ---控制文件头部
二、恢复数据
(1)还原归档
注意:先执行一遍recover database using backup controlfile until cancel;和v$datafile_header、V$DATAFILE就会输出当前恢复的SCN时间,然后根据时间再决定恢复几天的归档,或者也会显示从那个归档开始恢复,确定了开始恢复的归档号之后,就按照序列号恢复RESTORE ARCHIVELOG sequence,恢复到最新的序列号通过list backup查看最后一个备份的归档号。
RMAN> run{ ALLOCATE CHANNEL ch00 TYPE disk; set archivelog destination to '/backup/arch'; restore archivelog from time 'sysdate-10'; release channel ch00; } ---如果恢复报错no backup of archived log,根据序列号恢复RESTORE ARCHIVELOG sequence BETWEEN 5877 AND 5971 thread 2;
(2)追归档日志(使用备份的控制文件恢复时,控制文件会根据归档追scn,同时数据文件的scn也会恢复的最新)
SQL> set logsource /backup/arch; ---set logsource +路径:设置的是数据库读取归档的路径,默认的读取的路径是archive log list,如果通过rman恢复的是其他路径,那么就需要重新设置一下读取归档的路径。 SQL> recover database using backup controlfile until cancel; auto SQL> recover database using backup controlfile until cancel; Cancel SQL> SELECT FILE#,to_char(checkpoint_change#,'999999999999') ,TO_CHAR(CHECKPOINT_TIME,'YYYY-MM-DD HH24:MI:SS') CPTIME FROM v$datafile_header; ---数据文件头部 SQL> SELECT FILE#,to_char(checkpoint_change#,'999999999999'),TO_CHAR(CHECKPOINT_TIME,'YYYY-MM-DD HH24:MI:SS') CPTIME FROM V$DATAFILE; ---控制文件头部
(3)删除不必要的redo日志组
SQL> select * from v$logfile; ---重做日志组 SQL> select * from v$standby_log; ---镜像日志组(dg)
SQL> alter database drop logfile group 日志组序号;
(4)重建临时文件
SQL> shutdown immediate SQL> startup SQL> alter database open resetlogs; SQL> select * from v$tablespace; ---表空间中有temp表空间但是告警日志中显示需要重建信息的temp数据文件
temp临时文件的路径还是本地路径,所以新增一个ASM临时文件,然后删除临时文件为2的本地路径的临时文件: SQL> select * from v$tempfile;
SQL> alter tablespace temp add tempfile '+data' size 200m autoextend off; SQL> alter tablespace temp drop tempfile 2; 注意:如果删除临时文件失败,需要先删除临时表空间,然后重建。
(5)启用重做日志线程2(节点二使用)。因为原先是单机环境,恢复到了rac环境,所以每个实例都是独立的redo线程
SQL> select * from v$logfile; ---重做日志组 SQL> select * from v$standby_log; ---镜像日志组(dg) SQL> select * from v$log; ---rac环境下有多个线程的重做日志组,所以在单机环境下重做日志只保留线程1
SQL> alter database add logfile thread 2 group 3 '+data' size 200M; alter database add logfile thread 2 group 4 '+data' size 200M; SQL> alter database enable thread 2; ---添加完之后再应用日志线程2,不然节点二报: redo thread 2 is not enabled - cannot mount
(6)创建一个UNDOTBS2表空间给节点二使用(undo同redo一样是分线程的)
SQL> create undo tablespace UNDOTBS2 datafile '+data' size 5G autoextend on;
三、启动rac数据库
节点一:
[oracle@rac1 dbs]$ export ORACLE_SID=liufei1 SQL> shutdown immediate SQL> startup
节点二:
[oracle@rac2 dbs]$ export ORACLE_SID=liufei2 SQL> startup 在启动节点二时,节点一的告警日志会自动创建UNDOTBS2(已经手动创建UNDOTBS2),用于应用节点二。 在rac中,undo、redo是分线程的,temp是公用的
四、在oracle用户下注册rac实例
注意:1)不能在grid用户下,报:PRKH-1014 : Current user "grid" is not the oracle owner user "oracle" of oracle home "/oracle/app/oracle/product/11.2.0/db_1"
[oracle@rac1 dbs]$ srvctl add database -d liufei -c RAC -o /oracle/app/oracle/product/11.2.0/db_1 -p '+DATA/liufei/spfileliufei.ora' -r primary -n liufei [oracle@rac1 dbs]$ srvctl add instance -d liufei -i liufei1 -n rac1 [oracle@rac1 dbs]$ srvctl add instance -d liufei -i liufei2 -n rac2 [oracle@rac1 dbs]$ srvctl status database -d liufei
[oracle@rac1 dbs]$ srvctl stop database -d liufei ---一定要进行停止,因为在一个节点同步了数据实例到了mount状态,但srvctl status database -d看是没有启动的,因为在加集群之前启动的,加到了集群后也不会同步实例的状态,需要先停止然后启动 [oracle@rac1 dbs]$ srvctl start database -d liufei [oracle@rac1 dbs]$ srvctl stop database -d liufei [oracle@rac1 dbs]$ srvctl start database -d liufei [grid@rac1 dbs]$ crsctl status resource -t 只多了ora.liufei.db实例的节点一和节点二组件的监控,其他都是安装了集群组件grid和oracle软件就有的组件
[oracle@rac1 dbs]$ srvctl config database -d liufei -a Database unique name: liufei Database name: liufei Oracle home: /oracle/app/oracle/product/11.2.0/db_1 Oracle user: oracle Spfile: +DATA/liufei/spfileliufei.ora Domain: Start options: open Stop options: immediate Database role: PRIMARY Management policy: AUTOMATIC Server pools: liufei Database instances: liufei1,liufei2 Disk Groups: DATA Mount point paths: Services: Type: RAC Database is enabled Database is administrator managed
五、物理迁移完成查看状态
(1)通过rman恢复的实例是和生产环境一模一样的,所以只需要做后续参数部分的优化
参数优化参考RAC环境的配置即可😄
(2)各个节点执行检查实例情况
数据库文件和undo: set linesize 500 set pagesize 99 col file_name for a70 col file_id for 9999999 col status for a10 col ts_name for a25 col cur_mb for 99999 col max_mb for 99999 select status, file_id, file_name, tablespace_name ts_name,blocks/128 tolal_mb, maxblocks/128 max_mb,AUTOEXTENSIBLE from dba_data_files order by file_name; temp临时表空间: select username,temporary_tablespace from dba_users; set linesize 230 col file_name for a65 select FILE_ID,FILE_NAME,TABLESPACE_NAME,bytes/1024/1024 tolal_mb,status,AUTOEXTENSIBLE,MAXBYTES/1024/1024 max_mb from dba_temp_files; redo重做日志: set linesize 230 col member for a50 select * from v$logfile; select * from v$log; 查看数据库实例的状态和模式: select instance_name , status from v$instance ; select name, open_mode from v$database ; 查看监听: [grid@rac2 admin]$ lsnrctl status LISTENER_SCAN1
数据同步测试: 节点一: create tablespace liu11 datafile '+data' size 100m autoextend off; create user liufei identified by 123456 default tablespace liu11; grant dba to liufei; conn liufei/123456; create table liufei.itpux01(c1 varchar2(10),c2 number); insert into itpux01 values('itpux01','1'); commit; 节点二: select name from v$datafile; select * from liufei.itpux01;
关于《rman全库异机恢复:从单机环境到RAC测试环境的转移》就到这里了,淦了2小时,博主已经累到虚脱😩,感觉身体被掏空,不过下篇《rman时间点异机恢复:从单机环境到单机测试环境的转移》再见!