热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

关于WindowsServer平台下实现DB2自动备份、复原和前滚的脚本

最近在参与负责某线上MySQL项目时,客户要求实现SQL数据备份、复原和前滚的全自动化。在RHEL平台下使用Perl语言编写脚本同时结合cron指令来共同实现,整个过程很轻松顺利且

最近在参与负责某线上MySQL项目时,客户要求实现SQL数据备份、复原和前滚的全自动化。


在RHEL平台下使用Perl语言编写脚本同时结合cron指令来共同实现,整个过程很轻松顺利且效果也比较满意。


同时,由于所负责的另一个项目是线下DB2环境,那么在Windows Server平台下又该如何实现DB2数据库备份、复原和前滚的自动化呢?


因为Windows远没有Linux的命令行功能强大,所以实现起来稍微曲折些,但是基本上还是可以实现的。经过简单的编写和测试通过后,现抽空将实现思路和实验代码分享附上,希望工作中又此需要的DBA可以参考下。



一、实验目标

要求实现数据库维护流程的全自动化,保证安全准确,提高运维效率,降低人力成本。

1. 每日凌晨1点自动对DBS1数据库服务器进行在线备份(含归档日志)。

2. 每日凌晨2点自动将DBS1数据库服务器的在线备份文件定时拷贝至DBS2数据库服务器。

3. 每日凌晨3点自动对DBS2数据库服务器进行还原并前滚。

4. 每日凌晨0点自动对DBS1/DBS2数据库服务器的数据库备份目录进行检查并清理(仅保留最近3日的),目的是为后续的备份操作保留足够的磁盘空间。

5. 每日凌晨0点自动对DBS2数据库服务器的归档日志目录进行检查并清理(仅保留当日的),目的是为后续的归档日志提取及前滚操作保留足够的磁盘空间。


二、实验环境

主机名DB2版本OS版本IP地址数据备份目录归档日志目录实例用途
DBS18.1.11.973Windows Server 2003 R2(x64)10.0.0.11e:\dbbackupNULLsampleactive
DBS28.1.11.973Windows Server 2003 R2(x64)10.0.0.12e:\dbbackupe:\logbackupsampledeactive


三、实验思路
首先,自动对DBS1数据库服务器进行在线备份(含归档日志)。
其次,自动将DBS1数据库服务器的备份文件拷贝至DBS2数据库服务器对应的目录。
最后,自动对DBS2数据库服务器进行还原及前滚。
同时,自动对数据备份目录、归档日志目录进行定期清理以保证磁盘可用空间。
* 在线备份数据库前,必须启用归档日志模式;
* 拷贝数据库备份前,必须在DBS1主机上建立DBS2主机的网络驱动器映射。


四、实验步骤
(一)在线备份数据库
DBS1
1. 编写备份脚本,具体内容如下:

::关闭回显且不显示命令本身
@ECHO OFF

::定义窗口的标题
TITLE 本脚本用于实现DB2数据库的自动在线备份——徐前进编写于2016年4月1日

::定义窗口的背景色和前景色
COLOR 0A

::定义脚本说明
ECHO :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: 
ECHO ::                                                        :: 
ECHO ::       本脚本用于实现DB2数据库的自动在线备份            :: 
ECHO ::                                                        :: 
ECHO ::                         ——徐前进编写于2016年4月1日     :: 
ECHO ::                                                        :: 
ECHO ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

::建立数据库连接
DB2 CONNECT TO netdb

::在线备份数据库且包含归档日志
DB2 BACKUP DATABASE netdb ONLINE TO e:\dbbackup INCLUDE LOGS

::自动判断脚本的执行结果并友好反馈给用户
IF ERRORLEVEL 1 (
::若上一条命令执行失败返回状态码1时,则显示此错误提醒。
 ECHO -------------------------- 分割线 --------------------------
 ECHO    您好,我无法完成NETDB数据库的自动在线备份操作(含归档日志)
 ECHO    下面,请您检查并分析导致此错误的原因,按任意键和我说告别。
 ECHO -------------------------- 分割线 --------------------------
 PAUSE
) ELSE (
::若上一条命令执行成功返回状态码0时,则显示此正确提醒。
 ECHO -------------------------- 分割线 --------------------------
 ECHO    您好,我已完成NETDB数据库的自动在线备份操作(含归档日志)
 ECHO    下面,请您确认本地已存在备份文件后,按任意键和我说告别。
 ECHO    另外,我也需要休息一会,以便明日继续执行此周期性任务。
 ECHO -------------------------- 分割线 --------------------------
 PAUSE
)

