设为首页 收藏本站
查看: 1476|回复: 0

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

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2016-4-8 14:21:46 | 显示全部楼层 |阅读模式
最近在参与负责某线上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. 编写备份脚本,具体内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
::关闭回显且不显示命令本身
@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. 编写映射脚本,具体内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
::关闭回显且不显示命令本身
@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. 编写拷贝脚本,具体内容如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
::关闭回显且不显示命令本身
@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. 编写还原及前滚脚本,具体内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
::关闭回显且不显示命令本身
@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. 编写清理脚本,具体内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
::关闭回显且不显示命令本身
@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. 编写清理脚本,具体内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
::关闭回显且不显示命令本身
@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)



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-201493-1-1.html 上篇帖子: 没有了 下篇帖子: DB2数据库日常命令(syscat命令) Windows
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表