扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
在本页阅读全文(共3页)
摘要
数据库备份是一个数据库管理员工作中最重要的部分,部分策略需要在一个正规的基础上进行复审,部分本身需要频繁地进行测试,本文提供一个在Windows 32位和64位服务器上备份Oracle 10g数据库的方法,恢复管理器(RMAN)被用作主要的备份应用程序,RMAN很快、灵活,并能压缩有时比较大的部分文件,并且要使用恢复目录。数据泵导出用作次要的备份应用程序。所有操作步骤都是自动的,并且在文档中提供了脚本的解释说明。
我们在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%
提示:尽力自动清除日志文件,要记住这些命令是不容易的。
2、删除所有RMAN备份文件
这仅需要在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服务一样,无论怎样,我们让批处理文件在服务器启动时执行。
3、执行一个0级RMAN备份
这一步通常每周执行一次,我们有一些更大、更活动的数据库创建的数量巨大的归档日志,在恢复或克隆时,恢复数据库的时间将很长,在这些情况下,我们在一周内将不止执行一次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小节会有更多细节信息。
4、 创建克隆文件
这是用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 TESTDB2until 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的子目录中单独生成了一个日志文件。
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。