保存于“C:\Program Files (x86)\IBM\SQLLIB\BIN\”目录下并命名为“autobackup.bat”文件。
注意:建议与db2cmd.exe位于同一目录,避免无法初始化命令环境而导致语句执行失败。


2. 添加作业计划,具体操作如下:
运行参数:"C:\Program Files (x86)\IBM\SQLLIB\BIN\db2cmd.exe" autobackup.bat
日程安排:每天,凌晨1点00分
执行权限:administrator


(二)拷贝数据库备份
DBS1
1. 编写映射脚本,具体内容如下:

::关闭回显且不显示命令本身
@ECHO OFF

::定义窗口的标题
TITLE 本脚本用于实现DB2数据库备份目录的自动映射——徐前进编写于2016年4月1日

::定义窗口的背景色和前景色
COLOR 0A

::定义脚本说明
ECHO :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: 
ECHO ::                                                        :: 
ECHO ::     本脚本用于实现DB2数据库备份目录的自动映射          :: 
ECHO ::                                                        :: 
ECHO ::                         ——徐前进编写于2016年4月1日     :: 
ECHO ::                                                        :: 
ECHO ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

::建立映射前先检查并删除目标盘符
NET USE Z: /DELETE

::将DBS2主机的E盘符映射至DBS1主机的Z盘符且保持持久连接
NET USE Z: \\DBS2\E$ xuqianjin2016 /USER:xuqianjin /PERSISTENT:YES

::自动判断脚本的执行结果并友好反馈给用户
IF ERRORLEVEL 1 (
::若上一条命令执行失败返回状态码1时,则显示此错误提醒。
 ECHO -------------------------- 分割线 --------------------------
 ECHO    您好,我无法完成DB2数据库备份目录的自动映射。
 ECHO    下面,请您检查并分析导致此错误的原因,按任意键和我说告别。
 ECHO -------------------------- 分割线 --------------------------
 PAUSE
) ELSE (
::若上一条命令执行成功返回状态码0时,则显示此正确提醒。
 ECHO -------------------------- 分割线 --------------------------
 ECHO    您好,我已完成DB2数据库备份目录的自动映射。
 ECHO    下面,请您确认本地Z盘符映射已存在后,按任意键和我说告别。
 ECHO -------------------------- 分割线 --------------------------
 PAUSE
)

保存于“C:\Documents and Settings\All Users\「开始」菜单\程序\启动”目录下并命名为“automount.bat”文件。


2. 编写拷贝脚本,具体内容如下:

::关闭回显且不显示命令本身
@ECHO OFF

::定义窗口的标题
TITLE 本脚本用于实现DB2数据库备份文件的自动拷贝——徐前进编写于2016年4月1日

::定义窗口的背景色和前景色
COLOR 0A

::定义脚本说明
ECHO :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: 
ECHO ::                                                        :: 
ECHO ::       本脚本用于实现DB2数据库备份文件的自动拷贝        :: 
ECHO ::                                                        :: 
ECHO ::                         ——徐前进编写于2016年4月1日     :: 
ECHO ::                                                        :: 
ECHO ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

::打印当前日期
ECHO %date%

::定义年变量给xcopy引用
set yyyy=%date:~0,4%

::定义月变量给xcopy引用
set mm=%date:~5,2%

::定义日变量给xcopy引用
set dd=%date:~8,2%

::将修改日期为当日的目录递归复制且保持目录结构一致
xcopy e:\dbbackup\NETDB.0\DB2\NODE0000\CATN0000\*.* z:\dbbackup\NETDB.0\DB2\NODE0000\CATN0000 /s /i /v /f /y /d:%mm%-%dd%-%yyyy%

::自动判断脚本执行结果并友好反馈给用户
IF ERRORLEVEL 1 (
 ECHO -------------------------- 分割线 --------------------------
 ECHO    您好,我无法完成NETDB数据库备份文件的自动拷贝操作。
 ECHO    下面,请您检查并分析导致此错误的原因,按任意键和我说告别。
 ECHO -------------------------- 分割线 --------------------------
 PAUSE
) ELSE (
 ECHO -------------------------- 分割线 --------------------------
 ECHO    您好,我已完成NETDB数据库备份文件的自动拷贝操作。
 ECHO    下面,请确认已存在数据库备份文件后,按任意键和我说告别。
 ECHO    另外,我也需要休息一会,以便明日继续执行此周期性任务。
 ECHO -------------------------- 分割线 --------------------------
 PAUSE
)

