【IT168 专稿】 使用联机备份的备份映像还原数据库,还原完成时需要进行前滚恢复,如果前滚所需的日志文件损坏或着被删除,将不能完成前滚恢复,数据库将不可用。DB2 V9在做联机备份时新增了INCLUDE LOGS选项,当指定此选项时,BACKUP实用程序将截断当前活动日志文件并将必要的日志扩展数据块集合复制到备份映像中。
联机备份时包含日志文件的方式在还原数据库时和以往有了很大不同,所以本文将对此进行详细的阐述,并通过实际的例子来帮助大家理解和提高。
简介
从DB2 V8.2就已经在联机备份时使用INCLUDE LOGS选项。在进行联机备份操作时,可以在BACKUP DATABASE命令中指定INCLUDE LOGS选项。当指定此选项时,BACKUP 实用程序将截断当前活动日志文件并将必要的日志扩展数据块集合复制到备份映像中。也就是说,备份映像中包含复原和恢复数据库所需的日志文件,不再需要单独的日志文件。数据库自己决定需要哪些日志文件来保证联机备份的一致性,并放到备份映像中,这为成功恢复提供了保证,以防止所需的日志文件损坏或被误删除。
时,通过使用RESTORE DATABASE命令的LOGTARGET选项,可以指定把备份映像中的日志文件放到什么位置。如果指定了LOGTARGET选项,在执行RESTORE DATABASE命令时,DB2将把日志文件放到指定的路径中,如果目标路径中已经存在同名的日志文件,复原操作将失败并返回一个错误。如果未指定LOGTARGET选项,则不会从备份映像中还原任何日志文件。
指定了LOGTARGET选项,但是备份映像中没有包含任何日志文件,则在尝试复原操作时会返回一个错误。如果指定了无效或只读的路径,复原操作会报SQL2581N错误。在指定LOGTARGET选项条件下 ,复原数据库或表空间的过程中,如果不能抽取一个或多个日志文件,则复原操作失败并返回错误。还可以选择只复原保存在备份映像中的日志文件。要执行此操作,可使用RESTORE DATABASE命令的LOGTARGET选项指定LOGS选项。以此方式复原日志文件时,如果复原操作遇到任何问题,则复原操作失败并返回错误。
联机备份时包含日志文件的方式在还原数据库时和以往有了很大不同,另外,DB2日志相关的一些参数也发生了变更,所以本文将对此进行详细的阐述,并通过实际的例子来帮助大家理解和提高。
我们将按照下列顺序介绍联机备份还原:
1. 创建示例数据库DB2TEST1,并把日志改成归档模式,并介绍一下DB2 V9新增的配置参数LOGARCHMETH1。创建示例表TEST1,并插入两条记录。
2. 联机全量备份数据库DB2TEST1,主要讲解一下备份命令的语法以及注意事项并实际演示一下如何联机全量备份数据库DB2TEST1,备份期间对示例表TEST1插入一条记录。
3. 使用联机全量备份映像恢复示例数据库DB2TEST1,并前滚恢复到日志末尾。
4. 修改示例数据库DB2TEST1配置参数TRACKMOD,使其允许跟踪数据库的更新。
5. 在增量模式下联机备份数据库:对示例表TEST1再次插入2条记录,并对示例数据库DB2TEST1进行联机备份;对示例表TEST1再插入两条记录,对示例数据库DB2TEST1进行联机增量备份;对示例表TEST1再插入两条记录,对示例数据库DB2TEST1进行联机差异备份。
6. 手工增量复原示例数据库DB2TEST1。
7. 自动增量复原示例数据库DB2TEST1。
创建示例数据库DB2TEST1
模拟环境,首先我们在WINDOWS XP环境下安装DB2 ESE V9.1,安装完成后,打开DB2CLP窗口,发出CREATE DATABASE语句,创建示例数据库DB2TEST1,具体如清单1所示:
- - 清单1 .创建示例数据库DB2TEST1 C:\> DB2 CREATE DATABASE DB2TEST1 DB20000I CREATE DATABASE命令成功完成。
执行成功,这样我们就创建了一个示例数据库DB2TEST1,数据库地域是中国(CN),数据库代码页是1386,数据库代码集是GBK。由于数据库默认情况是采用循环日志方式,在循环日志方式下,不能进行联机备份,所以我们需要把日志方式改成归档模式。在DB2CLP窗口中,连接示例数据库DB2TEST1,执行UPDATE DB CFG命令把LOGARCHMETH1参数改成“DISK:C:\DB2\”,具体如清单2所示。
- - 清单2 .修改示例数据库DB2TEST1的配置参数 C:\> db2 connect to db2test1 数据库连接信息 数据库服务器 = DB2 / NT 9.1.0 SQL 授权标识 = RHETTE 本地数据库别名 = DB2TEST1 C:\> DB2 UPDATE DATABASE CONFIGURATION USING LOGARCHMETH1 DISK:C:\DB2\ IMMEDIATE
DB20000I UPDATE DATABASE CONFIGURATION命令成功完成。
SQL1363W 为立即修改而提交的一个或多个参数未动态更改。对于这些配置参数,
必须在所有应用程序都与此数据库断开连接之后,更改才会生效。
执行成功,这样我们就把示例数据库DB2TEST1的日志模式改成了归档,并且归档方法使用手工归档的方法。如果是客户的生产环境使用了磁带机,当磁带管理软件是使用TSM的时候,由于TSM和DB2 V9进行了更深的结合,使用TSM进行日志的归档要比使用第三方厂商的产品效率要更高,管理更容易。如果归档日志是使用TSM放入到磁带机的话,可以直接修改LOGARCHMETH1参数,把其值修改成TSM,另外,在数据库配置参数中,提供了4个配置参数用来定义TSM的管理类等,分别是TSM管理类(TSM_MGMTCLASS)、TSM节点名(TSM_NODENAME)、TSM所有者(TSM_OWNER)和TSM密码(TSM_PASSWORD)。
TSM管理类(TSM_MGMTCLASS)配置参数是用来确定TSM服务器应如何管理正在备份的对象的备份版本。缺省缺省情况是没有DB2指定的管理类。当执行任何TSM备份时,在使用数据库配置参数指定的管理类之前,TSM 首先尝试将备份对象绑定到TSM客户机选项文件中的INCLUDE-EXCLUDE列表中指定的管理类。如果找不到匹配项,则将使用TSM服务器上指定的缺省TSM管理类。然后,TSM将备份对象重新绑定到数据库配置参数指定的管理类。因此,缺省管理类以及数据库配置参数指定的管理类必须包含备份副本组,否则备份操作将失败。
如果归档日志是使用TSM放入到磁带机的话,我们可以在DB2CLP窗口中,发出UPDATE DB CFG命令把配置参数LOGARCHMETH1参数改成TSM,具体如下:
C:\> DB2 UPDATE DATABASE CONFIGURATION USING LOGARCHMETH1 TSM IMMEDIATE
DB20000I UPDATE DATABASE CONFIGURATION命令成功完成。
假如客户的生产环境使用了磁带机,但磁带管理软件使用了第三方的存储管理软件,比如EMC LEGATO,如果想用LEGATO进行日志备份,可以这么修改数据库参数:
$ db2 update db cfg using logarchmeth1 vendor:/usr/lib/libnsrdb2.o
$ db2 update db cfg using logarchopt1 @DB2.cfg
在本文中,我们将使用手工归档的方式,所以我们执行了如清单2所示的命令,把LOGARCHMETH1改成了LOGRETAIN。
建议大家使用LOGARCHMETH1,此参数指定已归档日志的主要目标的介质类型,不要继续使用LOGRETAIN或USEREXIT参数。LOGARCHMETH1参数缺省值为OFF,取值范围可以是LOGRETAIN、USEREXIT、DISK、TSM或VENDOR。各自的含义如下:
? OFF
指定不使用日志归档方法。如果LOGARCHMETH1和LOGARCHMETH2都设置为 OFF,那么认为数据库正在使用循环日志记录,且不可前滚恢复。这是缺省值。
? LOGRETAIN
此值仅可用于LOGARCHMETH1,且等价于将 LOGRETAIN 配置参数设置为 RECOVERY。如果指定此值,将自动更新 LOGRETAIN 配置参数。
? USEREXIT
此值仅对LOGARCHMETH1有效,且等价于将 USEREXIT配置参数设置为 ON。如果指定此值,将自动更新 USEREXIT配置参数。
? DISK
此值后必须紧跟冒号(:),然后是现有标准路径名,日志文件将在其中归档。例如,如果将LOGARCHMETH1设置为 DISK:/u/dbuser/archived_logs,那么将归档日志文件放入名为 /u/dbuser/archived_logs的目录。
注: 如果正在归档至磁带,可以使用 db2tapemgr实用程序来存储和检索日志文件。
? TSM
如果指定不带任何附加配置参数,此值指示应该使用缺省管理类,将日志文件归档在本地 TSM 服务器上。如果此值后紧跟冒号(:)和 TSM 管理类,那么使用指定的管理类来归档日志文件。
? VENDOR
指定将使用供应商库来归档日志文件。此值后必须紧跟冒号(:)和库的名称。库中提供的 API 必须使用备份并复原供应商产品的 API。 注: 如果将LOGARCHMETH1或LOGARCHMETH2设置为 OFF 以外的值,那么必须配置数据库以进行前滚恢复。
如果更新 USEREXIT 或 LOGRETAIN 配置参数,将自动更新LOGARCHMETH1,反之亦然。然而,如果您要使用USEREXIT或LOGRETAIN, 必须将LOGARCHMETH2设置为 OFF。
清单2中的命令执行成功后,由于LOGARCHMETH1配置参数更改成功后,需要等数据库上所有的连接都断开后才会生效,所以我们在DB2CLP窗口中,发出FORCE APPLICATIONS ALL命令断开所有的连接,具体如清单3所示:
- - 清单3 .断开所有应用程序连接 C:\> DB2 FORCE APPLICATIONS ALL
成功后,用LIST APPLICATIONS看所有应用程序是否都断开了,如果没有断开,再重复执行FORCE APPLICATIONS ALL,保证所有连接都断开后,把数据库做一次全备。在我们首次把数据库的日志模式由循环模式改成归档模式后,数据库会处于BACKUP PENDING状态,强制我们进行一次全量备份,在全量备份完成之前,不能访问数据库或表空间。
下面我们在DB2CLP窗口中,发出BACKUP DB命令,全量备份示例数据库DB2TEST1,具体如清单4所示:
- - 清单4 .对示例数据库做一次全备
C:\> DB2 BACKUP DB DB2TEST1
备份成功。此备份映像的时间戳记是:20070928212852
完全备份成功后,这样我们就创建了一个测试库DB2TEST1,其使用归档日志,不允许增量备份。在DB2CLP窗口中,连接上示例数据库DB2TEST1,发出GET DB CFG命令查看其配置参数,可以看到LOGARCHMETH1配置参数已经被修改成功。具体如清单5所示:
- - 清单5.查看示例数据库配置参数
C:\> db2 connect to db2test1
数据库连接信息
数据库服务器 = DB2 / NT 9.1.0
SQL 授权标识 = RHETTE
本地数据库别名 = DB2TEST1
数据库 的数据库配置
数据库配置发行版级别 = 0x0b00
数据库发行版级别 = 0x0b00
数据库地域 = CN
数据库代码页 = 1386
数据库代码集 = GBK
数据库国家/地区代码 = 86
数据库整理顺序 = UNIQUE
备用整理顺序 ( ALT_COLLATE ) =
数据库页大小 = 4096
. . . . . . . . . . . . . . .
日志文件大小(4KB) ( LOGFILSIZ ) = 1024
主日志文件的数目 ( LOGPRIMARY ) = 13
辅助日志文件的数目 ( LOGSECOND ) = 4
已更改的至日志文件的路径 ( NEWLOGPATH ) =
日志文件路径 = C:\DB2\NODE0000\SQL00002\SQLOGDIR\
溢出日志路径 ( OVERFLOWLOGPATH ) =
镜像日志路径 ( MIRRORLOGPATH ) =
首个活动日志文件 = S0000001.LOG
磁盘上已满的块日志 ( BLK_LOG_DSK_FUL ) = NO
事务使用的最大主日志空间的百分比 ( MAX_LOG )= 0
1 个活动 UOW 的活动日志文件的数目 ( NUM_LOG_SPAN ) = 0
组落实计数 ( MINCOMMIT ) = 1
软检查点前回收的日志文件的百分比 ( SOFTMAX ) = 520
启用的恢复的日志保留 ( LOGRETAIN ) = OFF
启用的日志记录的用户出口 ( USEREXIT ) = OFF
HADR 数据库角色 = STANDARD
HADR 本地主机名 ( HADR_LOCAL_HOST ) =
HADR 本地服务名称 ( HADR_LOCAL_SVC ) =
HADR 远程主机名 ( HADR_REMOTE_HOST ) =
HADR 远程服务名称 ( HADR_REMOTE_SVC ) =
远程服务器的 HADR 实例名 ( HADR_REMOTE_INST ) =
HADR 超时值 ( HADR_TIMEOUT ) = 120
HADR 日志写同步方式 ( HADR_SYNCMODE ) = NEARSYNC
第一个日志归档方法 ( LOGARCHMETH1 ) = DISK:C:\DB2\
logarchmeth1 的选项 ( LOGARCHOPT1 ) =
第二个日志归档方法 ( LOGARCHMETH2 ) = OFF
logarchmeth2 的选项 ( LOGARCHOPT2 ) =
故障转移日志归档路径 ( FAILARCHPATH ) =
错误时重试日志归档次数 ( NUMARCHRETRY ) = 5
日志归档重试延迟(秒) ( ARCHRETRYDELAY ) = 20
供应商选项 ( VENDOROPT ) =
. . . . . . . . . . .
下面我们来创建一个示例表TEST1,表很简单,只有3个列,分别是编号(ID)、姓名(NAME)和备注(NOTE)。在DB2CLP窗口中,连接上示例数据库DB2TEST1,发出CREATE TABLE命令,创建示例表TEST1,创建成功后,插入两条记录,具体如清单6所示:
- - 清单6 .创建示例表TEST1
C:\> db2 connect to db2test1
数据库连接信息
数据库服务器 = DB2 / NT 9.1.0
SQL 授权标识 = RHETTE
本地数据库别名 = DB2TEST1
C:\> DB2 CREATE TABLE TEST1( ID INT , NAME VARCHAR ( 10 ) , NOTE VARCHAR ( 50 ) )
DB20000I SQL命令成功完成。
C:\> DB2 INSERT INTO TEST1 VALUES ( 1 , ' RHETTE ' , ' the first rows ' )
DB20000I SQL命令成功完成。
C:\> DB2 INSERT INTO TEST1 VALUES ( 2 , ' DANIEL ' , ' the second rows ' )
DB20000I SQL命令成功完成。
命令执行成功,这样我们就创建了示例表TEST1,表中有两条记录,下面我们来演示如何对示例数据库进行联机全量备份以及利用这个联机全量备份进行还原操作。
联机全量备份数据库DB2TEST1
我们可以使用带ONLINE选项的BACKUP命令,可以联机备份数据库,前提是我们使用了归档日志模式。由于联机备份期间,业务系统还可以插入、更新、删除数据,所以只用全量联机备份映像没有完成恢复数据库操作,至少还需要联机备份期间的日志以便进行前滚恢复,如果此时日志没有被妥善保存,比如被删除或损坏,那么前滚操作将无法完成。所以,为了妥善保存利用联机备份映像还原数据库时所需的日志文件,为成功恢复提供保护,我们可以在联机备份时使用INCLUDE LOGS选项,指定在备份映像中包括复原和恢复数据库所需的日志文件。也就是说,如果使用联机备份映像进行恢复时,无需单独查找所需的日志文件以保证联机备份的一致性,在联机备份中已经存在了所需的日志文件。当执行BACKUP DB命令时指定INCLUDE LOGS选项,BACKUP实用程序将截断当前活动日志文件并将必要的日志扩展数据库集合复制到备份映像中。
下面我们来看一下BACKUP命令的语法,具体如清单7所示:
- - 清单7 .备份数据库语法
>> - BACKUP--+-DATABASE-+--database-alias- - - - - - - - - - - - - - - - - -- - - - - - - - - - - - >
' – DB - - - - - - - -- - - '
> -- +- - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - -- - - - - - - >
' – USER – username -- + - - - - - - - - - + - '
' – USING – password- '
> -- + - - - - - - - - - - -- - - - - - - - - - - - - - - - - - + -- + - - - - - -- - - + - - - - - - - - - >
| . - , - - - - - - . | ' – ONLINE - '
| V | |
'– TABLESPACE-- (---- tablespace-name-+-- )- '
> -- +- - - - - - - - - - - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - >
'– INCREMENTAL--+- - +- '
'- DELTA- '
> -- + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - - - - - - - - - - - - - - -+ - - >
+ -USE--+-TSM--+-- + - - - - - - - - - - - - - - - - - - - - + -- + - - - - - - - - - - - - - - + - - -- - +
| '-XBSA-' '-OPTIONS--+-"options-string"-+-' '-OPEN--num-sessions--SESSIONS-' |
| ' -@ -- file-name- - - ' |
| . - , - - - - . |
| V | |
+ -TO ---- + -dir-+-+ - - - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - - - - - - - - - - - +
| ' -dev- ' |
'-LOAD--library-name--+ - - - - - - - - - - - - - - - - - - - +--+ - - - - - - - - - - - - - - - - - + - '
'-OPTIONS--+-"options-string"-+-' '-OPEN--num-sessions--SESSIONS-'
' -@-- file-name --- '
> -- + - - - - - - - - - - - - - -- - - - + -- + - - - - - - - - - - - - - - - - + - - - - - - - - - - - >
' – WITH --num-buffers--BUFFERS- ' ' -BUFFER--buffer-size- '
> -- + - - - - - - - - - - - - -- - - - + - - - - - - - - -- - - - - - - - - - - - - - - - >
' – PARALLELISM – n - '
> -- + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - >
' – COMPRESS -- + - - - - - - - - - - - - - -- - - + -- + - - - - - - - - -- - - - + - '
' -COMPRLIB—name-- + - - - + - ' ' -COMPROPTS--string- '
' – EXCLUDE - '
.-EXCLUDE LOGS-.
> -- + - - - - - - - - - - - - - - - - - - - - - - - - - + -- + - - - - - - - -- - - - - - - - - + - >
' -UTIL_IMPACT_PRIORITY -- + - - - - - - - - + - ' ' -INCLUDE LOGS- '
' – priority - '
> -- + - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ><
' - WITHOUT PROMPTING - '
如清单7所示,备份数据库最简单的命令就是
BACKUP DB 数据库名
如果联机备份,可以使用ONLINE选项,想包含联机备份期间需要的日志可以使用INCLUDE LOGS选项。可以把数据库备份到磁盘或者
磁带上,如果
存储管理
软件使用的TSM,可以直接在备份命令中使用USE TSM选项,如果使用的第三方存储管理软件,可以使用LOAD选项指定第三方供应商的DLL。
接下来我们新打开一个DB2CLP窗口,连上数据库,发出带ONLINE选项的BACKUP DB命令,联机全量备份示例数据库DB2TEST1,具体如清单8所示:
- - 清单8 .联机备份示例数据库DB2TEST1
C:\> db2 connect to db2test1
数据库连接信息
SQL 授权标识 = RHETTE
本地数据库别名 = DB2TEST1
C:\> db2 backup db db2test1 online include logs
备份成功。此备份映像的时间戳记是:20070928223032
在联机备份数据库期间(备份没有完成之前),我们继续对示例数据库DB2TEST1进行操作,在原来的DB2CLP窗口中对TEST1表新插入一条记录,具体如清单9所示:
- - 清单9 .插入测试表一条新的记录
C:\> DB2 INSERT INTO TEST1 VALUES ( 3 , ' SCA ' , ' the third rows ' )
DB20000I SQL命令成功完成。
联机全量备份执行成功,此备份映像的时间戳记是:20070928223032。想查看示例数据库DB2TEST1的备份和还原历史情况,可以使用LIST HISTORY BACKUP ALL命令,对于备份情况返回值来说,其类型N代表在线全备,O代表在线增量备,E代表在线差异备份,类型F代表脱机全备,I代表脱机增量备份,D代表脱机差异备份。
下面我们在DB2CLP窗口中,发出LIST HISTORY BACKUP ALL命令,返回两条记录,第一条记录是我们第一次脱机第一次全备,第二条是我们刚才联机全量备份,且联机备份映像中包含了日志S0000001.LOG,具体如清单10所示:
- - 清单10 .查看备份历史记录
C:\> DB2 LIST HISTORY BACKUP ALL FOR DB2TEST1
列示 DB2TEST1 的历史记录文件
匹配的文件条目数 = 2
Op 对象时间戳记+序列 类型设备最早日志 当前日志 备份标识
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
B D 20070928212852001 F D S0000000.LOG S0000000.LOG
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
包含 3 表空间:
00001 SYSCATSPACE
00002 USERSPACE1
00003 SYSTOOLSPACE
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
注释:DB2 BACKUP DB2TEST1 OFFLINE
开始时间:20070928212852
结束时间:20070928212856
状态:A
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
EID:2 位置:C:
Op 对象时间戳记+序列 类型设备最早日志 当前日志 备份标识
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
B D 20070928223032001 N D S0000001.LOG S0000001.LOG
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
包含 3 表空间:
00001 SYSCATSPACE
00002 USERSPACE1
00003 SYSTOOLSPACE
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
注释:DB2 BACKUP DB2TEST1 ONLINE
开始时间:20070928223032
结束时间:20070928223037
状态:A
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
EID:5 位置:C:
联机备份如果采用TSM,其命令可以如下:
db2 backup db db2test1 online use tsm open 4 sessions include logs
其中,USE TSM是关键字,表示备份映像将通过TSM保存到
磁带机上,OPEN 4 SESSIONS表示,此次备份打开4个SESSION,表现为备份映像(假如正常情况下只备份映像能放在一个文件中)将使用4个备份映像文件存储。如果想使用TSM,在需要预先配置好TSM环境,这样数据库管理器才能使用TSM选项:
必须安装和配置可用的 TSM客户机和
服务器。另外,必须在每台DB2服务器上安装 TSM客户机 API。
设置TSM客户机API使用的环境变量:DSMI_DIR、DSMI_CONFIG、DSMI_LOG。
设置TIVOLI客户机与TSM服务器交互所使用的密码。具体见DB2官方文档。
另外,使用TIVOLI STORAGE MANAGER时还需要注意,对于多个备份映像使用同一个数据库别名的情况,时间戳记和序号就成为标准名称中的专有部分。需要查询TSM以确定要使用的备份版本。如果执行联机备份操作并指定了USETSM选项和INCLUDELOGS选项,则当两个进程尝试同时写同一台磁带机时,就会发生死锁。如果正在将磁带机用作日志和备份映像的存储设备,则需要为TSM定义两个独立的磁带池,一个用于存储备份映像,另一个用于存储归档日志。
如果实现第三方备份软件,比如EMC LEGATO,备份命令可以如下:
db2 backup db db2test1 online load /usr/lib/libnsrdb2.o open 4 sessions include logs
LOAD选项后面跟的是EMC LEGATO的DLL文件,OPEN 4 SESSIONS表示,此次备份打开4个SESSION,表现为备份映像(假如正常情况下只备份映像能放在一个文件中)将使用4个备份映像文件存储。
当执行备份操作时,DB2将自动为缓冲区个数、缓冲区大小和并行性设置选择非常好的值。此类值根据可用实用程序堆内存量、可用处理器数和数据库配置而定。目的是最大程度上减少完成备份操作所需的时间。除非为下列BACKUPDATABASE命令参数显式地输入某个值,否则DB2将为其选择一个值: WITH缓冲区个数BUFFERS
PARALLELISMn
BUFFER缓冲区大小
如果未指定缓冲区数和缓冲区大小而导致DB2设置这些值,对大型数据库的影响应该是最低的。但是,对于小型数据库来说,会导致备份映像大幅增大。即使写入磁盘的最后一个数据缓冲区只包含很少数据,也会将整个缓冲区写入映像。在小型数据库中,这表示相当一部分的映像可能是空的。还可以选择执行以下任何操作来缩短完成一次备份操作所需的时间:
指定表空间备份。
使用指定了TABLESPACE选项的BACKUPDATABASE命令,可以备份(继而恢复)部分数据库。这样便于对表数据、索引和单独表空间中的长型字段或大对象(LOB)数据进行管理。
增大BACKUPDATABASE命令上PARALLELISM参数的值,以使它反映正在备份的表空间数。
PARALLELISM参数定义在压缩备份操作期间从数据库读取数据和压缩数据时,已启动的进程或线程数。将每个进程或线程分配给特定表空间,因此,为PARALLELISM参数指定的值大于要备份的表空间数并无益处。备份完此表空间后,它会请求另一个表空间。但是应注意:每个进程或线程都需要内存CPU开销。
增加备份缓冲区大小。
理想的备份缓冲区大小是表空间扩展数据块大小的倍数加一页。如果有多个扩展数据块大小不同的表空间,则将值指定为扩展数据块大小的公倍数加一页。
增加缓冲区的数量。
使用的缓冲区至少是备份目标(或会话)的两倍,以确保备份目标设备无需等待数据。
使用多个目标设备。
利用联机全量备份恢复示例数据库DB2TEST1
利用联机备份映像文件恢复数据库,需要用到联机备份期间相关的日志文件,如果没有这些日志文件,整个恢复过程将不能完成。由于我们在联机数据库备份时使用INCLUDE LOGS选项,所以在联机全量备份映像文件中包含了联机备份期间相关的日志文件。要从备份映像复原日志文件,可使用RESTORE DATABASE命令的LOGTARGET选项,并指定存在于DB2
服务器上的标准路径。然后,复原数据库实用程序将日志文件从映像写至目标路径。如果目标路径中已存在名称相同的日志文件,复原操作将失败并返回一个错误。如果未指定 LOGTARGET选项,则不会从备份映像中复原任何日志文件。如果指定 LOGTARGET选项,且备份映像不包含任何日志文件,则在尝试复原任何表空间数据之前,将返回一个错误。如果指定无效或只读路径,复原操作也将失败。在指定 LOGTARGET选项条件下,复原数据库或表空间的过程中,如果不能抽取一个或多个日志文件,则复原操作失败并返回错误。还可以选择只复原保存在备份映像中的日志文件。要执行此操作,可使用 RESTORE DATABASE命令的LOGTARGET选项指定LOGS选项。以此方式复原日志文件时,如果复原操作遇到任何问题,则复原操作失败并返回错误。
下面我们来利用之前的联机备份映像(时间戳为20070928223032)进行还原。在资源管理器中,打开示例数据库DB2TEST1的活动日志目录C:\DB2\NODE0000\SQL00002\SQLOGIDR\(想查看示例数据库DB2TEST1的活动日志目录,可以使用GET DB CFG看到),删除所有的日志文件(注意,生产系统不能删除活动日志,否则数据库会宕机)。本示例是为了演示如何还原数据库,删除日志后随即执行还原,为了更清晰的看到如何利用备份文件中的日志进行还原,故删除了以前的活动日志。
在DB2CLP窗口中发出带LOGTARGET选项的RESTORE DATABASE命令,并指定把备份映像中的日志文件放到C:\DB2\NODE0000\SQL00002\SQLOGIDR\中,具体如清单11所示:
- - 清单 11 .利用联机备份映像还原示例数据库DB2TEST1
C:\> db2 restore db db2test1 taken at 20070928223032 logtarget C:\DB2\NODE0000\SQL00002\SQLOGDIR
SQL2539W 警告!正在复原至与备份映像数据库相同的现有数据库。数据库文件将被删除。
要继续吗?( y / n ) y
DB20000I RESTORE DATABASE命令成功完成。
如清单11所示,还原的过程中,会提示“正在复原至与备份映像数据库相同的现有数据库。数据库文件将被删除。是否要继续?”这时候选择y,也就是“是”的意思,回车。命令成功完成,这样就把备份映像中的S0000001.LOG日志文件释放到了C:\DB2\NODE0000\SQL00002\SQLOGIDR\目录中。由于归档日志情况下的利用联机备份映像还原必须进行前滚恢复,所以接下来我们进行前滚恢复,在DB2CLP窗口中发出ROLLFORWARD DB命令,具体如清单12所示:
- - 清单 12 .对示例数据库DB2TEST1进行前滚恢复
C:\> db2 rollforward db db2test1 to end of logs and stop
前滚状态
输入数据库别名 = db2test1
节点数已返回状态 = 1
节点号 = 0
前滚状态 = 未暂挂
下一个要读取的日志文件 =
已处理的日志文件 = S0000001.LOG - S0000001.LOG
上次落实的事务 = 2007-09-28-14.30.36.000000 UTC
DB20000I ROLLFORWARD命令成功完成。
命令成功完成,可以看到,在前滚过程中,对S0000001.LOG已经进行了前滚。
此时在DB2CLP窗口中,连接上示例数据库DB2TEST1,发出SELECT语句,查看示例表TEST1,可以看到我们在联机备份时插入的数据,名称为“SCA”的记录已经成功恢复,具体如清单13所示:
- - 清单 13 .查看示例表TEST1
C:\> DB2 CONNECT TO DB2TEST1
数据库连接信息
SQL 授权标识 = RHETTE
本地数据库别名 = DB2TEST1
C:\> DB2 SELECT * FROM TEST1
ID NAME NOTE
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1 RHETTE the first rows
2 DANIEL the second rows
3 SCA the third rows
3 条记录已选择。
至此,我们成功的利用联机备份映像还原了示例数据库DB2TEST1,总结一下,整个过程如下:
在归档日志模式下,对数据库发出带ONLINE和INCLUDE LOG选项的BACKUP DATABASE命令,联机全量备份示例数据库DB2TEST1,备份映像中包含联机备份期间相关的日志。
利用带LOGTARGET选项的RESTORE DATABASE命令,使用联机备份映像恢复示例数据库DB2TEST1,并把日志文件中的日志文件解压到示例数据库DB2TEST1的活动日志目录中。
利用前滚恢复滚动到日志末尾完成最后的操作。
修改示例数据库DB2TEST1配置参数,以允许增量备份
由于一般客户的生产系统数据量都很大,所以频繁的进行数据库或表空间的全量备份在空间
存储上变的不可行,DB2支持两种增量的备份,一种是增量备份(CUMULATIVE BACKUP),另一种是差异备份(DELTA BACKUP)。总的来说,增量的备份(包括增量备份和差异备份),在其备份映像文件中,只包含自上次进行备份以来有过更新的页,
除更新的数据和索引页之外,每个增量备份映像还包含通常存储在完全备份映像中的初始数据库元数据(例如,数据库配置、表空间定义和数据库历史记录等等)。增量备份和差异备份的区别在于所谓的上次备份的类型不同,比如增量备份只备份自上次全备以后发生过变化的页,而差异备份则备份自上次任何种备份(可能是全量备份、增量备份、差异备份)以来的变化。为了启用对数据库更新的跟踪,需要打开数据库的TRACKMOD配置参数,也就是把其值改成YES,默认是NO。当此参数设置为“YES”时,数据库管理器跟踪数据库修订, 以便BACKUP实用程序可以检测到数据库页的哪些子集必须通过增量备份来检查并可能包括在备份映像中。在将此参数设置为“YES”之后,必须执行全数据库备份,才能获得可以对其执行增量备份的基线。并且,若启用此参数并创建了一个表空间,则必须执行包含该表空间的备份。此备份可以是数据库备份,也可以是表空间备份。在执行备份之后,将允许执行增量备份来包含此表空间。
下面我们在DB2CLP窗口中,发出UPDATE DB CFG命令,将配置参数TRACKMOD改成YES(也就是ON),以配置数据库允许增量备份操作,具体如清单14所示:
- - 清单 14 .更改示例数据库配置参数,以便允许增量备份
C:\> db2 update db cfg using trackmod on
DB20000I UPDATE DATABASE CONFIGURATION命令成功完成。
SQL1363W 为立即修改而提交的一个或多个参数未动态更改。对于这些配置参数,必须在所有应用程序都与此数据库断开连接之后,更改才会生效。
更改成功后,由于数据库配置参数TRACKMOD不会立即生效,需要在所有应用程序都与示例数据库DB2TEST1断开连接之后,更改才会生效,所以我们在DB2CLP窗口,通过发出FORCE APPLICATIONS ALL命令,断开所有的应用程序连接,具体如清单15所示:
- - 清单15 .断开所有应用程序连接
C:\> DB2 FORCE APPLICATIONS ALL
DB20000I FORCE APPLICATION命令成功完成。
DB21024I 该命令为异步的,可能不会立即生效。
命令成功后,由于FORCE APPLICATIONS ALL命令是异步的,所以可能还有应用程序没有停下来,所以用LIST APPLICATIONS看所有应用程序是否都断开了,如果没有断开,再重复执行FORCE APPLICATIONS ALL,保证断开后,再把数据库做一次全备,具体如清单16所示。
- - 清单 16 .对示例数据库做一次全备
C:\> DB2 BACKUP DB DB2TEST1
备份成功。此备份映像的时间戳记是:20070929091920
命令执行成功,备份完成后,这样我们就启用了对示例数据库DB2TEST1更新的跟踪。
在DB2CLP窗口中,再次连接上示例数据库DB2TEST1,发出GET DB CFG命令查看其数据库配置参数,可以看到TRACKMOD配置参数已经被修改成功。具体如清单17所示:
- - 清单17 .查看示例数据库配置参数
C:\> db2 connect to db2test1
数据库连接信息
SQL 授权标识 = RHETTE
本地数据库别名 = DB2TEST1
C:\> db2 get db cfg for db2test1
数据库db2test1的数据库配置
数据库配置发行版级别 = 0x0b00
数据库发行版级别 = 0x0b00
数据库地域 = CN
数据库代码页 = 1386
数据库代码集 = GBK
数据库国家/地区代码 = 86
数据库整理顺序 = UNIQUE
备用整理顺序 ( ALT_COLLATE ) =
数据库页大小 = 4096
. . . . . . . . . . . . . . .
更改的页阈值 ( CHNGPGS_THRESH ) = 80
异步页清除程序的数目 ( NUM_IOCLEANERS ) = AUTOMATIC
I / O 服务器的数目 ( NUM_IOSERVERS ) = AUTOMATIC 索引排序标志 ( INDEXSORT ) = YES
顺序检测标志 ( SEQDETECT ) = YES
缺省预取大小(页) ( DFT_PREFETCH_SZ ) = AUTOMATIC
跟踪修改的页数 ( TRACKMOD ) = ON
. . . . . . . . . . . . . . .
至此我们修改示例数据库DB2TEST1配置参数成功,示例数据库DB2TEST1使用归档日志,允许增量备份。
在增量模式下联机备份示例数据库DB2TEST1(联机备份、增量备份、差异备份)
DB2 V9引入了自动备份功能。由于大量发生硬件或
软件故障,数据库可能会变得不可用。自动数据库备份功能减轻了 DBA 的数据库备份管理任务,它始终会确保在需要时对数据库执行
最新的完全备份,需要注意的是,自动备份是完全备份,不是增量备份或差异备份。自动备份的前提是自动数据库备份(AUTO_DB_BACKUP)数据库配置参数和自动维护功能(AUTO_MAINT)数据库配置参数
被打开。如果对数据库启用了前滚恢复(归档日志记录),则可以对联机备份或脱机备份启用自动数据库备份功能。否则,只能进行脱机备份。本文对此不做重点介绍,大家如果想深入的了解,可以看IBM的官方文档。
联机全量备份就是对当前数据库做一次完全的备份,备份期间,其他应用程序可以访问数据库,如果想使用联机备份映像文件进行恢复,需要使用联机备份期间相关的日志文件,现在可以在联机备份的时候指定INCLUDE LOGS指定备份映像文件中包含相关的日志文件。通过全量备份,可以把数据库完全恢复到备份时的状况。联机备份和脱机备份不同,脱机备份时,备份实用程序独占连接,其他应用程序不能访问数据库,联机备份时则不然。但利用脱机备份进行还原,对日志文件的需求不是必须的,而利用联机备份映像进行恢复时,对相关的日志文件是一定需要的。
联机增量备份是对当前数据库自从上次成功完全备份后的更新情况全部备份下来,同样,份期间,其他应用程序可以访问数据库。通常,可以使用联机全量备份和联机增量备份相结合的方式,更好的指定备份策略,很多客户在实际的操作过程中,比较少的用到差异备份。一般来说,如果
存储空间允许的话,使用联机全量备份加联机增量备份,在手工还原数据库的时候,执行的步骤比较少,只需要还原3次就可以了(用到一个联机全量备份映像和一个联机增量备份映像,还原的次数是备份映像文件的个数加1)。
联机差异备份是对当前数据库自从上次成功备份(不管是全量备份、增量备份还是差异备份)后更新的情况全部备份下来,同样,份期间,其他应用程序可以访问数据库。通常,结合使用差异备份,对存储空间的需求会更小,对备份的频率可以更快,但对数据库的还原操作相应复杂了一些,当然,如果还原时使用自动还原(指定了AUTOMATIC参数的RESTORE),操作也十分简单。
如上面所述,联机增量备份和联机差异备份的区别在于,对连续不断更改的对象进行持续备份时,它们的行为不同。每个连续增量映像都包含了前一个增量映像的完整内容以及自上一次生产完全备份后更改过的或新增的任何数据。差异备份映像只包含自上次生成任何类型的映像后更改过的页。
接下来我们将分别对示例数据库 DB2TEST1分别进行联机备份、增量备份和差异备份。首先,我们在DB2CLP窗口对TEST1表新插入两条记录,具体如清单18所示:
- - 清单18 .插入测试表两条新的记录
C:\> DB2 INSERT INTO TEST1 VALUES ( 4 , ' Danaus ' , ' the forth rows ' )
DB20000I SQL命令成功完成。
C:\> DB2 INSERT INTO TEST1 VALUES ( 5 , ' Martin ' , ' the fifth rows ' )
DB20000I SQL命令成功完成。
命令执行成功,接下来我们在DB2CLP窗口中,发出BACKUP DB ONLINE命令,联机全量备份示例数据库DB2TEST1,具体如清单19所示:
- - 清单19 .联机备份示例数据库DB2TEST1
C:\> db2 backup db db2test1 online include logs
备份成功。此备份映像的时间戳记是:20070929094546
联机全备成功后,备份映像的时间戳为20070929094546。后面我们做恢复数据库操作的时候将会用到这个备份映像。
接下来我们再在DB2CLP窗口连上示例数据库DB2TEST1,在TEST1表新插入两条记录,主要是对示例表通过插入数据的方式,使表产生一些变化。在做增量备份的时候,好捕获这些变化。插入记录的情况具体如清单20所示:
- - 清单20 .插入测试表两条新的记录
C:\> db2 connect to db2test1
数据库连接信息
SQL 授权标识 = RHETTE
本地数据库别名 = DB2TEST1
C:\> DB2 INSERT INTO TEST1 VALUES ( 6 , ' Scott ' , ' the sixth rows ' )
DB20000I SQL命令成功完成。
C:\> DB2 INSERT INTO TEST1 VALUES ( 7 , ' slave ' , ' the seventh rows ' )
DB20000I SQL命令成功完成。
命令执行成功。现在我们来增量备份示例数据库DB2TEST1,把数据库最新的修改记录备份下来,在DB2CLP窗口中,发出带INCREMENTAL选项的BACKUP DB命令,具体如清单21所示:
- - 清单21 .增量备份示例数据库DB2TEST1
C:\> DB2 BACKUP DB DB2TEST1 ONLINE INCREMENTAL INCLUDE LOGS
备份成功。此备份映像的时间戳记是:20070929094818
增量备份成功完成,备份映像的时间戳是20070929094818。
增量备份映像是自从上次最新的、成功的完全备份操作以来,更改过的所有数据库数据的副本。也称为累积备份映像,因为进行的一系列增量备份中的每一个都会有上次增量备份映像的内容。增量备份映像的前身通常是同一对象最新的、成功的完全备份。 我们本次增量备份的前身是是我们上次的联机全备,备份映像时间戳是20070929094546。在此增量备份中,记录了刚才我们插入的两条记录,ID为6和7。
下面我们再在DB2CLP窗口连上示例数据库DB2TEST1,在TEST1表新插入两条记录,具体如清单22所示:
- - 清单22 .插入测试表两条新的记录
C:\> db2 connect to db2test1
数据库连接信息
SQL 授权标识 = RHETTE
本地数据库别名 = DB2TEST1
C:\> DB2 INSERT INTO TEST1 VALUES ( 8 , ' New York ' , ' the eighth rows ' )
DB20000I SQL命令成功完成。
C:\> DB2 INSERT INTO TEST1 VALUES ( 9 , ' Houston ' , ' the ninth rows ' )
DB20000I SQL命令成功完成。
命令成功完成,现在我们来差异备份示例数据库DB2TEST1,把数据库最新的修改记录备份下来,在DB2CLP窗口中发出带INCREMENTAL DELTA选项的BACKUP DB命令,具体如清单23所示:
- - 清单23 .增量备份示例数据库DB2TEST1
C:\> DB2 BACKUP DB DB2TEST1 ONLINE INCREMENTALDELTA INCLUDE LOGS
备份成功。此备份映像的时间戳记是:20070929095249
备份成功。此备份映像的时间戳记是:20070929095249。
差异备份映像或增量差异备份映像是自从上次相关表空间的成功备份(包括完整、增量或差异备份)以来,已更改过的所有数据库数据的副本。也称为差异备份映像或非累积备份映像。差异备份映像的前身是最新的成功备份,包括差异备份映像中每个表空间的备份。本次差异备份映像的前身是上次的增量备份,其时间戳是20070929094818。里面包含我们刚才插入的两条记录,ID分别是8和9。
如果想查看数据库的历史备份还原情况,可以使用带有LIST HISTORY BACKUP ALL命令,对于备份映像信息来说,类型N代表在线全备,O代表在线增量备,E代表在线差异备份, 类型F代表脱机全备,I代表脱机增量备份,D代表脱机差异备份。
下面我们在DB2CLP窗口中,用LIST HISTORY命令查看备份历史情况,在返回结果中能看到我们联机备份映像(时间戳20070929094546)中包含了日志S0000008.LOG。联机增量备份映像(时间戳20070929094818)中包含了日志S0000010.LOG。联机差异备份映像(时间戳20070929095249)中包含了日志S0000012.LOG。具体如清单24所示:
- - 清单24 .查看备份历史记录
C:\> db2 list history backup all for db2test1
列示 db2test1 的历史记录文件
匹配的文件条目数 = 11
. . . . . . . . . . . . . .
Op 对象时间戳记+序列 类型设备最早日志 当前日志 备份标识
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
B D 20070929094546001 N D S0000008.LOG S0000008.LOG
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
包含 3 表空间:
00001 SYSCATSPACE
00002 USERSPACE1
00003 SYSTOOLSPACE
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
注释:DB2 BACKUP DB2TEST1 ONLINE
开始时间:20070929094546
结束时间:20070929094550
状态:A
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
EID:20 位置:C:
Op 对象时间戳记+序列 类型设备最早日志 当前日志 备份标识
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
B D 20070929094818001 O D S0000010.LOG S0000010.LOG
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
包含 3 表空间:
00001 SYSCATSPACE
00002 USERSPACE1
00003 SYSTOOLSPACE
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
注释:DB2 BACKUP DB2TEST1 ONLINE
开始时间:20070929094818
结束时间:20070929094819
状态:A
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
EID :23 位置:C :
Op 对象时间戳记+序列 类型设备最早日志 当前日志 备份标识
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
B D 20070929095249001 E D S0000012.LOG S0000012.LOG
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
包含 3 表空间:
00001 SYSCATSPACE
00002 USERSPACE1
00003 SYSTOOLSPACE
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
注释:DB2 BACKUP DB2TEST1 ONLINE
开始时间:20070929095249
结束时间:20070929095250
状态:A
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
EID:26 位置:C :
至此,我们对示例数据库DB2TEST1启用了增量跟踪(TRACKMOD配置参数打开),分别做了联机全量备份、联机增量备份和联机差异备份,在备份之前,都分别插入了不同的值。下面我们将分别讲述使用手工和自动两种不同方式恢复示例数据库DB2TEST1,以及中间需要注意的事项
手工增量复原示例数据库DB2TEST1
假如备份映像有N个,我们一般会执行N+1次复原才能完成整个复原操作。在手工复原期间,用户必须对复原涉及的每个映像手工发出复原命令,按照以下顺序完成此操作:最后一个、第一个、第二个、第三个,依次类推,并且包括最后一个映像。
首先对时间点最靠后(是按照时间轴的方向往后,靠近现在的时间方向是后)的增量备份映像进行复原操作,此映像也被称为增量复原的目标映像,因为它还要成为要复原的最后映像。增量目标映像是使用RESTORE DATABASE命令中的TAKEN AT参数指定的。接下来复原最新的完整数据库或表空间映像以建立一个基线,以根据它来应用每个后继的增量备份映像。 按产生的顺序,在复原的基线映像的顶部,复原需要的各个完整增量备份映像或表空间增量备份映像。依次对各个映像进行复原,直到最后一个备份映像读了两次。在整个增量复原操作期间会访问两次目标映像。在第一次访问期间,只从映像读取初始数据,而不读取任何用户数据。只在第二次访问期间才读取并处理完整的映像。必须访问两次增量复原操作的目标映像,以确保数据库最初是使用正确的历史记录、数据库配置以及将在复原操作期间创建的数据库表空间定义来配置的。如果自从进行了最初的完整数据库备份映像以来已删除了表空间,将从备份映像中读取该映像的表空间数据,但在增量复原处理期间会忽略该数据。
下面我们采用手工的方式复原示例数据库DB2TEST1,所使用的备份映像有
l 联机备份映像(时间戳20070929094546),包含了日志文件S0000008.LOG。
l 联机增量备份映像(时间戳20070929094818),包含了日志文件S0000010.LOG。
l 联机差异备份映像(时间戳20070929095249),包含了日志文件S0000012.LOG。
在DB2CLP窗口中,因为最后一个增量备份映像是联机差异备份映像(时间戳为20070929095249),所以我们将首先对差异备份映像执行复原操作,通过使用RESTORE DATABASE命令的TAKEN AT timestamp选项来指定目标映像。首先进入到C:\DB2\NODE0000\SQL00002\SQLOGIDR\中,此路径是示例数据库DB2TEST1的活动日志目录。在此目录下,删除所有的日志文件。注意,生产系统不能删除活动日志,否则数据库会宕机。本示例是为了演示如何还原数据库,删除日志后随即执行还原,为了更清晰的看到如何利用备份文件中的日志进行还原,故删除了以前的活动日志。通过使用RESTORE DATABASE命令进行复原,具体如清单25所示:
- - 清单25 .手工增量复原第一步,对最后一个备份映像进行复原
C:\> db2 restore db db2test1 incremental taken at 20070929095249 logtarget C:\DB2\NODE0000\SQL00002\SQLOGDIR
SQL2539W 警告!正在复原至与备份映像数据库相同的现有数据库。数据库文件将被删除。
要继续吗?( y / n ) y
DB20000I RESTORE DATABASE命令成功完成。
如清单25所示,还原的过程中,会提示“正在复原至与备份映像数据库相同的现有数据库。数据库文件将被删除。是否要继续?”这时候选择y,也就是“是”的意思,回车。在命令中需要注意INCREMENTAL选项,此选项表示我们进行的复原是增量复原。另外,LOGTARGET选项,指定从备份映像文件(时间戳为20070929095249)导出日志文件到此路径中。如果指定了LOGTARGET选项,在执行RESTORE DATABASE命令时,DB2将把日志文件放到指定的路径中,如果目标路径中已经存在同名的日志文件,复原操作将失败并返回一个错误。如果未指定LOGTARGET选项,则不会从备份映像中还原任何日志文件。
如果指定了LOGTARGET选项,但是备份映像中没有包含任何日志文件,则在尝试复原操作时会返回一个错误。如果指定了无效或只读的路径,复原操作会报SQL2581N错误。在指定LOGTARGET选项条件下,复原数据库或表空间的过程中,如果不能抽取一个或多个日志文件,则复原操作失败并返回错误。还可以选择只复原保存在备份映像中的日志文件。要执行此操作,可使用RESTOREDATABASE命令的LOGTARGET选项指定LOGS选项。以此方式复原日志文件时,如果复原操作遇到任何问题,则复原操作失败并返回错误。
下面我们对联机全量备份映像(时间戳20070929094546)进行复原操作,在DB2CLP窗口中,发出RESTORE DB命令,具体如清单26所示:
- - 清单26 .手工增量复原第二步,对第一个备份映像进行复原
C:\> db2 restore db db2test1 incremental taken at 20070929094546 logtarget C:\DB2\NODE0000\SQL00002\SQLOGDIR
DB20000I RESTORE DATABASE命令成功完成。
命令成功完成,这样就把联机备份映像中的S0000008.LOG日志文件释放到了C:\DB2\NODE0000\SQL00002\SQLOGIDR\目录中。RESTORE语句中的INCREMENTAL作用同上,还是表示增量复原的意思。
执行完对第一个备份映像的复原后,紧接着需要对第二个备份映像进行复原,我们第二个备份映像是联机增量备份映像(时间戳为20070929094818)。在DB2CLP窗口中,继续发出RESTORE DB命令,具体如清单27所示:
- - 清单27 .手工增量复原第三步,对第二个备份映像进行复原
C:\> db2 restore db db2test1 incremental taken at 20070929094818 logtarget C:\DB2\NODE0000\SQL00002\SQLOGDIR
SQL2580W 警告!将这些日志复原至包含现有日志文件的路径。在复原期间试图覆盖现有日志文件将导致复原操作失败。
要继续吗?( y / n ) y
DB20000I RESTORE DATABASE命令成功完成。
命令成功完成,如清单27所示,在还原的过程中,会提示“SQL2580W警告!将这些日志复原至包含现有日志文件的路径。在复原期间试图覆盖现有日志文件将导致复原操作失败。是否要继续?”这时候选择Y,也就是“是”的意思,回车。
这样就把联机备份映像中的S0000010.LOG日志文件释放到了C:\DB2\NODE0000\SQL00002\SQLOGIDR\目录中。
当对第二个备份映像复原完成后,接着就需要对第三个、第四个,...最后一个备份映像进行复原,由于我们第三个备份映像就是最后一个备份映像,所以我们在DB2CLP窗口中,发出RESTORE DB命令,对差异备份映像(时间戳20070929095249)进行复原操作,具体如清单28所示:
- - 清单28 .手工增量复原第四步,对第三个备份(也是最后一个)映像进行复原
C:\> db2 restore db db2test1 incremental taken at 20070929095249 logtarget C:\DB2\NODE0000\SQL00002\SQLOGDIR
SQL2580W 警告!将这些日志复原至包含现有日志文件的路径。在复原期间试图覆盖现有日志文件将导致复原操作失败。
要继续吗?( y / n ) y
DB20000I RESTORE DATABASE命令成功完成。
命令成功完成,如清单28所示,还原的过程中,会提示“SQL2580W 警告!将这些日志复原至包含现有日志文件的路径。在复原期间试图覆盖现有日志文件将导致复原操作失败。是否要继续?”这时候选择y,也就是“是”的意思,回车。
这样就把联机备份映像中的S0000012.LOG日志文件释放到了C:\DB2\NODE0000\SQL00002\SQLOGIDR\目录中。由于归档日志情况下的利用联机备份映像还原必须进行前滚恢复,所以接下来我们对示例数据库DB2TEST1进行前滚恢复。
在DB2CLP窗口中发出ROLLFORWARD DB命令,把日志往前滚动到日志的末尾,具体如清单29所示:
- - 清单 29 .对示例数据库DB2TEST1进行前滚恢复
C:\> db2 rollforward db db2test1 to end of logs and stop
前滚状态
输入数据库别名 = db2test1
节点数已返回状态 = 1
节点号 = 0
前滚状态 = 未暂挂
下一个要读取的日志文件 =
已处理的日志文件 = S0000012.LOG - S0000013.LOG
上次落实的事务 = 2007-09-29-01.52.49.000000 UTC
DB20000I ROLLFORWARD命令成功完成。
至此,对示例数据库DB2TEST1的复原工作全部完成。一共执行了4次恢复命令,使用了3个备份映像(联机全量备份映像、联机增量备份映像、联机差异备份映像)。实际上,我们在生产环境指定策略的时候,一般会在一个比较长的时间点进行全量备份,在一个相对较长的时间点进行增量备份,在一个比较短的时间点进行差异备份。比如,我们可以每个月底的最后一天晚上进行全量备份,每个月的月中进行增量备份,每天晚上进行差异备份,这样既保证了数据库的数据
安全,又保证了不会占用太多的
存储空间来保存备份映像文件。
在实际的复原过程中,如果在中间的步骤碰上错误,可以发出指定了INCREMENTALABORT选项的RESTOREDATABASE命令。这将清除所有余下的资源,以便以后可以继续手工增量复原。
此时我们在DB2CLP窗口中,连接上示例数据库DB2TEST1,查看示例表TEST1,可以看到我们在差异备份之前插入的数据所有记录都已经成功恢复,具体如清单30所示:
- - 清单 30 .查看示例表TEST1
C:\> db2 connect to db2test1
数据库连接信息
SQL 授权标识 = RHETTE
本地数据库别名 = DB2TEST1
C:\> db2 select * from test1
ID NAME NOTE
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1 RHETTE the first rows
2 DANIEL the second rows
3 SCA the third rows
4 Danaus the forth rows
5 Martin the fifth rows
6 Scott the sixth rows
7 slave the seventh rows
8 New York the eighth rows
9 Houston the ninth rows
9 条记录已选择。
自动增量复原示例数据库DB2TEST1
如果在复原时指定AUTOMATIC选项,则将对数据库进行自动复原工作。对我们来说,只要执行一次复原操作就可以了,实际上是数据库管理器帮我们自动完成了像手工复原数据库的那么多操作。对于自动增量复原,只在指定要使用的目标映像(最后一个的映像)时发出带AUTOMATIC选项的RESTORE命令一次。然后,DB2使用数据库历史记录来确定余下的必需备份映像并复原它们。
下面我们采用自动的方式复原示例数据库DB2TEST1,所使用的备份映像有:
l 联机备份映像(时间戳20070929094546),包含了日志S0000008.LOG。
l 联机增量备份映像(时间戳20070929094818),包含了日志S0000010.LOG。
l 联机差异备份映像(时间戳20070929095249),包含了日志S0000012.LOG。
首先进入到C:\DB2\NODE0000\SQL00002\SQLOGIDR\中,此路径是示例数据库DB2TEST1的活动日志目录。在此目录下,删除所有的日志文件。注意,生产系统不能删除活动日志,否则数据库会宕机。本示例是为了演示如何还原数据库,删除日志后随即执行还原,为了更清晰的看到如何利用备份文件中的日志进行还原,故删除了以前的活动日志。
因为最后一个增量备份映像是联机差异备份映像(时间戳20070929095249),所以我们将首先对差异备份映像执行复原操作,在DB2CLP窗口中,通过使用RESTORE DATABASE命令的TAKEN AT timestamp选项来指定目标映像,并使用INCREMENTAL AUTOMATIC选项来进行自动增量复原,具体如清单31所示:
- - 清单 31 .自动增量复原示例数据库DB2TEST1
C:\> db2 restore db db2test1 incremental automatic taken at 20070929095249
SQL2539W 警告!正在复原至与备份映像数据库相同的现有数据库。数据库文件将被删除。
要继续吗?( y / n ) y
DB20000I RESTORE DATABASE命令成功完成。
命令成功完成,如清单31所示,还原的过程中,会提示“正在复原至与备份映像数据库相同的现有数据库。数据库文件将被删除。是否要继续?”这时候选择y,也就是“是”的意思,回车。至此复原工作就已经做完了,接下来我们需要对示例数据库做前滚恢复操作。为了进行前滚恢复,需要从我们的3个备份映像中分别恢复日志文件。
可以用复原命令选择只复原保存在备份映像中的日志文件。要执行此操作,可使用RESTORE DATABASE命令的LOGTARGET选项指定LOGS选项。以此方式复原日志文件时,如果复原操作遇到任何问题,则复原操作失败并返回错误。
首先从联机全量备份映像(时间戳20070929094546)中提取日志文件S0000008.LOG,我们在DB2CLP窗口中,发出RESTORE DATABASE命令,并对LOGTARGET选项指定LOGS选项,使得复原命令不执行复原操作,只是单纯的从备份映像文件中提取日志文件,具体如清单32所示:
- - 清单 32 .从备份映像中提取日志文件
C:\> db2 restore db db2test1 logs incremental taken at 20070929094546 logtarget C:\DB2\NODE0000\SQL00002\SQLOGDIR
DB20000I RESTORE DATABASE命令成功完成。
命令成功完成,这样就把联机备份映像中的S0000008.LOG日志文件释放到了C:\DB2\NODE0000\SQL00002\SQLOGIDR\目录中。
下面我们接着从联机增量备份映像(时间戳20070929094818)中提取日志文件S0000010.LOG,我们在DB2CLP窗口中,发出RESTORE DATABASE命令,并对LOGTARGET选项指定LOGS选项,使得复原命令不执行复原操作,只是单纯的从备份映像文件中提取日志文件,具体如清单33所示:
- - 清单33 .从备份映像中提取日志文件
C:\>db2 restore db db2test1 logs incremental taken at 20070929094818 logtarget C:\DB2\NODE0000\SQL00002\SQLOGDIR
SQL2580W 警告!将这些日志复原至包含现有日志文件的路径。在复原期间试图覆盖现有日志文件将导致复原操作失败。
要继续吗?( y / n ) y
DB20000I RESTORE DATABASE命令成功完成。
如清单33所示,还原的过程中,会提示“SQL2580W 警告!将这些日志复原至包含现有日志文件的路径。在复原期间试图覆盖现有日志文件将导致复原操作失败。是否要继续?”这时候选择Y,也就是“是”的意思,回车。命令成功完成,这样就把联机备份映像中的S0000010.LOG日志文件释放到了C:\DB2\NODE0000\SQL00002\SQLOGIDR\目录中。
下面我们再从联机差异备份映像(时间戳20070929095249)中提取日志文件S0000010.LOG,我们在DB2CLP窗口中,发出RESTORE DATABASE命令,并对LOGTARGET选项指定LOGS选项,使得复原命令不执行复原操作,只是单纯的从备份映像文件中提取日志文件,具体如清单34所示:
- - 清单34 .从备份映像中提取日志文件
C:\> db2 restore db db2test1 logs incremental taken at 20070929095249 logtarget C:\DB2\NODE0000\SQL00002\SQLOGDIR
SQL2580W 警告!将这些日志复原至包含现有日志文件的路径。在复原期间试图覆盖现有日志文件将导致复原操作失败。
要继续吗?( y / n ) y
DB20000I RESTORE DATABASE命令成功完成。
如清单34所示,还原的过程中,会提示“SQL2580W 警告!将这些日志复原至包含现有日志文件的路径。在复原期间试图覆盖现有日志文件将导致复原操作失败。是否要继续?”这时候选择y,也就是“是”的意思,回车。命令成功完成,这样就把联机备份映像中的S0000012.LOG日志文件释放到了C:\DB2\NODE0000\SQL00002\SQLOGIDR\目录中。
由于归档日志情况下的利用联机备份映像还原必须进行前滚恢复,所以接下来我们进行前滚恢复,在DB2CLP窗口中发出ROLLFORWARD DATABAE命令,具体如清单35所示:
- - 清单35 .对示例数据库DB2TEST1进行前滚恢复
C:\> db2 rollforward db db2test1 to end of logs and stop
前滚状态
输入数据库别名 = db2test1
节点数已返回状态 = 1
节点号 = 0
前滚状态 = 未暂挂
下一个要读取的日志文件 =
已处理的日志文件 = S0000012.LOG - S0000014.LOG
上次落实的事务 = 2007-09-29-13.40.25.000000 UTC
DB20000I ROLLFORWARD命令成功完成。
至此,对示例数据库DB2TEST1的恢复工作全部完成。
下面我们在DB2CLP窗口中,连接上示例数据库DB2TEST1,查看示例表TEST1,可以看到我们在差异备份之前插入的数据所有记录都已经成功恢复,具体如清单36所示:
- - 清单 36 .查看示例表TEST1
C:\> db2 connect to db2test1
数据库连接信息
SQL 授权标识 = RHETTE
本地数据库别名 = DB2TEST1
C:\> db2 select * from test1
ID NAME NOTE
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1 RHETTE the first rows
2 DANIEL the second rows
3 SCA the third rows
4 Danaus the forth rows
5 Martin the fifth rows
6 Scott the sixth rows
7 slave the seventh rows
8 New York the eighth rows
9 Houston the ninth rows
9 条记录已选择。
我们在备份、复原以及前滚的过程中,可是使用LISTUTILITIES命令来监控数据库上的备份、复原和前滚操作。
比如,对示例数据库DB2TET1,我们打开一个新的DB2CLP窗口,在这个窗口中连上示例数据库DB2TEST1,发出BACKUP DB命令,对示例数据库DB2TEST1做一次全备,具体如清单37所示:
- - 清单 37 . 全备示例数据库DB2TEST1
C:\> db2 connect to db2test1
数据库连接信息
SQL 授权标识 = RHETTE
本地数据库别名 = DB2TEST1
C:\>db2 backup db db2test1
备份成功。此备份映像的时间戳记是:20071023111253
在清单37中所示的全备完成之前,我们在另外一个DB2CLP窗口中,发出LISTUTILITIES命令并指定SHOWDETAIL选项,可以查看数据库的备份情况,具体如清单38所示:
- - 清单 38 . 使用LISTUTILITIES命令来监控数据库上的备份、复原和前滚操作
C:\> db2 list utilities show detail
标识 = 1
类型 = BACKUP
数据库名称 = DB2TEST1
分区号 = 0
描述 = offline db
开始时间 = 2007-10-23 11:13:13.485742
状态 = 执行
调用类型 = 用户
调速:
优先级 = 未调速
进度监视:
估计的完成百分比 = 5
总计工作 = 43216142 bytes
已完成的工作 = 2087158 bytes
开始时间 = 2007-10-23 11:13:13.505956
对于备份操作,将指定要处理的最初估计字节数。随备份操作进度更新要处理的字节数。显示的字节与映像的大小不相等,不应该用作备份映像大小的估计值。视映像是增量备份,还是压缩备份而定,实际映像可能小很多。
对于复原操作,将不给定任何最初的估计值。而是指定UNKNOWN。因为从映像中读取每个缓冲区,所以将会更新实际读取的字节量。对于其中可能复原多个映像的自动增量复原操作,将使用阶段来跟踪进度。每个阶段提供一个从增量链中复原的映像。最初,只有显示一个阶段。复原第一个映像之后,将显示阶段的总数。在复原每个映像时,将根据已处理的字节数来更新完成的阶段数。
对于崩溃恢复和前滚恢复,将有两个进度监控阶段:FORWARD和BACKWARD。FORWARD阶段期间中,读取日志文件并将日志记录应用于数据库。对于崩溃恢复,通过使用起始日志序号至最后一个日志文件的结尾来估计工作总量。对于前滚恢复,当此阶段开始时,将工作总量估计值指定为UNKNOWN。按字节计的已处理工作量将随进程的继续而更新。
在BACKWARD阶段中,回滚FORWARD阶段期间中应用任何未落实的更改。将提供按字节计的需处理日志数据量的估计值。按字节计的已处理工作量将随进程的继续而更新。
参考资料
学习
获得产品和技术