准备工作
原服务器软件部署:Redhat 6.6 + Oracle 12.2.0.1 rac
1、创建恢复服务器,设置大于原库数据大小的磁盘容量。设置相同的服务器主机名参照原服务器系统及软件版本和位数配置恢复的服务器,避免恢复过程中版本差异导致的问题;
2、将rman数据文件备份、归档日志备份复制到恢复服务器中( rman备份最好制定备份位置为NFS等共享存储上,还原时可以省去传递备份的时间);
3、创建相关的目录
例如,目标服务器安装ORACLE实例时,选择了“只安装实例”选项,那么在RMAN还原之前,我们必须创建下面一些目录(这些不是必须的,有些环境甚至完全不必要。具体根据实际情况判断):
- 创建$ORACLE_BASE/admin/$ORACLE_SID/下的六个目录;
- $ORACLE_BASE/oradata下创建$ORACLE_SID目录;
- RMAN备份路径目录(这个地方最好与源数据库一致,创建好后,把源数据库备份的数据文件复制到这个目录里);--非必须。
- 归档日志目录(同样,创建好后,把需要的归档日志文件复制到此目录) --非必须。
#mkdir -p /u01/app/oracle/admin/gnnt2/{adump,bdump,cdump,dpdump,pfile,udump} #mkdir -p /u01/app/oracle/oradata/$ORACLE_SID
注意:这些工作是前期准备工作,不能到RMAN还原恢复的时候才做。
服务器A备份数据库
rman备份脚本
原库数据较大,为了节约备份空间,采用增量备份。有关增量备份的概念转至我的博文https://www.cnblogs.com/-abm/p/9963917.html
计划任务
[oracle@swnode2 /]$ crontab -l
10 0 * * 0 /bin/sh /home/oracle/rmanbackup0.sh
10 0 * * 1 /bin/sh /home/oracle/rmanbackup1.sh
10 0 * * 2 /bin/sh /home/oracle/rmanbackup1.sh
10 0 * * 3 /bin/sh /home/oracle/rmanbackup2.sh
10 0 * * 4 /bin/sh /home/oracle/rmanbackup1.sh
10 0 * * 5 /bin/sh /home/oracle/rmanbackup1.sh
10 0 * * 6 /bin/sh /home/oracle/rmanbackup1.sh
说明: 每周日凌晨执行0级全量备份,
每周三凌晨执行一次累计增量备份,其他时间都为差异增量备份
0级备份
[oracle@swnode2 ~]$ cat rmanbackup0.sh
#!/bin/bash #Creation: 2018-11-27 #Version: 1.0.0 export ORACLE_SID=gnnt2 export ORACLE_BASE=/oracle/app/oracle export ORACLE_HOME=$ORACLE_BASE/product/12.2.0/db_1 export PATH=$ORACLE_HOME/bin:$PATH DATE=`date +%Y-%m-%d` LOG=/home/oracle/logs/log_rman_0_$DATA echo "=================================================================================" >>$LOG echo "Begin backup at : `date`" >> $LOG rman target / <<EOF >> $LOG run { allocate channel c1 device type disk; CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 8 DAYS; CONFIGURE CONTROLFILE AUTOBACKUP ON; CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '/DBback/%d.%F.conf'; backup as compressed backupset incremental level 0 database format '/DBback/0_%d_pdb_shwjs_%T_%s_%p.DBFILE'; crosscheck backup; sql 'alter system archive log current'; sql 'alter system archive log current'; sql 'alter system archive log current'; sql 'alter system archive log current'; backup as compressed backupset archivelog all not backed up format '/DBback/arch_bak/arch_%d_%T_%s_%p.ACR'; crosscheck archivelog all; report obsolete; delete noprompt expired backup; delete noprompt obsolete; DELETE NOPROMPT ARCHIVELOG ALL COMPLETED BEFORE 'SYSDATE-8'; delete noprompt backup of archivelog all completed before 'sysdate-8'; release channel c1; } exit EOF echo "End backup at : `date`" >>$LOG #echo "Begin scp at : `date`" >>$LOG #scp ${1}/*`date +%Y%m%d`* oracle@192.168.1.61:/tmp/ #echo "End scp at : `date`" >>$LOG echo "=================================================================================" >>$LOG exit 0
1级备份(差异增量)
[oracle@swnode2 ~]$ cat rmanbackup1.sh
#!/bin/bash #Creation: 2018-11-27 #Version: 1.0.0 export ORACLE_SID=gnnt2 export ORACLE_BASE=/oracle/app/oracle export ORACLE_HOME=$ORACLE_BASE/product/12.2.0/db_1 export PATH=$ORACLE_HOME/bin:$PATH DATE=`date +%Y-%m-%d` LOG=/home/oracle/logs/log_rman_1_$DATA echo "=================================================================================" >>$LOG echo "Begin backup at : `date`" >> $LOG rman target / <<EOF >> $LOG run { allocate channel c1 device type disk; CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 8 DAYS; CONFIGURE CONTROLFILE AUTOBACKUP ON; CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '/DBback/%d.%F.conf'; backup as compressed backupset incremental level 1 database format '/DBback/1_%d_pdb_shwjs_%T_%s_%p.DBFILE'; crosscheck backup; sql 'alter system archive log current'; sql 'alter system archive log current'; sql 'alter system archive log current'; sql 'alter system archive log current'; backup as compressed backupset archivelog all not backed up format '/DBback/arch_bak/arch_%d_%T_%s_%p.ACR'; crosscheck archivelog all; report obsolete; delete noprompt expired backup; delete noprompt obsolete; DELETE NOPROMPT ARCHIVELOG ALL COMPLETED BEFORE 'SYSDATE-8'; delete noprompt backup of archivelog all completed before 'sysdate-8'; release channel c1; } exit EOF echo "End backup at : `date`" >>$LOG #echo "Begin scp at : `date`" >>$LOG #scp ${1}/*`date +%Y%m%d`* oracle@192.168.1.61:/tmp/ #echo "End scp at : `date`" >>$LOG echo "=================================================================================" >>$LOG exit 0
2级备份(累计增量)
[oracle@swnode2 ~]$ cat rmanbackup2.sh
#!/bin/bash #Creation: 2018-11-27 #Version: 1.0.0 export ORACLE_SID=gnnt2 export ORACLE_BASE=/oracle/app/oracle export ORACLE_HOME=$ORACLE_BASE/product/12.2.0/db_1 export PATH=$ORACLE_HOME/bin:$PATH DATE=`date +%Y-%m-%d` LOG=/home/oracle/logs/log_rman_0_$DATA echo "=================================================================================" >>$LOG echo "Begin backup at : `date`" >> $LOG rman target / <<EOF >> $LOG run { allocate channel c1 device type disk; CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 8 DAYS; CONFIGURE CONTROLFILE AUTOBACKUP ON; CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '/DBback/%d.%F.conf'; backup as compressed backupset incremental level 1 cumulative database format '/DBback/2_%d_pdb_shwjs_%T_%s_%p.DBFILE'; crosscheck backup; sql 'alter system archive log current'; sql 'alter system archive log current'; sql 'alter system archive log current'; sql 'alter system archive log current'; backup as compressed backupset archivelog all not backed up format '/DBback/arch_bak/arch_%d_%T_%s_%p.ACR'; crosscheck archivelog all; report obsolete; delete noprompt expired backup; delete noprompt obsolete; DELETE NOPROMPT ARCHIVELOG ALL COMPLETED BEFORE 'SYSDATE-8'; delete noprompt backup of archivelog all completed before 'sysdate-8'; release channel c1; } exit EOF echo "End backup at : `date`" >>$LOG #echo "Begin scp at : `date`" >>$LOG #scp ${1}/*`date +%Y%m%d`* oracle@192.168.1.61:/tmp/ #echo "End scp at : `date`" >>$LOG echo "=================================================================================" >>$LOG exit 0
RMAN恢复过程
A数据库为要被还原的数据库,B数据库为Rman还原库
拷贝A数据库服务器上的pfile至B并修改
建议备份恢复前提前准备好恢复数据库上pfile,具体方法如下
1、获取原库的pfile,并修改
SQL> create pfile='/RmanBackup/init.ora' from spfile; 文件已创建。 将pfile文件复制到恢复主机上, 修改其中的部分配置为备库的具体值。主要修改数据存储路径(红色标识),创建修改后的路径,与配置文件对应
#cd /u01/app/oracle/product/12.2.0/db_1/dbs/
[oracle@swnode2 dbs]$ cat initgnnt2.ora
gnnt1.__data_transfer_cache_size=0
gnnt2.__data_transfer_cache_size=0
gnnt2.__db_cache_size=39594229760
gnnt1.__db_cache_size=39325794304
gnnt1.__inmemory_ext_roarea=0
gnnt2.__inmemory_ext_roarea=0
gnnt1.__inmemory_ext_rwarea=0
gnnt2.__inmemory_ext_rwarea=0
gnnt1.__java_pool_size=805306368
gnnt2.__java_pool_size=671088640
gnnt1.__large_pool_size=939524096
gnnt2.__large_pool_size=805306368
gnnt1.__oracle_base='/oracle/app/oracle'#ORACLE_BASE set from environment
gnnt2.__oracle_base='/u01/app/oracle'#ORACLE_BASE set from environment
gnnt1.__pga_aggregate_target=13824425984
gnnt2.__pga_aggregate_target=13824425984
gnnt1.__sga_target=55029268480
gnnt2.__sga_target=55029268480
gnnt1.__shared_io_pool_size=536870912
gnnt2.__shared_io_pool_size=0
gnnt2.__shared_pool_size=13824425984
gnnt1.__shared_pool_size=13287555072
gnnt1.__streams_pool_size=0
gnnt2.__streams_pool_size=0
*.audit_file_dest='/u01/app/oracle/admin/gnnt/adump'
*.audit_trail='NONE'
*.cluster_database=false #单实例故使用false
*.compatible='12.2.0'
*.control_file_record_keep_time=15
*.control_files='/data/conf_dir/current.261.972470897'
*.db_block_size=8192
*.db_create_file_dest='/u01/app/oracle/oradata'
*.db_name='gnnt'
*.diagnostic_dest='/u01/app/oracle'
*.dispatchers='(PROTOCOL=TCP) (SERVICE=gnntXDB)'
*.enable_pluggable_database=true
family:dw_helper.instance_mode='read-only'
gnnt2.instance_number=2
gnnt1.instance_number=1
*.local_listener='-oraagent-dummy-'
*.log_archive_dest_1='LOCATION=/u01/app/oracle/acfs_arch'
*.log_archive_format='%t_%s_%r.dbf'
*.nls_language='SIMPLIFIED CHINESE'
*.nls_territory='CHINA'
*.open_cursors=300
*.pga_aggregate_target=13107m
*.processes=15000
*.remote_login_passwordfile='exclusive'
*.sga_target=52428m
gnnt2.thread=2
gnnt1.thread=1
gnnt1.undo_tablespace='UNDOTBS1'
gnnt2.undo_tablespace='UNDOTBS2'
2、rman下用修改后的pfile启动至nomount状态,恢复控制文件
RMAN> startup nomount pfile='/u01/app/oracle/product/12.2.0/db_1/dbs/initgnnt2.ora'; Oracle instance started Total System Global Area 2483027968 bytes Fixed Size 8795808 bytes Variable Size 671091040 bytes Database Buffers 1795162112 bytes Redo Buffers 7979008 bytes
恢复控制文件(这一步必须nomount状态)
RMAN> restore controlfile from '/data/conf_ORCL_c-1508459345-20181125-00'; Starting restore at 25-NOV-18 using target database control file instead of recovery catalog allocated channel: ORA_DISK_1 channel ORA_DISK_1: SID=8 device type=DISK channel ORA_DISK_1: restoring control file channel ORA_DISK_1: restore complete, elapsed time: 00:00:01 output file name=/u01/app/oracle/oradata/racdb11/current.256.980678617 output file name=/u01/app/oracle/oradata/racdb11/current.257.980678613 Finished restore at 25-NOV-18
3、启动到mount状态,恢复数据库
RMAN> alter database mount;
Statement processed
released channel: ORA_DISK_1
5、注册备份目录到控制文件,-----------把拷贝过来的备份文件目录注册到控制文件,告诉控制文件我的备份在这个目录
RMAN> CATALOG START WITH '/DBback/';
restore还原数据库文件
1、修改数据文件位置
由于RAC用的是ASM存储管理的,现在是本地文件,需要修改数据文件名所以要newname一下
使用以下语句查出来所有的数据文件,改为本地文件名字
SQL>select 'SET NEWNAME FOR DATAFILE '|| file# ||' to ' ||''''|| name ||''''|| ';' from v$datafile;
查询到的结果修改,去掉SQL格式,修改正确的路径。
rman下 run{}中执行还原
run{ allocate channel d1 type disk; allocate channel d2 type disk; allocate channel d3 type disk; allocate channel d4 type disk; SET NEWNAME FOR DATAFILE 1 to '/u01/app/oracle/oradata/DATAFILE/system.257.972470727'; SET NEWNAME FOR DATAFILE 3 to '/u01/app/oracle/oradata/DATAFILE/sysaux.258.972470787'; SET NEWNAME FOR DATAFILE 4 to '/u01/app/oracle/oradata/DATAFILE/undotbs1.259.972470823'; SET NEWNAME FOR DATAFILE 5 to '/u01/app/oracle/oradata/4700A987085B3DFAE05387E5E50A8C7B/DATAFILE/system.270.972471005'; SET NEWNAME FOR DATAFILE 6 to '/u01/app/oracle/oradata/4700A987085B3DFAE05387E5E50A8C7B/DATAFILE/sysaux.269.972471005'; SET NEWNAME FOR DATAFILE 7 to '/u01/app/oracle/oradata/DATAFILE/users.260.972470825'; SET NEWNAME FOR DATAFILE 8 to '/u01/app/oracle/oradata/4700A987085B3DFAE05387E5E50A8C7B/DATAFILE/undotbs1.271.972471005'; SET NEWNAME FOR DATAFILE 9 to '/u01/app/oracle/oradata/DATAFILE/undotbs2.273.972471285'; SET NEWNAME FOR DATAFILE 10 to '/u01/app/oracle/oradata/68E9F82A20250D37E053650DA8C0828F/DATAFILE/system.282.972471893'; SET NEWNAME FOR DATAFILE 11 to '/u01/app/oracle/oradata/68E9F82A20250D37E053650DA8C0828F/DATAFILE/sysaux.283.972471893'; SET NEWNAME FOR DATAFILE 12 to '/u01/app/oracle/oradata/68E9F82A20250D37E053650DA8C0828F/DATAFILE/undotbs1.281.972471893'; SET NEWNAME FOR DATAFILE 13 to '/u01/app/oracle/oradata/68E9F82A20250D37E053650DA8C0828F/DATAFILE/undo_2.285.972471941'; SET NEWNAME FOR DATAFILE 14 to '/u01/app/oracle/oradata/68E9F82A20250D37E053650DA8C0828F/DATAFILE/users.286.972471947'; SET NEWNAME FOR DATAFILE 21 to '/u01/app/oracle/oradata/6900B0297CC66549E053650DA8C0B038/DATAFILE/system.292.972569467'; SET NEWNAME FOR DATAFILE 22 to '/u01/app/oracle/oradata/6900B0297CC66549E053650DA8C0B038/DATAFILE/sysaux.293.972569467'; SET NEWNAME FOR DATAFILE 23 to '/u01/app/oracle/oradata/6900B0297CC66549E053650DA8C0B038/DATAFILE/undotbs1.291.972569465'; SET NEWNAME FOR DATAFILE 24 to '/u01/app/oracle/oradata/6900B0297CC66549E053650DA8C0B038/DATAFILE/users.289.973098773'; SET NEWNAME FOR DATAFILE 25 to '/u01/app/oracle/oradata/6900B0297CC66549E053650DA8C0B038/DATAFILE/users.287.973099325'; SET NEWNAME FOR DATAFILE 26 to '/u01/app/oracle/oradata/6900B0297CC66549E053650DA8C0B038/DATAFILE/users.288.973099375'; SET NEWNAME FOR DATAFILE 27 to '/u01/app/oracle/oradata/6900B0297CC66549E053650DA8C0B038/DATAFILE/users.290.973099407'; SET NEWNAME FOR DATAFILE 28 to '/u01/app/oracle/oradata/6900B0297CC66549E053650DA8C0B038/DATAFILE/undo_2.295.974139333'; SET NEWNAME FOR DATAFILE 29 to '/u01/app/oracle/oradata/6900B0297CC66549E053650DA8C0B038/DATAFILE/users05.dbf'; SET NEWNAME FOR DATAFILE 30 to '/u01/app/oracle/oradata/6900B0297CC66549E053650DA8C0B038/DATAFILE/users06.dbf'; SET NEWNAME FOR DATAFILE 31 to '/u01/app/oracle/oradata/6900B0297CC66549E053650DA8C0B038/DATAFILE/users07.dbf'; SET NEWNAME FOR DATAFILE 32 to '/u01/app/oracle/oradata/DATAFILE/system01.dbf'; SET NEWNAME FOR DATAFILE 33 to '/u01/app/oracle/oradata/DATAFILE/sysaux.dbf'; SET NEWNAME FOR DATAFILE 34 to '/u01/app/oracle/oradata/6900B0297CC66549E053650DA8C0B038/DATAFILE/sysaux01.dbf'; SET NEWNAME FOR DATAFILE 35 to '/u01/app/oracle/oradata/6900B0297CC66549E053650DA8C0B038/DATAFILE/users08.dbf'; SET NEWNAME FOR DATAFILE 36 to '/u01/app/oracle/oradata/6900B0297CC66549E053650DA8C0B038/DATAFILE/users09.dbf'; SET NEWNAME FOR DATAFILE 37 to '/u01/app/oracle/oradata/6900B0297CC66549E053650DA8C0B038/DATAFILE/users10.dbf'; SET NEWNAME FOR DATAFILE 38 to '/u01/app/oracle/oradata/6900B0297CC66549E053650DA8C0B038/DATAFILE/users11.dbf'; SET NEWNAME FOR DATAFILE 39 to '/u01/app/oracle/oradata/6900B0297CC66549E053650DA8C0B038/DATAFILE/users.306.997209999'; SET NEWNAME FOR DATAFILE 40 to '/u01/app/oracle/oradata/6900B0297CC66549E053650DA8C0B038/DATAFILE/users.307.1000716387'; SET NEWNAME FOR DATAFILE 41 to '/u01/app/oracle/oradata/6900B0297CC66549E053650DA8C0B038/DATAFILE/users.308.1000717873'; restore database; switch datafile all; release channel d4; release channel d3; release channel d2; release channel d1; }