保存于“C:\Program Files (x86)\IBM\SQLLIB\BIN\”目录下并命名为“autocopy.bat”文件。


3. 添加作业计划,具体操作如下:
运行参数:C:\Program Files (x86)\IBM\SQLLIB\BIN\autobackup.bat
日程安排:每天,凌晨2点00分
执行权限:administrator


(三)还原及前滚数据库
DBS2
1. 编写还原及前滚脚本,具体内容如下:

::关闭回显且不显示命令本身
@ECHO OFF

::定义窗口的标题
TITLE 本脚本用于实现DB2数据库的自动复原及前滚——徐前进编写于2016年4月1日

::定义窗口的背景色和前景色
COLOR 0A

::定义脚本说明
ECHO :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: 
ECHO ::                                                        :: 
ECHO ::        本脚本用于实现DB2数据库的自动复原及前滚         :: 
ECHO ::                                                        :: 
ECHO ::                         ——徐前进编写于2016年4月1日     :: 
ECHO ::                                                        :: 
ECHO ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

::建立数据库连接
DB2 CONNECT TO netdb

::先还原数据库同时将归档日志提取到指定目录
DB2 RESTORE DATABASE netdb LOGS FROM e:\dbbackup LOGTARGET e:\logbackup

::等待30秒
ping -n 30 127.0.0.1 > null

::再前滚数据库且从指定目录读取归档日志
DB2 RECOVER DATABASE netdb TO END OF LOGS AND STOP OVERFLOW LOG PATH(e:\logbackup)

::完成数据库复原及前滚后再次建立数据库连接进行验证
DB2 CONNECT TO netdb

::自动判断脚本执行结果并友好反馈给用户
IF ERRORLEVEL 1 (
 ECHO -------------------------- 分割线 --------------------------
 ECHO    您好,我无法完成NETDB数据库的自动复原及前滚操作。
 ECHO    下面,请您检查并分析导致此错误的原因,按任意键和我说告别。
 ECHO -------------------------- 分割线 --------------------------
 PAUSE
) ELSE (
 ECHO -------------------------- 分割线 --------------------------
 ECHO    您好,我已完成NETDB数据库的自动复原及前滚操作。
 ECHO    下面,请您确认前滚状态为未暂挂后,按任意键和我说告别。
 ECHO    另外,我也需要休息一会,以便明日继续执行此周期性任务。
 ECHO -------------------------- 分割线 --------------------------
 PAUSE
)

保存于“C:\Program Files (x86)\IBM\SQLLIB\BIN\”目录下并命名为“autorecover.bat”文件。
注意:建议与db2cmd.exe位于同一目录,避免无法初始化命令环境而导致语句执行失败。


2. 添加作业计划,具体操作如下:
运行参数:C:\Program Files (x86)\IBM\SQLLIB\BIN\autorecover.bat
日程安排:每天,凌晨3点00分
执行权限:administrator


(四)清理数据目录空间
1. 编写清理脚本,具体内容如下:

::关闭回显且不显示命令本身
@ECHO OFF

::定义窗口的标题
TITLE 本脚本用于实现DB2数据库备份历史文件的自动清理——徐前进编写于2016年4月1日

::定义窗口的背景色和前景色
COLOR 0A

::定义脚本说明
ECHO :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: 
ECHO ::                                                        :: 
ECHO ::     本脚本用于实现DB2数据库备份历史文件的自动清理      :: 
ECHO ::                                                        :: 
ECHO ::                         ——徐前进编写于2016年4月1日     :: 
ECHO ::                                                        :: 
ECHO ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

::共2步
::第1步是清理DBS1主机的数据库备份目录
::先递归删除DBS1主机3天前的文件
forfiles /p "e:\dbbackup\NETDB.0\DB2\NODE0000\CATN0000" /m *.* /s /c "cmd /c del @path" /d -3
::再递归删除DBS1主机3天前的空目录
dir /ad /b /s e:\dbbackup\NETDB.0\DB2\NODE0000\CATN0000 | sort /r > e:\dbbackup\emptydirectorylist.txt
For /f "tokens=*" %%i in (e:\dbbackup\emptydirectorylist.txt) DO rd "%%i" 
del e:\dbbackup\emptydirectorylist.txt

