简单说明
参照《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]