CentOS5u11 Oracle 10g 生产RMAN备份可用性恢复测试

简单说明

参照《CentOS5u11 Oracle 10g 静默安装手工建库统一配置方案》
克隆一台10g单机库,调整内存尽可能大,如16G
根据生产库大小和Rman备份文件增加两块磁盘
比如增加一块1.5T的动态盘放数据文件,1块500G的动态盘放备份文件
做备份可用性恢复测试的前提是,你的备份和备份策略没问题...

恢复主机预处理

1° 手动删除orcl库:

echo 'shutdown abort'|sqlplus / as sysdba
rm -rvf /oradata/orcl/*
rm -rvf /u01/app/oracle/product/10.2.0/db_1/dbs/*orcl*
rm -rvf /u01/app/oracle/product/10.2.0/db_1/dbs/*ORCL*
rm -rvf /home/oracle/*.log /home/oracle/init.ora

2° 删除备份:
实验机有可能做过rman的备份测试,清除掉

rm -rf /backup/autobackup/*
rm -rf /backup/backupset/*
rm -rf /backup/rman/script/rman_run.log

3° 新加磁盘格式化挂载:

echo -e "n\np\n1\n1\n\nw\n"|fdisk /dev/sdb
echo -e "n\np\n1\n1\n\nw\n"|fdisk /dev/sdc
# 使用fdisk命令分盘,将设备完全分给一个主分区
# 这是一个非交互式的fdisk分盘命令,如果不理解请使用交互式
mkfs.ext3 /dev/sdb1
mkfs.ext3 /dev/sdc1
# 格式化分区成ext3

iostat -xk sdb sdc 1|\
awk '{if($1~/^Device/){printf("\n%-10s %-10s\n",$1,$NF)}
 else if($1~/^sd/)    {printf(  "%-10s %-10s\n",$1,$NF)}}'
# 在格式化sdb1和sdc1时候非常消耗磁盘设备的IO
# 通过iostat命令监控磁盘性能使用率
# "%util"该项代表磁盘性能使用比,当接近或者处于100%时,磁盘性能瓶颈
# 可以打开另外一个端口进行监控

echo -e "/dev/sdb1\t\t/oradata\t\text3\tdefaults\t0 0">>/etc/fstab
echo -e "/dev/sdc1\t\t/backup/backupset\text3\tdefaults\t0 0">>/etc/fstab 
mount -a
chown oracle: -R /oradata /backup
# 设置系统重启自动挂载,修改目录权限
reboot
# 重启测试

4° 替换环境变量:

su - oracle
SID=newecpss
NLS=UTF8
SGA=$(grep 'MemTotal' /proc/meminfo |awk '{printf ("%d\n",$2*1024*0.8*0.8)}')
PGA=$(grep 'MemTotal' /proc/meminfo |awk '{printf ("%d\n",$2*1024*0.8*0.2)}')

sed -i "s/orcl/${SID}/g" $ORACLE_HOME/network/admin/listener.ora
sed -i "s/orcl/${SID}/g" ~/.bash_profile
sed -i "s/UTF8/${NLS}/g" ~/.bash_profile
echo "${SID}:/u01/app/oracle/product/10.2.0/db_1:N">/etc/oratab
# 替换掉了监听和oracle用户的profile,以及oratab文件

5° 重建实例运行目录:

mkdir -pv /u01/app/oracle/admin/${SID}/{adump,bdump,cdump,dpdump,pfile,udump}
mkdir -pv /u01/app/oracle/product/10.2.0/db_1/cfgtoollogs/dbca/${SID}
mkdir -pv /oradata/${SID}/ /arch/${SID}/
chown oracle: -R /oradata/
rm -rf /u01/app/oracle/admin/orcl /oradata/orcl /arch/orcl
# 新建了dump目录和数据文件目录以及归档目录

备份可用性恢复测试开始

1° 参数文件恢复:

su - root
cp -av /mnt/2018_04/spf1_NEWECPSS_20180410_32917_1 /backup/backupset/
chown oracle: /backup/backupset/spf1_NEWECPSS_20180410_32917_1
# 使用20180410的参数文件备份进行恢复

su - oracle
rman target /
startup force;
restore spfile from '/backup/backupset/spf1_NEWECPSS_20180410_32917_1';
exit
# 使用备份恢复spfile

sqlplus / as sysdba
shutdown abort;
create pfile from spfile;
exit
# 依据spfile创建pfile

cd $ORACLE_HOME/dbs
rm -rf spfile${ORACLE_SID}.ora

# 删掉spfile,对生成的pfile进行修改:
sed -i "/^${ORACLE_SID}\./d" init${ORACLE_SID}.ora
# 擦掉临时生效的参数

sed -i "s|^\(.*audit_file_dest='\).*$|\1/u01/app/oracle/admin/${ORACLE_SID}/adump'|g" init${ORACLE_SID}.ora
sed -i "s|^\(.*background_dump_dest='\).*$|\1/u01/app/oracle/admin/${ORACLE_SID}/bdump'|g" init${ORACLE_SID}.ora
sed -i "s|^\(.*core_dump_dest='\).*$|\1/u01/app/oracle/admin/${ORACLE_SID}/cdump'|g" init${ORACLE_SID}.ora
sed -i "s|^\(.*user_dump_dest='\).*$|\1/u01/app/oracle/admin/${ORACLE_SID}/udump'|g" init${ORACLE_SID}.ora
# 修改dump目录

sed -i "s|^\(.*control_files='\).*$|\1/oradata/${ORACLE_SID}/control01.ctl'|g" init${ORACLE_SID}.ora
# 修改控制文件位置,恢复测试只使用一份控制文件

sed -i '/^.*db_recovery_file_dest.*$/d' init${ORACLE_SID}.ora
# 删除闪回区

SGA=$(grep 'MemTotal' /proc/meminfo |awk '{printf ("%d\n",$2*1024*0.8*0.8)}')
PGA=$(grep 'MemTotal' /proc/meminfo |awk '{printf ("%d\n",$2*1024*0.8*0.2)}')
sed -i "s/^\(.*sga_max_size=\).*$/\1${SGA}/g" init${ORACLE_SID}.ora
sed -i "s/^\(.*sga_target=\).*$/\1${SGA}/g" init${ORACLE_SID}.ora
sed -i "s/^\(.*pga_aggregate_target=\).*$/\1${PGA}/g" init${ORACLE_SID}.ora
# 修改SGA和PGA

# 如果以上sed命令无法理解,还是建议根据注释的提示,手动时候用vi进行修改
# 一个做rman备份可用性恢复测试的人员必然是一个oracle的dba,必然对pfile想当熟稔

2° 控制文件恢复:

su - root
cp -av /mnt/2018_04/ctl1_NEWECPSS_20180410_32916_1 /backup/backupset/
chown oracle: /backup/backupset/ctl1_NEWECPSS_20180410_32916_1
# 使用20180410的控制文件备份进行恢复

su - oracle
rman target /
startup nomount;
restore controlfile from '/backup/backupset/ctl1_NEWECPSS_20180410_32916_1';
alter database mount;
exit
# 使用备份恢复控制文件到pfile中指定的目录

su - root
cp -av /mnt/full_20180408/inc0_NEWECPSS_20180408_* /backup/backupset/
cp -av arc0_NEWECPSS_* /backup/backupset/
chown oracle: -R /backup/backupset/
# 使用20180408全备文件进行恢复,早于控制文件备份
# 同时将归档同步到备份目录

su - oracle
# 备份文件注册到控制文件之中:
for i in $(find /backup/backupset/ -type f);do echo "catalog backuppiece '"$i"';";done|rman target /
# 查找/backup/backupset下的备份片文件,生成catalog backuppiece语句,管道给rman

# 查看当前数据表空间文件、临时表空间文件和日志文件路径
sqlplus -s / as sysdba<<EOF
set pagesize 0
set linesize 200
set heading off
set feedback off
select name from v\$datafile
 union all
select name from v\$tempfile
 union all
select member from v\$logfile;
EOF
# 查看控制文件中记录的当前三类文件位置

# 修改恢复库的位置,控制文件已恢复,路径位置无需更改
sqlplus -s / as sysdba>/tmp/RenameDataFileSql.sql<<EOF
set pagesize 0
set linesize 200
set heading off
set feedback off
select 'alter database rename file ''' || name ||
       ''' to ''/oradata/newecpss/' ||
       regexp_substr(name, '[^/]+', 1, length(regexp_replace(name, '[^/]'))) ||
       ''';'
  from (select name from v\$tempfile union all select member from v\$logfile);
EOF
cat /tmp/RenameDataFileSql.sql|sqlplus -s / as sysdba
rm -rf /tmp/RenameDataFileSql.sql
# 生成将临时表空间文件和日志文件修改路径的SQL语句,然后使用sqlplus执行生效
# 可以再次执行上一次的语句进行验证

# 数据文件路径只能在rman恢复时候进行转换,批量生成转换语句命令如下:
sqlplus -s / as sysdba<<EOF
set pagesize 0
set linesize 200
set heading off
set feedback off
select 'set newname for datafile ''' || name ||
       ''' to ''/oradata/newecpss/' ||
       regexp_substr(name, '[^/]+', 1, length(regexp_replace(name, '[^/]'))) ||
       ''';'
  from v\$datafile;
EOF

3° 重置块追踪:

rm -rf $ORACLE_HOME/block_change_trace/*
sqlplus -s / as sysdba<<EOF
alter database disable block change tracking;
alter database enable block change tracking using file '?/block_change_trace/track.file';
EOF

4° 数据文件恢复:

echo 'run{'>/tmp/RenameDataFileSql.sql
sqlplus -s / as sysdba>/tmp/RenameDataFileSql.tmp<<EOF
set pagesize 0
set linesize 200
set heading off
set feedback off
select 'set newname for datafile ''' || name ||
       ''' to ''/oradata/newecpss/' ||
       regexp_substr(name, '[^/]+', 1, length(regexp_replace(name, '[^/]'))) ||
       ''';'
  from v\$datafile;
EOF
cat /tmp/RenameDataFileSql.tmp|column -t>>/tmp/RenameDataFileSql.sql
cat >>/tmp/RenameDataFileSql.sql<<EOF
restore database;
switch datafile all;
}
exit
EOF
rm -rf /tmp/RenameDataFileSql.tmp
# 拼出rman的数据文件转换恢复语句

# 数据文件恢复开始:
cat /tmp/RenameDataFileSql.sql|rman target /
# 取决于被备份的库的容量和测试主机的性能,主要是IO性能
# 我使用的虚拟机数据盘是一块1T西数黑盘+一块1T希捷盘拼凑的软RAID0
# 恢复生产920G左右数据耗时10小时左右
rm -rf RenameDataFileSql.sql

5° 追归档:

echo 'recover database;'|rman target /
# 注意归档备份恢复到/arch目录时,目录所在设备的可用空间
# 监控 /arch/${ORACLE_SID}/ 目录下的归档文件
# 可以根据时间删除较老的归档,释放空间
# 也可以查看文件句柄的进程占用,来定位当前恢复到了哪个归档文件:
# lsof |grep "/arch/${ORACLE_SID}"
# 或者可以直接根据rman的日志推断
# 如果被恢复出来的归档删多了,比如该归档正在用于恢复操作时被删了
# 会报错,归档缺失,重新执行 recover database; 即可

6° 设定时间戳追归档:

# 根据归档备份的时间戳,查看时间戳前后的归档备份,设定一个合理的恢复点进行恢复
rman target /
list backup of archivelog time
  between "to_date('2018-04-10 03:00:00','yyyy-mm-dd hh24:mi:ss')"
  and     "to_date('2018-04-10 06:00:00','yyyy-mm-dd hh24:mi:ss')";
recover database until time '2018-04-10 03:30:00';
exit

7° 开库,数据验证:

echo 'alter database open resetlogs;'|rman target /
echo 'select max(CREATETIME) from payment.channel_order;'|sqlplus -s / as sysdba
# MAX(CREATETIME)
# -------------------
# 2018-04-10 03:31:25

收尾

测试结束后需要删除测试机,妥善保存转储的备份文件,防止数据泄露。

[TOC]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值