::等待30秒
ping -n 30 127.0.0.1 > null

::第2步是清理DBS2主机的数据库备份目录
::先递归删除DBS2主机1天前的文件
forfiles /p "z:\dbbackup\NETDB.0\DB2\NODE0000\CATN0000" /m *.* /s /c "cmd /c del @path" /d -1
::再递归删除DBS2主机1天前的空目录
dir /ad /b /s z:\dbbackup\NETDB.0\DB2\NODE0000\CATN0000 | sort /r > z:\dbbackup\emptydirectorylist.txt
For /f "tokens=*" %%i in (z:\dbbackup\emptydirectorylist.txt) DO rd "%%i" 
del z:\dbbackup\emptydirectorylist.txt

::自动判断脚本执行结果并友好反馈给用户
IF ERRORLEVEL 1 (
 ECHO -------------------------- 分割线 --------------------------
 ECHO    您好,我无法完成NETDB数据库备份历史文件的自动清理操作。
 ECHO    下面,请您检查并分析导致此错误的原因,按任意键和我说告别。
 ECHO -------------------------- 分割线 --------------------------
 PAUSE
) ELSE (
 ECHO -------------------------- 分割线 --------------------------
 ECHO    您好,我已完成NETDB数据库备份历史文件的自动清理操作。
 ECHO    下面,请您确认历史备份文件已清理后,按任意键和我说告别。
 ECHO    另外,我也需要休息一会,以便明日继续执行此周期性任务。
 ECHO -------------------------- 分割线 --------------------------
)

保存于“C:\WINDOWS\system32\”目录下并命名为“autocleandb.bat”文件。
注意:建议与forfiles.exe位于同一目录,避免无法初始化命令环境而导致语句执行失败。


2. 添加作业计划,具体操作如下:
运行参数:"C:\WINDOWS\system32\forfiles.exe" autocleandb.bat
日程安排:每天,凌晨0点00分
执行权限:administrator


(五)清理日志目录空间
1. 编写清理脚本,具体内容如下:

::关闭回显且不显示命令本身
@ECHO OFF

::定义窗口的标题
TITLE 本脚本用于实现DB2数据库归档日志的自动清理——徐前进编写于2016年4月1日

::定义窗口的背景色和前景色
COLOR 0A

::定义脚本说明
ECHO :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: 
ECHO ::                                                        :: 
ECHO ::       本脚本用于实现DB2数据库归档日志的自动清理        :: 
ECHO ::                                                        :: 
ECHO ::                         ——徐前进编写于2016年4月1日     :: 
ECHO ::                                                        :: 
ECHO ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

::仅清理DBS2主机归档日志目录中1天前的文件
forfiles /p "z:\logbackup" /m *.* /s /c "cmd /c del @path" /d -1

::自动判断脚本执行结果并友好反馈给用户
IF ERRORLEVEL 1 (
 ECHO -------------------------- 分割线 --------------------------
 ECHO    您好,我无法完成NETDB数据库归档日志的自动清理操作。
 ECHO    下面,请您检查并分析导致此错误的原因,按任意键和我说告别。
 ECHO -------------------------- 分割线 --------------------------
 PAUSE
) ELSE (
 ECHO -------------------------- 分割线 --------------------------
 ECHO    您好,我已完成NETDB数据库归档日志的自动清理操作。
 ECHO    下面,请您确认历史归档日志已清理后,按任意键和我说告别。
 ECHO    另外,我也需要休息一会,以便明日继续执行此周期性任务。
 ECHO -------------------------- 分割线 --------------------------
 PAUSE
)

保存于“C:\WINDOWS\system32\”目录下并命名为“autocleanlog.bat”文件。
注意:建议与forfiles.exe应用程序位于同一目录,避免无法初始化命令环境导致语句执行失败。


2. 添加自动调度任务计划,具体操作如下:
运行参数:"C:\WINDOWS\system32\forfiles.exe" autocleanlog.bat
日程安排:每天,凌晨0点00分
执行权限:administrator


