深入了解IBM DB2数据库的备份与恢复
深入了解IBM DB2数据库的备份与恢复
注:以下数据库备份与恢复的试验环境均为 Windows XP + IBM DB2 V9 企业版,同样的语句也在 AIX 5.2 + IBM DB2 V8.2 环境下验证通过)。
一、数据库备份的重要性
在信息日趋发达的时代,数据显得尤其重要。如何保障数据的完整性和安全性呢?如何避免数据灾难事故的发生呢?数据库备份作为数据安全和完整最有利保障手段的重要性就不言而喻了。
数据库备份的重要性主要体现在:
1、提高系统的高可用性和灾难可恢复性;(在数据库系统崩溃的时候,没有数据库备份怎么办!)
2、使用数据库备份还原数据库是数据库系统崩溃时提供数据恢复最小代价的最优方案;(总不能让客户重新填报数据吧!)
3、没有数据就没有一切,数据库备份就是一种防范灾难于未然的强力手段;
4、对于DBA来说,最首要也是最重要的任务就是数据库备份。
二、 DB2 数据库备份的方式与分类
1、按照数据库备份对数据库的使用影响来划分
A、联机备份(也称热备份或在线备份)
B、脱机备份(也称冷备份或离线备份)
说明:联机备份和脱机备份最大的不同在于:联机备份数据库时,数据库仍然可以供用户使用,而脱机备份数据库则不行。脱机备份数据库时,必须断开所有与数据库有连接的应用后才能进行。
2、按照数据库的数据备份范围来划分
A、完全备份
B、增量备份
说明:完全备份数据库是指备份数据库中的所有数据,而增量备份只是备份数据库中的部分数据。至于增量备份到底备份哪些数据,稍候会提到。
3、增量备份的两种实现方式
A、增量备份(也称累计备份)
B、delta备份
说明:这两种备份方式的严格定义如下,
增量备份是自最近成功的完全备份以来所有更改的数据的备份。
delta 备份则是上一次成功的完全、增量或 delta 备份以后所做更改的数据的备份。 这里请读者们仔细的看上面两个增量备份方式的定义,注意这两种备份方式的细微差别。这里我们举一个例子来说明。
假设有一个数据库,它每天都有部分数据在发生变化。我们星期一晚上对该数据库做了一次完全备份,星期二晚上对该数据库做了一次增量备份A(注:这里的增量备份是指累计备份,下同),星期三晚上又做了一次增量备份B,星期四则做了一次delta 备份。
那么,我们可以得出以下结论:
星期一的数据库备份包含了所有的数据。
星期二没有变动过的数据没有发生备份,在星期二变动过的数据会备份,并且备份到增量备份A中。
星期三的备份中含有自星期一完全备份以来发生过变动的所有数据,包含了星期二和星期三发生过变动的数据。显然,增量备份A 被 增量备份 B 包含。
星期四做的是delta备份,注意,它会也只会备份自星期三备份之后变动过的数据。 三、 DB2 备份文件的结构介绍
在不同的操作系统下,DB2 的备份文件的结构是不同的,这里概要地介绍一下。
1、Windows 操作系统下的数据库备份文件结构:
说明:Windows 操作系统下的数据库备份文件是嵌套在一系列文件夹之下的特殊结构。上例中,D:\DB2_Train 是指备份目录,TESTDB.0 是指数据库名称为 TESTDB,DB2 是指实例名称,NODE0000 是指节点名称,CATN0000 是指编目名称,20070801 是指备份发生的年月日,形如YYYYMMDD,181241是指备份发生的时间,精确到秒,也就是指 18 点 12 分 41 秒,形如HHMMSS,最后的 001 则是备份文件的一个序列号。
2、 Unix 操作系统下的数据库备份文件结构:
说明:Unix 操作系统下的数据库备份文件就是一个文件。上例中,HTDC 是指数据库名称,db2inst1 是指实例名称,NODE0000 是指节点名称,CATN0000 是指编目名称,20070310002357 是指备份发生的具体时间,形如YYYYMMDDHHMMSS,同样地,它的时间精确到秒,也就是指 2007年3月10日0点23分57秒发生备份,最后的 001 则是备份文件的一个序列号。
四、 DB2 数据库备份实验(附完整命令脚本清单)
4.1 DB2 数据库实验准备工作
(1)、创建测试数据库 TestDB
db2 create database testdb on /db2test using codeset gbk territory cn ; (2)、创建数据库管理表空间 Data_SP(注意路径,如果没有请创建)
db2 "create regular tablespace datasp1 pagesize 4k managed by database using (file '/db2test/usrdata2.dbf' 5120) BUFFERPOOL IBMDEFAULTBP";
说明:上面的脚本创建了一个名为 Data_SP 的数据库管理表空间,该表空间使用的缓冲池为 IBMDEFAULTBP,存储路径为 /testdb/,存储文件名为userdata1,大小为 25600 * 4K = 10M,页大小为 4K。
(3)、创建测试表 TestTable 并插入测试数据
db2 "create table test1 (id integer not null,name varchar(10),primary key(id)) in datasp"
--插入测试数据
INSERT INTO Test1 VALUES(1,'测试表成功');
说明:建立测试表并插入数据是为了稍候验证数据库恢复的时候用的。
脚本清单
--Step1:完全备份数据库(脱机,备份时间戳记为 20080520151706)
db2 backup db testdb to /db2test/db2bak
--Step2:模拟灾难,强制删除数据库
db2 drop db testdb
--Step3:根据该数据库完全备份还原数据库
db2 restore db testdb from /db2test/db2bak taken at 20080520151706
脚本清单:
--数据库增量备份以及还原实验
--修改数据库参数 TrackMod ,使之支持数据库进行增量备份
db2 connect to testdb;
update db cfg using logretain on;
update db cfg using trackmod on;
db2stop force;
db2start;
--更改参数后必须完全离线备份数据库(脱机,备份时间戳记为 20071121153818)
db2 backup db testdb to /db2test/db2bak
--开始增量备份(脱机,备份时间戳记为 20071121154006)
--插入测试数据
$ db2 "insert into test1 values(2,'aa')"
$ db2 "insert into test1 values(3,'ccc')"
$ db2 backup db testdb incremental to /db2test/db2bak
--开始增量Delta备份(脱机,备份时间戳记为 20071121154006)
--插入测试数据
$ db2 "insert into test1 values(4,'444')"
db2 backup db testdb incremental delta to /db2test/db2bak
--删除数据库,模拟数据灾难
db2 drop db TestDB
--首先还原至完全离线备份状态
db2 create db testdb on /db2test using codeset gbk territory cn
db2 restore db testdb from /db2test/db2bak taken at 20080520152859
--还原至增量离线备份状态
db2 restore db TestDB incremental automatic from /db2test/db2bak taken at 20080520153503
--还原至增量DELta离线备份状态
db2 restore db TestDB incremental automatic from /db2test/db2bak taken at 20080520153755
--注意:上述语句中,有一个 automatic ,它表示无论有多少个增量备份,系统将全自动检索恢复数据库的顺序并自动恢复数据库。如果没有 automatic ,则需要多次手动恢复数据库,很麻烦而且容易出错。
--Step3:根据该数据库完全备份还原数据库
db2 restore db testdb from /db2test/db2bak taken at 20080520152859
--还原数据库后查询测试表数据检验数据是否恢复成功
4.4 DB2 数据库联机机备份与恢复实验
说明:联机备份数据库可以使数据库在备份的同时仍然保持在可用状态。要让数据库支持联机备份,必须更改数据库的日志归档方式。在脱机备份模式下,数据库采用循环日志方式记录数据库日志,在联机备份模式下,数据库则采用归档日志的方式备份数据库日志。另外,对于联机备份的数据库来说,活动日志和归档日志就很重要了,一定要经常备份、保存。 脚本清单:
--数据库联机备份以及还原实验
--连接至数据库并插入测试数据
db2 connect to TestDB
--插入测试数据
INSERT INTO TestTable(Message)
VALUES('开始联机数据库备份测试--完全备份');
--修改数据库参数,使之支持在线联机备份
db2 update db cfg for TestDB using logretain on trackmod on
--执行增量、在线备份之前必须执行离线全备份一次,否则数据库将处于备份暂挂的不可用状态
--(联机完全备份,时间戳记:20071121160548)
db2 backup db TestDB
--连接至数据库并插入测试数据
db2 connect to TestDB
--插入测试数据
INSERT INTO TestTable(Message)
VALUES('开始联机数据库备份测试--增量备份');
--执行联机备份,备份同时再打开一个会话,模拟应用在线(联机增量备份,时间戳记:20071121152922)
db2 backup db TestDB online incremental to D:\DB2_Train
--模拟灾难,删除数据库!
--重要,此前一定要将活动日志文件备份至另一个路径,保存好,本例中,活动日志保存在 C:\db2admin 下。
db2 drop db TestDB
--根据在线完全备份恢复数据库
db2 restore db TestDB from D:\DB2_Train taken at 20071121160548
--根据在线增量备份恢复数据库
db2 restore db TestDB incremental automatic from D:\DB2_Train taken at 20071121152922
--恢复后的数据库处于前滚暂挂的不可用状态
db2 connect to TestDB
--前滚数据库,并指定归档日志位置,重要!
db2 ROLLFORWARD DATABASE TESTDB TO END OF LOGS AND COMPLETE OVERFLOW LOG PATH ("C:\db2admin")
4.5把te 1.获建立TES 检查命令db 2.准问题db2 db2d 执行 SQ sp 有重/db2会SQ in (状态3.建的错 $ d $ d $ d $ d $ d 使用开始$ db 特别结果4.一ge #roll 5 DB2 数estdb 数据库的获得备份文件立"/db2test/db STDB.0.db2in 查备份文件是令行执行
b2ckbkp -h T 准备还原testd 题,需要建立restore db te demo redirect 行上面命令后QL1205N Th pecified is no 有两种方式修z 设置代z 创建d Db2 cr 新执行db22test/db2demo 会出现如下信QL1277N R naccessible, o 中文解释:S 态设置为“必建立tablespac 错误.就把表空db2 "set tables db2 "set tables db2 "set tables db2 "set tables db2 "set tables 用list tablesp 始恢复,这个过b2 restore db t 别注意:这里果:DB20000I 一般不需要做et db cfg f lforward db t 数据库备的脱机备份恢的详细信息b2bak"文件夹nst1.NODE00是否可用
TESTDB.0.db db 数据库到新立db2demo)
estdb from /d t
后出现以下提he code page t valid.
修改
代码页为数据db2demo 空数reate db db2d 2 restore d o into db2dem 信息
Restore has d or has set their SQL1277N 复须定义存储ce 复制上面空间准备好了space contain space contain space contain space contain space contain aces 查看当前过程才真正开testdb continu 里写数据库名 The RESTO 前滚执行
for db2test |gr testdb stop
备份与重定恢复到目标机,做好文件准夹,直接拷贝离000.CATN00b2inst1.NODE 新数据库db2db2test/db2ba 提示
e "1386" and/o 据库默认819 数据库
demo on /db2t db testdb fr mo redirect
detected that o r state to 'stor 复原已检测到储器”。)
的命令,并改了.
ners for 0 usin ners for 1 usin ners for 2 usin ners for 3 usin ners for 4 usin 前表空间状况开始往表空间ue
是源数据库ORE DATAB rep LOG
定向恢复器的/db2dem 备并检查备份离线备份时备000.20080520E0000.CATN 2demo(db2de ak taken at 2or territory co Db2 db2code test/db2demo rom /db2tes one or more t rage must be 到一个或多个改其中的红色ng (path '/db2ng (path '/db2ng (path '/db2ng (file '/db2t ng (file '/db2t 况,检验一下.
间中写入数据名称,而不是BASE comma 复实验
mo 目录中,并且份是否可用
备份文件:
0151706.001
N0000.200805emo 一般不要20080520151ode "1" that h epage=819
o using codes t/db2bak tak table space co defined'.
个表空间容器数字,直到执2test/db2dem 2test/db2dem 2test/db2dem test/db2demo test/db2demo . 据:
是目标数据库and complete 且重命名为d 520151706.0要预先建立,
1706 to /db2t has been
et gbk territo ken at 200ontainers are 器不可存取,执行到"表空间mo/ts0')" mo/ts1')"
mo/ts2')"
o/usr1.dbf' 51o/usr2.dbf' 51名称.
d successfully
db2demo
01
除非出现代test/db2demo ory cn
08052015170
或者已将它间标识无效" 20)" 20)" y. 码级o into 6 to 们的之类
4.6把te
1.获建立TES 检查命令db
2.准问题db2 db2d 执行 SQ sp 有
重/db2会SQ in (状态
3.建的错 $ d $ d $ d $ d $ d
使用开始$ db 特别6 DB2 数estdb 数据库的获得备份文件立"/db2test/db STDB.0.db2in 查备份文件是令行执行
b2ckbkp -h T 准备还原testd 题,需要建立restore db te demo redirect 行上面命令后QL1205N Th pecified is no 有两种方式修z 设置代z 创建d Db2 cr 新执行db22test/db2demo 会出现如下信QL1277N R naccessible, o 中文解释:S 态设置为“必建立tablespac 错误.就把表空db2 "set tables db2 "set tables db2 "set tables db2 "set tables db2 "set tables 用list tablesp 始恢复,这个过b2 restore db t 别注意:这里数据库联的联机备份恢的详细信息b2bak"文件夹nst1.NODE00是否可用
TESTDB.0.db db 数据库到新立db2demo)
estdb from /d t
后出现以下提he code page t valid.
修改
代码页为数据db2demo 空数reate db db2d 2 restore d o into db2dem 信息
Restore has d or has set their SQL1277N 复须定义存储ce 复制上面空间准备好了space contain space contain space contain space contain space contain aces 查看当前过程才真正开testdb continu 里写数据库名联机备份与恢复到目标机,做好文件准夹,直接拷贝离000.CATN00b2inst1.NODE 新数据库db2db2test/db2ba 提示
e "1386" and/o 据库默认819 数据库
demo on /db2t db testdb fr mo redirect
detected that o r state to 'stor 复原已检测到储器”。)
的命令,并改了.
ners for 0 usin ners for 1 usin ners for 2 usin ners for 3 usin ners for 4 usin 前表空间状况开始往表空间ue
是源数据库与重定向器的/db2dem 备并检查备份离线备份时备000.20080521E0000.CATN 2demo(db2de ak taken at 2or territory co Db2 db2code test/db2demo rom /db2tes one or more t rage must be 到一个或多个改其中的红色ng (path '/db2ng (path '/db2ng (path '/db2ng (file '/db2t ng (file '/db2t 况,检验一下.
间中写入数据名称,而不是向恢复实mo 目录中,并且份是否可用
备份文件:
1150228.001
N0000. 20080emo 一般不要20080521150ode "1" that h epage=819
o using codes t/db2bak tak table space co defined'.
个表空间容器数字,直到执2test/db2dem 2test/db2dem 2test/db2dem test/db2demo test/db2demo . 据:
是目标数据库验
且重命名为d 0521150228.0要预先建立,
0228 to /db2t has been
et gbk territo ken at 200ontainers are 器不可存取,执行到"表空间mo/ts0')" mo/ts1')"
mo/ts2')"
o/usr1.dbf' 51o/usr2.dbf' 51名称.
db2demo 001
除非出现代test/db2demo ory cn
08052015170
或者已将它间标识无效" 20)" 20)" 码级o into 6 to 们的之类
结果:DB20000I The RESTORE DATABASE command completed successfully.
4.一般不需要做前滚执行
$ db2 get db cfg for db2demo |grep LOG
Catalog cache size (4KB) (CATALOGCACHE_SZ) = (MAXAPPLS*4)
Log buffer size (4KB) (LOGBUFSZ) = 8
Log file size (4KB) (LOGFILSIZ) = 1000
Number of primary log files (LOGPRIMARY) = 3
Number of secondary log files (LOGSECOND) = 2
Changed path to log files (NEWLOGPATH) =
Path to log files = /db2test/db2demo/db2inst1/NODE0000/SQL00001/SQLOGDIR/
Overflow log path (OVERFLOWLOGPATH) =
Mirror log path (MIRRORLOGPATH) =
First active log file = S0000011.LOG
Block log on disk full (BLK_LOG_DSK_FUL) = NO
Percent of max active log space by transaction(MAX_LOG) = 0
Num. of active log files for 1 active UOW(NUM_LOG_SPAN) = 0
Log retain for recovery enabled (LOGRETAIN) = RECOVERY
将日志文件群拷贝到路径(Path to log files)中,这些日志应该包含
S0000011.LOG之后的所有文件,接着执行下面命令
# db2 rollforward db db2demo to end of logs and complete
五. 综述
对于数据库管理人员或者维护人员来说,数据库崩溃和灾难其实并不可怕,可怕的是在发生数据库崩溃和灾难的时候没有数据库备份。希望通过本文的学习,可以让大家对数据库备份的重要性有一个更深的认识。(
如何获取 DB2 表空间前滚操作所需的最小恢复时间戳记
对于启用了前滚恢复方式(使用归档日志模式)的 DB2 数据库,如果备份操作是在联机方式下完成的,当需要进行表空间集的恢复操作时,在执行了 RESTORE 命令之后,还必须执行 ROLLFORWARD 命令以前滚表空间完成其恢复操作。为保证表空间前滚操作的成功,前滚的时间点必须大于或等于表空间前滚操作所需的最小恢复时间戳记,这里提供了三种获取该时间戳记的方法:
1. 当前滚命令所给的时间戳小于最小恢复时间戳记时,前滚命令将无法进行,并提示前滚最小恢复时间戳,如:
db2 "rollforward db sample to 2005-05-28-12 using local time tablespace (userspace1)" SQL1275N 前滚的停止时间必须大于或等于 "2006-05-28-00.23.21.000000",因为节点 "0" 上的数据库 "SAMPLE" 中包含比指定时间更新的信息。
该命令的返回信息表明 USERSPACE1 表空间完成前滚操作的最小恢复时间戳必须大于或等于2006-05-28-00.23.21.000000。由于前滚命令中使用了USING LOCAL TIME,该时间戳记即为本地时间。
2. 通过查询 SNAPSHOT_TBS_CFG 表函数中 MIN_RECOVERY_TIME 字段的值,返回表空间前滚最小恢复时间戳(为本地时间):
db2 "select substr(tablespace_name,1,15) as tablespace_name, min_recovery_time from table (snapshot_tbs_cfg('TESTDB',-1) ) as a"
TABLESPACE_NAME MIN_RECOVERY_TIME
--------------- --------------------------
SYSCATSPACE -
TEMPSPACE1 -
USERSPACE1 2006-05-28-00.23.21.000000
SYSTOOLSPACE 2006-05-12-13.02.11.000000
4 条记录已选择。
其中 USERSPACE1 表空间的前滚最小恢复时间戳为“2006-05-28-00.23.21.000000”。
3. 通过表空间的快照输出,获取其前滚最小恢复时间戳记(为标准世界时(Coordinated Universal Time,UTC)),如:
db2 get snapshot for tablespaces on sample
表空间名 = USERSPACE1
表空间标识 = 2
......
最小恢复时间= 2006-05-27 16:23:21.000000
将返回的最小恢复时间戳加上 8 个小时,转换为本地时间戳记,同样为 2006-05-28 00.23.21.000000,与上述两种方法返回的结果一致。