赵全文
太极计算机Oracle DBA
长期负责Oracle数据库日常维护、故障排除、性能优化等工作;
致力于通过脚本来实现运维的自动化。
内容简介:
两种Shell脚本详解
验证RMAN备份集有效性的操作实战
RMAN备份恢复实验操作战技
经常听一些大师说,要定期做Oracle数据库的备份恢复实验,那非要等到数据库出了问题的话,说什么也晚了。当然,这个东西要落地的话,每家公司的做法和业务场景都有所不同。其实,这个问题也困扰了我好久,后来正好学了点Shell知识,我就想着能不能用Shell脚本编写一些RMAN相关的日常维护操作。于是,从今年3月开始,用了将近一个月时间,“验证RMAN备份集的有效性”和“用RMAN备份集做定期恢复实验”这两种Shell脚本就出炉了。最后反复进行了测试,正常运行。今天借社群这个平台,和大家一起分享。
一、两种Shell脚本详解
首先,是第一种Shell脚本,“rman_validate_v2.sh”用来验证Oracle RMAN备份集的有效性。
脚本注释部分,见下图:
这部分都是一些注释性的内容,第一个红框是个人姓名,EMAIL邮箱和我的技术blog地址;第二个红框是数据库类型、操作系统类型、脚本文件名、脚本类型以及脚本的用途;第三个红框是注意事项,是说这个脚本文件首先要在测试环境测试通过以后再到生产环境运行。
脚本变量定义部分,看下图:
第一个红框是导入.bash_profile文件的环境变量;第二个红框是定义SHELL外部变量的绝对路径;第三个红框是定义一些常用字符串变量,比如RMAN备份集的位置、RMAN日志的位置等。
脚本“查询RMAN备份集的BS_KEY值”部分,见下图所示:
具体解释一下上面红框代表的内容,通过SQLPLUS命令连接到数据库,用SQL语句查出前一天生成的RMAN备份集的BS_KEY值存到一个变量BSKEY_LIST,这个值可不止一个哟,所以又用一个变量BSKEY_LIST_WITH_COMMA将这些值用逗号连接起来。
脚本“VALIDATE校验”部分,如下图所示:
这也是整个Shell脚本当中最为关键的内容,即用“validate backupset BS_KEY值列表 check logical;”(形如validate backupset 6197,6198,6199,6200,6201,6202……6210 check logical;)这条命令依次校验前一天生成的所有RMAN备份集的有效性。由于我们的RMAN备份采用的冗余策略是一周,即周五做全备,周六到下周的周四作增量1级备份,这是RMAN的整个备份周期。所以,我都是当天晚上校验前一天生成的RMAN备份。如果大家所在公司数据量大的话,也可以进行1周的校验,那么这种情况的话,脚本内容就要进行相应的修改。
上面就是“验证RMAN备份集有效性”这个SHELL脚本的所有内容。
接下来,是第二种SHELL脚本,用来进行RMAN恢复实验的。严格地说,它不是一个SHELL脚本就能搞定的,根据整个恢复实验的情况来看,需要5个SHELL脚本,见下图所示:
为了让大家更好地了解这5个SHELL脚本文件,我专门写了2个README的TXT文件,一个中文版的,一个英文版的,见下图:
README_CN.TXT介绍,见下图:
REAMDME_EN.TXT介绍,见下图:
(1) “ssh_mutual_trust_linux_for_source.sh”的内容,见下图:
第一个红框是定义一些SHELL外部命令的绝对路径;第二个红框是将远程主机的主机名和对应的IP地址应添加到root用户下的/etc/hosts文件里;添加的格式放在了#的注释For example下面四行内容;第三个红框是设置SSH互信功能时生成的日志文件名。
下面是PING远程主机(也就是要进行RMAN恢复的主机)的部分提示代码,如下图所示:
如何能PING通远程主机,就会输出“Proceeding further…”,否则会输出“Exiting now…”而直接退出该SHELL脚本的运行,下面是能PING通远程主机以后,将在源主机上生成一个RSA算法的公私密钥对,并将公钥文件传送到远程主机上,见下图的代码所示:
红框里的两条命令操作就是生成密钥对和传公钥的情况。
(2)“ssh_mutual_trust_linux_for_target.sh”的内容,见下图:
前面的代码部分和脚本文件“ssh_mutual_trust_linux_for_source.sh”的内容都一样,唯一不同的就是上图的在文件/etc/hosts中增加的内容。
(3)“collect_info_from_source_oracle.sh”的内容。由于这个SHELL脚本文件的代码有694行,所以只截取其中最为关键的部分,见下图所示:
就是从源Oracle数据库取得上面那28个变量的值,比如“主机名、操作系统名、数据库名、归档日志路径、RMAN备份的路径、RMAN备份的总大小(单位是MB)、监听文件和口令文件的路径等等”。
(4) “scp_log_file_to_target.sh”的内容,如下图:
第一个红框是定义了在源Oracle数据库上执行了“collect_info_from_source_oracle.sh”这个脚本生成的log文件所在的位置,第二个红框是用SCP命令将该log文件远程复制到要进行RMAN恢复的主机上。
(5)“rman_restore_and_recover_to_target_oracle.sh”的内容。由于这个SHELL脚本文件的内容有536行,也是只截取我觉得最为重要一部分,见下图:
红框圈住的内容表示要在目标主机上用“mkdir –p”命令创建这8个基本目录,当然,在目标主机上所需的磁盘空间一定要比源主机所给的空间要大,这个毋庸置疑。只要做了这一步,后面才能远程复制RMAN备份集和其它的文件等等,所以这个操作步骤很关键。最后就是依次还原出SPFILE和控制文件,将数据库启动到mount状态,用RMAN的restore和recover命令将数据库还原和恢复出来。
二、验证RMAN备份集有效性操作实战
一周的RMAN备份内容,见下图:
“2017-05-05”这一天是周五,“2017-05-11”这一天是周四,这段时间正好是一份完整的RMAN备份。其中05-05是完全备份,数据量为11G,其余的六天为增量备份,所以数据量较小。在日期后面的是自动备份的控制文件,也是保留了一周的,不过要在哪天进行RMAN恢复实验,可是要用哪一天的哟。
一周的RMAN校验日志文件,见下图:
周五RMAN完全备份的文件内容,见下图:
周五RMAN校验生成的日志文件内容,见下图:
第一个红框是校验日志的文件名(周六晚上校验的昨天,也就是周五的RMAN备份),后面三个红框是依次进行校验的3个RMAN备份集文件(0级增量备份的数据文件),下面是校验备份的归档日志和自动备份的控制文件内容,见下图:
周六RMAN增量备份的文件内容,见下图:
周六RMAN校验生成的日志文件内容,见下图:
上图首先校验的是备份的归档日志文件,大家会发现在进行RMAN校验备份集文件的时候,校验顺序就是列出的备份集文件的内容,那么,校验备份的数据文件、最后的归档日志文件和自动备份的控制文件,请看下图:
其余几天的RMAN校验生成的日志文件内容和上面两天的内容都有所雷同,这儿真的不是巧合,不再赘述,哈哈!
三、RMAN备份恢复实验操作战技
1设置源主机和目标主机之间Oracle用户的SSH互信功能
操作步骤如下:
(1)执行脚本文件“ssh_mutual_trust_linux_for_source.sh”,见下图:
发现orcl13能够PING通,于是最后输出“Proceeding further…”,那么,紧接着输出的是 源主机和目标主机的主机名,以及提示在源主机创建RSA算法的公私密钥对,见下图:
直接回车,进入下图:
在3个红色箭头处也是直接回车,就生成了RSA的公私密钥对,在最后的红框处输入“yes”,回车,见下图:
输入yes回车之后,紧接的红框处输入目标主机的Oracle用户密码(此处密码不回显,别以为没有输入)以后,也是直接回车,那么此时就把源主机相应的公钥信息(即最后红框的authorized_keys文件)传送到目标主机了。
(2)执行“ssh 目标主机”的命令进行测试,见下图:
发现不用输入目标主机的用户密码,就能直接SSH连接过去,没错,要的就是这个效果!
(3)查看执行SHELL脚本成功以后,生成的log文件信息,和执行脚本过程中显示的信息基本一样,见下图:
用cat命令查看一下上图红色箭头所指的这个log文件内容,见下面2图所示:
操作步骤如下:
(1)执行脚本文件“ssh_mutual_trust_linux_for_target.sh”,见下图:
发现源主机也能PING通,所以输出“Proceeding further…”,紧接着3个回车以后,就是输入源主机的Oracle用户密码,见下图:
输入密码回车以后,SSH互信功能设置完毕,下面进行SSH连接源主机的测试,不输密码就能连接到源主机,见下图:
(2)查看执行SHELL脚本成功以后,生成的log文件信息,和执行脚本过程中显示的信息基本一样,见下图:
用cat命令查看一下上图红色箭头所指的这个log文件内容,见下面2图所示:
2在源主机上收集源Oracle数据库的一些基本信息
操作步骤如下:
(1)执行脚本文件“collect_info_from_source_oracle.sh”,见下图:
第一个红框是执行该脚本文件生成的log文件所在路径,第二个红框是收集的基本信息的提示,比如下面的“HOSTNAME、OSNAME、DBVERSION、DBNAME、DBID、ARCH_LOG_PATH和ARCH_LOG_TOTAL_SIZE(MB)”这些参数。
其它的一些参数,见下图所示:
与此同时,那些参数的所有信息也被保存到了上图红框所指的log文件。
(2)查看脚本执行完成以后,生成的log文件,如下图:
用cat命令查看其内容,见下图:
(3)查看查询源数据库信息生成的log文件,如下图:
用cat命令查看其内容,见下图:
3将源主机上生成的文件“/tmp/source_oracle_dbinfo.log”远程复制到目标主机相应的“/tmp”目录
操作步骤如下:
(1)在复制文件之前,先查看一下,目标主机的/tmp目录,发现source_oracle_dbinfo.log文件不存在,见下图所示:
(2)执行脚本文件“scp_log_file_to_target.sh”,见如下2图:
(3)在目标主机上查看/tmp目录,发现source_oracle_dbinfo.log文件已经生成,见下图:
4在目标主机上进行RMAN还原和恢复数据库
操作步骤如下:
(1)执行脚本文件“rman_restore_and_recover_to_target_oracle.sh”,见下图:
(2)查看整个RMAN恢复数据库的过程生成的log文件,见下图:
接着,用cat命令来查看该log文件的内容,见下图:
由于该log文件内容过多,下面逐一介绍。
(1)创建一些基本目录的提示,见下图:
(2)创建目录成功的信息提示,见如下2图:
(3)远程复制监听文件和口令文件从源主机到目标主机以及相应提示信息,见下图:
(4)更改目标主机上的监听文件里的HOST字段的值由“源主机名”改为“目标主机名”,见下图提示信息:
(5)远程复制RMAN备份集中最新的备份SPFILE和最新的备份控制文件到目标主机相应位置,见下图所示:
(6)远程复制块跟踪文件到目标位置(如果源库没有开启块跟踪,就会提示没有配置块跟踪的信息),见下图所示:
(7)远程复制RMAN备份集文件到目标主机相应位置,见下图所示:
远程复制完毕的成功提示信息,见下图:
(8)在目标主机用RMAN备份集依次还原SPFILE、控制文件和数据库文件的操作,见下图:
其中还原SPFILE,见下图:
还原控制文件以及将数据库启动到mount状态,见下图:
还原数据库文件,见下图:
(9)在源主机上进行一轮完整的REDO LOGFILE切换归档操作并远程复制归档日志文件到目标主机,见下图:
远程复制归档日志文件成功的信息提示,见下图:
(10)用RMAN恢复数据库,见下图所示:
恢复成功,见下图所示:
(11)以RESETLOGS方式打开数据库,开启监听,追加一行信息到文件/etc/oratab,见下图:
5查看在目标主机上恢复出来的数据库
发现状态已经是“READ WRITE”了,见下图:
以上就是我分享的全部内容,谢谢大家!
1、如需回听直播,请戳:
https://m.qlchat.com/topic/270000350094425.htm?isGuide=Y(密码:555)
2、如需下载分享PPT,请点击登录云盘http://pan.baidu.com/s/1sl9ARl7进行获取。
3、本文脚本源代码GitHub地址: https://github.com/guestart/rman_backup_and_restore_experiment
如果字段的最大可能长度超过255字节,那么长度值可能…
只能说作者太用心了,优秀
感谢详解
一般干个7-8年(即30岁左右),能做到年入40w-50w;有…
230721