(附录)
关于RESTORE/ROLLFORWARD/RECOVER区别
DB2 v8.2前,执行数据库还原及前滚共需2步(RESTORE+ROLLFORWARD),具体如下:
DB2 RESTORE DATABASE sample FROM e:\dbbackup LOGTARGET e:\logbackup     // 还原数据库并提取归档日志
DB2 RESTORE DATABASE sample LOGS FROM e:\dbbackup LOGTARGET e:\logbackup  // 仅提取归档日志
DB2 ROLLFORWARD DATABASE sample TO END OF LOGS AND STOP OVERFLOW LOG PATH(e:\logbackup)
DB2 v8.2后,执行数据库还原及前滚仅需1步(RECOVER=RESTORE+ROLLFORWARD)
DB2 RECOVER DATABASE sample TO END OF LOGS AND STOP OVERFLOW LOG PATH(e:\logbackup)


————徐前进(撰写于2016/04/05)


本文出自 “循序渐进” 博客,请务必保留此出处http://xuqianjin.blog.51cto.com/793256/1761412

关于Windows Server平台下实现DB2自动备份、复原和前滚的脚本


推荐阅读
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文介绍了Paxos的世界中关于复制日志与状态机的概念和重要性。通过存储日志来实现数据的持久化,并通过日志流来记录数据的变化,而不是直接持久化数据本身。这样做的好处是简化了持久化存储的操作,并且方便多机之间的数据同步。 ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 本文详细介绍了MysqlDump和mysqldump进行全库备份的相关知识,包括备份命令的使用方法、my.cnf配置文件的设置、binlog日志的位置指定、增量恢复的方式以及适用于innodb引擎和myisam引擎的备份方法。对于需要进行数据库备份的用户来说,本文提供了一些有价值的参考内容。 ... [详细]
  • 本文由编程笔记小编整理,介绍了PHP中的MySQL函数库及其常用函数,包括mysql_connect、mysql_error、mysql_select_db、mysql_query、mysql_affected_row、mysql_close等。希望对读者有一定的参考价值。 ... [详细]
  • 本文介绍了高校天文共享平台的开发过程中的思考和规划。该平台旨在为高校学生提供天象预报、科普知识、观测活动、图片分享等功能。文章分析了项目的技术栈选择、网站前端布局、业务流程、数据库结构等方面,并总结了项目存在的问题,如前后端未分离、代码混乱等。作者表示希望通过记录和规划,能够理清思路,进一步完善该平台。 ... [详细]
  • Linux如何安装Mongodb的详细步骤和注意事项
    本文介绍了Linux如何安装Mongodb的详细步骤和注意事项,同时介绍了Mongodb的特点和优势。Mongodb是一个开源的数据库,适用于各种规模的企业和各类应用程序。它具有灵活的数据模式和高性能的数据读写操作,能够提高企业的敏捷性和可扩展性。文章还提供了Mongodb的下载安装包地址。 ... [详细]
  • mysql-cluster集群sql节点高可用keepalived的故障处理过程
    本文描述了mysql-cluster集群sql节点高可用keepalived的故障处理过程,包括故障发生时间、故障描述、故障分析等内容。根据keepalived的日志分析,发现bogus VRRP packet received on eth0 !!!等错误信息,进而导致vip地址失效,使得mysql-cluster的api无法访问。针对这个问题,本文提供了相应的解决方案。 ... [详细]
  • 如何在php中将mysql查询结果赋值给变量
    本文介绍了在php中将mysql查询结果赋值给变量的方法,包括从mysql表中查询count(学号)并赋值给一个变量,以及如何将sql中查询单条结果赋值给php页面的一个变量。同时还讨论了php调用mysql查询结果到变量的方法,并提供了示例代码。 ... [详细]
  • 从Oracle安全移植到国产达梦数据库的DBA实践与攻略
    随着我国对信息安全和自主可控技术的重视,国产数据库在党政机关、军队和大型央企等行业中得到了快速应用。本文介绍了如何降低从Oracle到国产达梦数据库的技术门槛,保障用户现有业务系统投资。具体包括分析待移植系统、确定移植对象、数据迁移、PL/SQL移植、校验移植结果以及应用系统的测试和优化等步骤。同时提供了移植攻略,包括待移植系统分析和准备移植环境的方法。通过本文的实践与攻略,DBA可以更好地完成Oracle安全移植到国产达梦数据库的工作。 ... [详细]
  • 背景应用安全领域,各类攻击长久以来都危害着互联网上的应用,在web应用安全风险中,各类注入、跨站等攻击仍然占据着较前的位置。WAF(Web应用防火墙)正是为防御和阻断这类攻击而存在 ... [详细]
author-avatar
雄鹰访谈录
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有