我们在Windows 2003 32位和64位服务器上安装了Oracle 10g数据库,我们保持数据库几乎24*7处于启动状态,但是在星期日早上执行了一次服务器重启,我们也偶尔在维护期间(如给Windows和Oracle打补丁)停掉服务器,我们使用恢复管理器(RMAN)执行在线数据库备份,RMAN是Oracle推荐的执行数据库备份和恢复的方法,RMAN是一个伟大的工具,但是因为我们使用的是Oracle标准版,不能完全受益于可用的(并行性、块介质恢复、平均时间恢复MTTR等)特性,不过,我们仍然可以用RMAN作为我们最主要的备份策略,使用RMAN备份,我们可以依据来自开发人员或管理人员的请求“刷新”我们的测试数据库,我们也在Oracle 10g数据库上执行数据泵导出作为额外的保护措施。我们使用一组Windows批处理脚本、SQL脚本、RMAN脚本和计划任务来使这些操作完全自动化,我们的主要目标是尽可能地在服务器之间保持一致以保持事情简化,大多数情况下,我们是成功的。
我们的备份策略很简单,每周一次RMAN备份,一周的其他时间执行归档日志备份,一个次要的导出或数据泵备份。我将给出步骤列表,然后再对每一步加以解释,在解释说明中,会有安装信息、脚本、建议等。在你动手创建/更新/修改当前的备份计划前,我建议你完整地阅读完本文再行动。
我们为Oracle 10g制定的夜间备份策略9步是:
1、删除旧的日志文件并重命名当前的日志
2、删除所有RMAN备份文件
3、执行一个0级RMAN备份
4、创建克隆文件
5、创建归档日志备份,包括恢复目录内务
6、删除数据泵导出文件
7、执行数据泵导出
8、检查日志错误
9、广播和/或发送简短错误描述的电子邮件
1、删除旧日志文件并重命名当前的日志
这是每天都要执行的,为所有的脚本创建一个日志文件是很好的实践,在步骤8中,我检查所有日志错误,因此重命名了当前日志,当它们被重命名后,就很容易参考旧的作业分辨出错误了,这些所有需要删除的最终是为了不引起空间问题。
代码清单1:
qgrep -l rman D:/oracle/admin/common/backup/logs/* >> %LOGFILE% del /Q D:/oracle/admin/common/backup/logs/*.oldlog3 >> %LOGFILE% ren D:/oracle/admin/common/backup/logs/*.oldlog2 *.oldlog3 >> %LOGFILE% ren D:/oracle/admin/common/backup/logs/*.oldlog1 *.oldlog2 >> %LOGFILE% ren D:/oracle/admin/common/backup/logs/*.log *.oldlog1 >> %LOGFILE% 提示:尽力自动清除日志文件,要记住这些命令是不容易的。 |
这仅需要在0级RMAN备份之前执行一次,我们的RMAN备份在X:驱动器上执行,正确地说是X:/RMAN。我们估算这个驱动器可以容纳下我们的0级备份、归档日志、归档日志备份和数据泵导出文件。每周清除一次RMAN文件基本上可以保证驱动器上有足够的空间存储下一周的备份。
代码清单2:
# Running these commands will show the files that will be deleted in the next step. FORFILES /p x:/rman /m *.bks /d -0 /c "CMD /C echo @PATH/@FILE @FDATE.@FTIME" >> %logfile% FORFILES /p x:/rman /m *cfile* /d -0 /c "CMD /C echo @PATH/@FILE @FDATE.@FTIME" >> %logfile% # These commands perform the actual deletion. FORFILES /p x:/rman /d -0 /c "CMD /C del *.bks" >> %logfile% FORFILES /p x:/rman /d-0 /c "CMD /C del *cfile*" >> %logfile% |
提示:一定要自动删除磁盘上的大文件。在一个不恰当的时间删除你将用光磁盘空间。
X因子
X:驱动器是这个备份的关键部分,我们定期在其他服务器或交替节点上克隆我们的生产数据库进行测试和开发。RMAN喜欢从它们的备份中获取它的文件,最简单的方法就是备份到磁带上,这种方法与你在服务器上执行克隆没什么区别,当你告诉RMAN你的目标数据库,它就直接为它需要的文件转到介质管理层(MML),我们使用磁带的问题是磁带不可靠或磁带驱动不可靠,我们的解决办法是备份到磁盘上,问题是它将中服务器相同的驱动器映射中来回地复制文件,我们需要做的是映射一个SAN驱动器到我们的生产服务器上,然后在启动时将我们的测试服务器映射到同一个SAN驱动器,我们可以在服务器命令行使用一个命令来完成这个任务,我们可以通过使用一个来自Windows资源套件中叫做AutoExNT的服务来解决这个问题,它允许我们在启动时运行一个批处理文件,我们可以将命令放在那里,现在生产和测试服务器都映射到同一个X:驱动器。
X文件因子
AutoExNT只能工作在32位服务器上,当你有64位服务器时问题就来了,不幸的是,Windows资源套件对64位服务器无效,因此无法使用AutoExNT,幸运的是,我们可以说服我们的开发人员在64位Windows上创建一个“启动”服务,让它与AutoExNT服务一样,无论怎样,我们让批处理文件在服务器启动时执行。
这一步通常每周执行一次,我们有一些更大、更活动的数据库创建的数量巨大的归档日志,在恢复或克隆时,恢复数据库的时间将很长,在这些情况下,我们在一周内将不止执行一次0级备份,在0级RMAN备份中,我们执行非恢复目录维护,脚本叫做DBname_lvl_0_disk.rcv。
代码清单3:
#************* Configure controls for Recovery Manager ******************* #***************** in case they have been changed ************************ configure controlfile autobackup on; configure controlfile autobackup format for device type disk to 'X: /rman/CFILE_%F.bks'; configure channel 1 device type disk format 'X:/rman/BACKUPPIECE_%d _%U_%T_%s.bks' maxpiecesize 2048M; configure retention policy to recovery window of 34 days; #************* Perform weekly RMAN level 0 Database Backup *************** backup as compressed backupset incremental level = 0 database; #************* Confirm level 0 Backup is valid *************************** restore database check logical validate; |
第一个命令配置RMAN让控制文件和spfile自动备份,第二个命令指定RMAN用一种特定的格式给文件命名,本例中,备份到磁盘上的文件叫做“X:/rman/CFILE_F%.bks”,第三个命令创建一个磁盘通道并命名为“1”,命名备份片“X:/rman/BACKUPPICE_%d_%U_%T_%s.bks”以及任何一个备份片的大小不能超过2GB,第四个命令告诉恢复目录目标数据库的备份应该保留34天,第五个命令才是真正的执行备份,它告诉RMAN创建一个压缩的备份集,它真正可以容纳更多的备份片,它还指定了仅对数据库执行一个完整备份,没有备份归档日志,因为存储是最主要的问题,压缩备份对节省空间真正的有帮助,我们发现这是RMAN最有用的特性之一,最后一行的命令执行已经完成的备份检查,它读取备份文件并确认它们没有被破坏,我强烈建议不要跳过这一步,没有什么比在需要恢复一个数据库时发现一个或更多的文件不可用更糟糕的了。
提示:只有当备份文件确认有效后你才可以使用它们,是的,事情就是这样!我已经试过多次在备份完成后但检查确认未完成之前的实验了。
我使用一个Windows批处理文件调用RMAN 0级备份脚本,这个批处理文件叫做DBname_lvl_0_disk.bat。
代码清单4:
set NLS_DATE_FORMAT=DD-MON-YYYY HH24:MI:SS set NLS_LANG=AMERICAN_AMERICA.WE8MSWIN1252 set CURDIR=D:/oracle/admin/common/backup cd %CURDIR% rman target ID/pword@DBname catalog rcatID/rcatpword@rcatname log=logs /DBname_lvl_0_disk.log @DBname_lvl_0_disk.rcv page_on_backup.vbs DBname_level_0_disk.log page_DBname_level_0.log Dbname |
最前面两行设置操作系统的环境变量,我们更喜欢详细一点的日期掩码,05-DEC-2007 23:59:59"比"05-DEC-2007"好,日期格式在恢复过程中变得更重要了,设置NLS_LANG变量,移除所有数据库正在使用的字符设置疑惑,第三和第四行对于使用计划任务而言是很重要的,Windows需要直接指定RMAN脚本的位置,因此设置好目录并将脚本移动到那里,接下来,才真正的调用RMAN,需要同时登陆到target和catalog,在当前目录下一个独立的叫做“logs”的子目录下创建一个日志文件,以及调用列表4中的脚本代码,如果出现任何错误,一个VB脚本被调用呼叫支持人员,如果不出现错误,那么只会发送一封日志文件的电子邮件,在第9小节会有更多细节信息。
这是用RMAN备份自动“刷新”测试数据库最关键的一步,克隆文件批处理作业实际上创建了“复制数据库”语句,我们使用它克隆我们的生产数据库到我们的测试数据库上,下面是一个叫做create_TESTDB_clone_files.sql的在生产服务器上运行的SQL脚本文件。
代码清单5:
set echo off; set feedback off; set linesize 140; SET PAGESIZE 0; set trimspool on; ALTER SESSION SET NLS_DATE_FORMAT='YYYY-MON-DD HH24:MI:SS'; select checkpoint_change# from v$database; alter system archive log current; select sysdate from dual; -- *********************************************************************** -- *********************************************************************** -- *********************************************************************** -- ******************************* TESTDBSERVER ************************** -- ******************************* TESTDBSERVER ************************** -- ******************************* TESTDBSERVER ************************** -- *********************************************************************** -- *********************************************************************** -- *********************************************************************** --TESTDB1 spool //TESTDBSERVER/d$/oracle/admin/common/clone/clone_to_TETSTDB1.rcv select 'duplicate target database to TESTDB1 until time ' ||''''|| sysdate ||''';' from dual; spool off; --TESTDB2 spool //TESTDBSERVER/d$/oracle/admin/common/clone/clone_to_TETSTDB2.rcv select 'duplicate target database to TESTDB2 until time ' ||''''|| sysdate ||''';' from dual; spool off; --TESTDB3 spool //TESTDBSERVER/d$/oracle/admin/common/clone/clone_to_TETSTDB3.rcv select 'duplicate target database to TESTDB23until time ' ||''''|| sysdate ||''';' from dual; spool off; -- *********************************************************************** -- *********************************************************************** -- *********************************************************************** -- ********************************* THE END ***************************** -- ********************************* THE END ***************************** -- *********************************************************************** -- *********************************************************************** -- *********************************************************************** alter system archive log current; select sysdate from dual; select checkpoint_change# from v$database; select sysdate from dual; exit; |
这个脚本在生产服务器上运行,spool输出到测试服务器,首先你注意的是NLS_DATE_FORMAT设置,与0级备份时设置方法一样;接下来,你看到我们已经选择了系统改变序号或SCN,数据库也可以通过使用SCN克隆和/或恢复,我们不再使用SCN进行数据库复制,我们不取消这一步是因为我们想查看日志文件中的SCN,假设在一个生产恢复情景下,SCN在一个额外的位置是可用的,在接下来的语句中,我们对当前的重做日志进行归档,我们从Oracle 8i开始就已经执行过了RMAN复制,但日志方面总有问题,这是唯一可以确定的最好的方法,我们每次都这样使用;接下来,我们选择sysdate,我们想在SCN下查看它,向下移动到spool语句,你看到一个为TESTDBSERVER编写的名叫clone_to_TESTDB.rcv的RMAN脚本,只有一行:
代码清单6:
duplicate target database to TESTDB1 until time '2007-DEC-05 19:55:00'; |
你可以在你的测试数据库服务器上为每个测试数据库单独编写一个克隆脚本,正如你看到的,这就是我们所做的,我们有一部分生产数据库服务器不止安装有一个生产数据库,对那些我们有两个脚本,在每个生产数据库上为测试数据库创建一个克隆脚本。
代码清单7:
set NLS_DATE_FORMAT=DD-MON-YYYY HH24:MI:SS set NLS_LANG=AMERICAN_AMERICA.WE8MSWIN1252 set CURDIR=D:/oracle/admin/common/batch cd %CURDIR% sqlplus system/pword@DBNAME @create_TESTDB_clone_files.sql > logs/ create_TESTDB_clone_files.log |
这个脚本的批处理文件非常简单,最前面的两行设置你的环境变量,第三和第四行用于任务调度,非常重要,windows需要直接指定SQL脚本的位置,因此需要设置好目录后,将脚本移动到目录中,接下来,SQLplus才真正被调用和运行脚本以创建克隆文件,在当前目录下的一个叫做logs的子目录中单独生成了一个日志文件。
归档日志每天都要备份,我们已经叙述过正常情况下每周执行一次0级备份,因为这个备份天天都要发生,这一步我们执行我们的RMAN恢复目录维护,脚本叫做DBNAME_arc_only_disk.rcv。
代码清单8:
#************* Configure controls for Recovery Manager ************ #************* in case they have been changed ********************* configure controlfile autobackup on; configure controlfile autobackup format for device type disk to 'X:/rman/CFILE_%F.bks'; configure retention policy to recovery window of 34 days; #************* Perform nightly RMAN Archivelog Backup ************* backup archivelog all format 'X:/rman/ARC_%d_%U_%T_%s.bks'; #************* Maintenance Step to remove old Archivelogs ********* delete noprompt archivelog until time 'SYSDATE - 3'; #************* Maintenance Steps to clean Recovery Catalog ******** report obsolete device type disk; crosscheck backup completed before 'sysdate-34'; delete noprompt obsolete recovery window of 34 days device type disk; delete noprompt expired backup device type disk; #************* Show all controls configured for this ************** #************* Database in RMAN *********************************** show all; #************* List all RMAN disk backups ************************* list backup of database device type disk; |
最前面的两行命令配置RMAN自动备份控制文件和spfile,第一个命令开启它,因此运行备份命令时控制文件和spfile就被备份了;第二个命令告诉RMAN如何用指定的格式命名文件,在本例中,备份到磁盘上叫做‘X:/rman/CFILE_F%.bks’的文件;第三行告诉恢复目录目标数据库的备份保留34天;第四行才真正地执行备份,它告诉RMAN用指定的格式备份磁盘上的所有归档日志;接下来移除所有超过3天的旧归档日志,我们想在磁盘上保持归档日志3天;接下来我们就进入恢复目录维护小节了,目录维护非常重要,如果这些文件被删除维护步骤不能执行,那么恢复目录将不再包含关于备份的有效信息,紧接着报告备份作废,使磁盘满足我们的保留34天的策略,任何被认为是作废的旧的备份可以被删除,交叉检查命令将向你报告是否有文件丢失了,如果发现了丢失的文件,它们将被标记为过期的,接下来的两个删除命令从目录中移除作废的和过期的信息,记住,我们每7天从磁盘删除所有的RMAN备份文件,我们的保留策略设置为34天,因为我们的现场磁带保留策略也是这样,如果需要,我们可以在一个服务器上恢复RMAN文件到34天前,我们可以恢复文件到数据库吗?是的,我们可以!怎么做呢?因为我们有一个34天保留策略以及我们所有关于那些备份的RMAN信息都还在恢复目录中!下面的show all命令给出了我们在RMAN中配置参数,list命令显示了所有仍然保留在恢复目录中的磁盘备份。
提示:显然,恢复目录很重要所以它也需要备份,它也很容易恢复,如果你丢失了恢复目录而且处于紧要关头,你只需要导入恢复目录方案到任何数据库即可!你就得到一个新的恢复目录
。
这个脚本的批处理文件很简单,批处理文件叫做DBNAME_arc_only_disk.bat。
代码清单9:
set NLS_DATE_FORMAT=DD-MON-YYYY HH24:MI:SS set NLS_LANG=AMERICAN_AMERICA.WE8MSWIN1252 set CURDIR=D:/oracle/admin/common/backup cd %CURDIR% rman target ID/pword@DBname catalog rcatID/rcatpword@rcatname log=logs/ DBNAME_arc_only_disk.log @DBNAME_arc_only_disk.rcv page_on_backup.vbs DBNAME_arc_only_disk.log page_DBNAME_arc_only.log DBNAME |
最前面两行设置你的环境变量,第三和第四行用于任务计划,很重要,windows需要直接指定RMAN脚本的位置,因此设置好目录后将脚本移动到该目录中,接下来调用RMAN,需要登陆到target和catalog,在当前目录下的子目录logs中会生成一个单独的日志文件,然后调用清单9中的代码,如果出现任何错误哦,一个VB脚本会呼叫支持人员,如果没有错误就发送一封日志文件电子邮件,在第9小节有更详细的介绍。
每次运行数据泵时它需要为数据泵文件取一个新名字,与导出不同,它不会覆盖旧的数据泵文件,因此以前在夜间调度执行的数据泵导出文件需要被移除,下面是批处理文件:
代码清单10:
set CURDIR=D:/oracle/admin/common/batch cd %CURDIR% set logfile=logs/delete_Xdrive_expdp_files.log echo 'logfile = ' %logfile% > %logfile% echo . >> %logfile% echo . >> %logfile% echo '******************************************************' >> %logfile% echo '* The following files will be deleted. *' >> %logfile% echo '******************************************************' >> %logfile% echo . >> %logfile% echo . >> %logfile% FORFILES /p X:/data_pump/DMPs /m *.dmp /d -0 /c "CMD /C echo @PATH/@FILE @FDATE.@FTIME" >> %logfile% echo . >> %logfile% echo . >> %logfile% echo '******************************************************' >> %logfile% echo '* Starting deletes now ... *' >> %logfile% echo '******************************************************' >> %logfile% echo . >> %logfile% echo . >> %logfile% FORFILES /p X:/data_pump/DMPs /d -0 /c "CMD /C del *.dmp" >> %logfile% echo . >> %logfile% echo . >> %logfile% |
这里和我们在其他批处理脚本中看到的一样,首先我们设置好目录然后将脚本放进去,我们也设置了日志文件为一个变量,因为我们将经常使用它,实际上,第一条进入日志文件的条目是日志文件名,使用点的echo命令只是为了让日志可读性更佳,实际上这里只有两条有效的命令,第一条简单地列出即将删除的文件,第二条命令真正地执行删除操作。
作为我们工作中附加的一种安全保护措施,我们也执行了夜间数据泵导出,作为一个额外的优点,当我们需要恢复一到两个表时,它比RMAN更容易。
我们使用par文件保存我们的数据泵命令,与导出非常类似,我们在数据库中设置了一些变量,你可以在par文件中看到,下面是创建它们的SQL语句:
代码清单11:
create directory x_dp_dumps as 'X:/data_pump/DMPs'; create directory x_dp_logs as 'X:/data_pump/logs'; 这些信号指定数据泵发送导出文件和日志文件的位置,下面是par文件的内容: 代码清单12: content = all dumpfile = x_dp_dumps:DBNAME_FULL_%U.dmp estimate = statistics full = y job_name = DBNAME_FULL logfile = x_dp_logs:DBNAME_FULL.log filesize = 2G |
content=all意味着我们想导出所有的数据或没有例外,dumpfile参数要求我们指定文件存放位置和文件名,文件文章是一个变量,文件名使用了替换变量U%,U%将被一个两位数的整数(从01开始)替换,可以创建一个或多个文件,依赖于数据库的大小,estimate给你提供了一个数据泵文件可能的大小的主意,block是默认值,但我们使用了statistics,full指定你是否想导出一个完整的数据库,job_name是可选的,实际中你可以给它取一个你喜欢的名字,logfile与dump file的设置类似,logfile要求你指定文件位置和文件名,文件位置和文件名都可以给定一个变量,filesize也是可选的,我们想让文件大小保持为2G或更小,当复制或压缩时,它会更容易和更快地移动或压缩(10个文件比1个大文件要快)。
我们调用数据泵作为一个计划任务,但是我们的设置有一点不同,我们为每个数据库准备有一个特殊的par文件和执行它的一个命令批处理文件,下面是计划任务中使用到的命令:
代码清单13:
D:/oracle/admin/common/expdp/expdp_DATABASE.bat DBNAME |
实际上它是用于调用数据泵par文件的批处理文件。
代码清单14:
set DATABASE=%1 set ORACLE_HOME=D:/oracle/product/10.2.0/db_1 %ORACLE_HOME%/bin/expdp ID/pword@%DATABASE% parfile=D:/oracle/a dmin/common/expdp/expdp_%DATABASE%.par |
需要传递给批处理文件的唯一参数是数据库名,它成了%DATABASE%,照这样执行数据泵导出给我们带来了很好的效果。
每天晚上服务器上的所有批处理作业执行完后,我们都要在服务器上运行一个错误检查,它是一个简单的批处理文件,在关键日志中用关键字执行qgrep并格式化信息以让其可读性更佳,和前面叙述的一样,你可以通过文件名容易地从“当前的”日志中分辨出“旧的”日志,下面是批处理文件error_check.bat的内容:
代码清单15:
error_check.bat set SERVER=DBSERVER set LOGFILE=error_check.log echo ********************************************************* > %LOGFILE% echo ******************************************************** >> %LOGFILE% echo ******************************************************** >> %LOGFILE% echo %SERVER% >> %LOGFILE% echo Daily Error Report >> %LOGFILE% date /T >> %LOGFILE% echo ******************************************************** >> %LOGFILE% echo ******************************************************** >> %LOGFILE% echo ******************************************************** >> %LOGFILE% echo . >> %LOGFILE% echo . >> %LOGFILE% echo ******************************************************** >> %LOGFILE% echo The following files have been found with errors. >> %LOGFILE% echo ******************************************************** >> %LOGFILE% echo . >> %LOGFILE% echo . >> %LOGFILE% echo Backup files >> %LOGFILE% echo . >> %LOGFILE% qgrep -l RMAN- D:/oracle/admin/common/backup/logs/* >> %LOGFILE% echo . >> %LOGFILE% echo . >> %LOGFILE% echo Batch files >> %LOGFILE% echo . >> %LOGFILE% qgrep -l error D:/oracle/admin/common/batch/logs/* >> %LOGFILE% echo . >> %LOGFILE% echo . >> %LOGFILE% echo Clone files >> %LOGFILE% echo . >> %LOGFILE% qgrep -l RMAN- D:/oracle/admin/common/clone/logs/* >> %LOGFILE% echo . >> %LOGFILE% echo . >> %LOGFILE% echo Alert Logs >> %LOGFILE% echo . >> %LOGFILE% @rem qgrep -l ORA- D:/oracle/product/10.2.0/admin/DBNAME1/udump/* >> %LOGFILE% qgrep -l ORA- D:/oracle/product/10.2.0/admin/DBNAME2/udump/* >> %LOGFILE% @rem echo . >> %LOGFILE% echo . >> %LOGFILE% |
备份文件检查是检查RMAN错误,批处理文件检查是检查文件删除和创建动作,克隆文件错误检查是检查数据库复制是否失败,警告日志检查容易使人误解,实际上它是检查udump目录是否有文件错误,在日志创建后,我们使用一个自由邮件客户端Bmail将其发送给我们,下面是我们的邮件批处理文件email_errors.bat内容:
代码清单16:
bmail -s 10.10.10.10 -t support2@thecountyoverhere.gov -f Oracle@ thecountyoverhere.gov -h -a "DBSERVER Daily Error Report" -m error_check.log bmail -s 10.10.10.10 -t support1@thecountyoverthere.gov -f Oracle@ thecountyoverhere.gov -h -a "DBSERVER Daily Error Report" -m error_check.log |
一些作业需要立即通知有故障了,对于这些,我们使用一个VB脚本过滤我们是否遇到了错误并立即向我们发送也个广播,这个脚本一直运行并发送一封内容为日志输出的电子邮件,我们想获取关于这些作业的执行情况而不管它是否成功执行完没有,但是它如果失败的话,我们想得到一封内容为日志的电子邮件和一个广播来定位故障的位置,这个脚本调用3个参数:
代码清单17:
page_on_backup.vbs DBNAME_arc_only_disk.log page_DBNAME_arc_only.log DBNAME |
参数是一个日志名、脚本日志名和数据库名,下面是page_on_backup.vbs的内容,它在我们RMAN 0级备份和归档日志备份时执行。
代码清单18:
'This script emails the log file for a backup and searches it for the phrase "ORA-". If found, pages the recipients 'Additional pager Numbers ' whodat - 7045551212@message.alltel.com ' whodis - 7045551313@messaging.nextel.com Dim ArgObj, var1, var2 Set ArgObj = WScript.Arguments var1 = ArgObj(0) var2 = ArgObj(1) var3 = ArgObj(2) 'email log files Dim WshSHell1 : set WshShell1 = CreateObject("WScript.Shell") WshShell1.Run("D:/oracle/admin/common/error/bmail -s 10.10.10.10 -t support1@thecountyoverthere.gov -f Oracle@thecountyoverhere.gov -h -a " & var1 & " attached -m d:/oracle/admin/common/backup/logs/" & var1 &"") WshShell1.Run("D:/oracle/admin/common/error/bmail -s 10.10.10.10 -t support2@thecountyoverhere.gov -f Oracle@thecountyoverhere.gov -h -a " & var1 & " attached -m d:/oracle/admin/common/backup/logs/" & var1 &"") 'msgbox "var1 = " & var1 & " var2 = " & var2 & "" Const ForReading = 1, ForWriting = 2 Set WshNetwork = WScript.CreateObject("WScript.Network") Dim lgmain : Set lgmain = CreateObject("Scripting.FileSystemObject") Dim lgmain2 : Set lgmain2 = lgmain.OpenTextFile("D:/Oracle/Admin/common/backup/logs/" & var2 &"", ForWriting, True) lgmain2.WriteLine "Processing began: " & Now lgmain2.WriteLine "" lgmain2.WriteLine "" Set objRegEx = CreateObject("VBScript.RegExp") objRegEx.Global = True objRegEx.Pattern = "ORA-" Set objFSO = CreateObject("Scripting.FileSystemObject") Set objFile = objFSO.OpenTextFile("D:/oracle/admin/common/backup/ logs/" & var1 & "", ForReading) strSearchString = objFile.ReadAll objFile.Close Set colMatches = objRegEx.Execute(strSearchString) If colMatches.Count > 0 Then Dim WshSHell2 : set WshShell2 = CreateObject("WScript.Shell") WshShell2.Run("D:/oracle/admin/common/error/bmail -s 10.10.10.10 -t 7045551414@my2way.com -f " & var3 & "@thecountyoverhere.gov -h -a " & var3 & "_BACKUP_ERRORS_FOUND") WshShell2.Run("D:/oracle/admin/common/error/bmail -s 10.10.10.10 -t support1@thecountyoverthere.gov -f " & var3 & "@thecountyoverhere.gov -h -a " & var3 & "_BACKUP_ERRORS_FOUND") WshShell2.Run("D:/oracle/admin/common/error/bmail -s 10.10.10.10 -t support2@thecountyoverhere.gov -f " & var3 & "@thecountyoverhere.gov -h -a " & var3 & "_BACKUP_ERRORS_FOUND") lgmain2.WriteLine "page completed" End If If colMatches.Count = 0 Then lgmain2.WriteLine "no problems found, no page required" End If |
首先发生的事情是发送一内容为日志信息的封电子邮件,接下来,在日志中查找错误代码,如果发现错误,就再发送一个广播,如果没有发现错误,脚本就执行完。
结尾
一个成功的备份计划是任何数据库管理员整个数据库策略中主要的组成部分,备份必须精心策划并经常检查,自动化备份是个好事情并非常有用,它也必须充分定义和严格测试,如果你考虑你的环境合乎逻辑它就可以做,问一下你自己“首先必须做什么?下一步必须做什么”等等,当你遇到困难是,思考是否有其他方法完成同一件事情,如果你尝试仔细思考你的环境这将变得更容易,这样你可以按原路返回,有时,改变任务的顺序也可以完成你的目标。