DB2 恢复到指定时间点
作者:zlj2208
修改日期:2010年4月24日
转载请注明转自http://zlj2208.cublog.cn/
在日常工作中,时候有在维护数据的时候因为误操作或者其他原因导致数据库中的数据丢失。比如删除了数据库中的某个表,DB2数据库可以恢复到制定的时间点,我们只要找出删除数据的时间点,将数据恢复到删除时间点之前,就可恢复这个表了。
下面我们来做个实验,将数据库恢复到指定时间点。
准备工作:
启用归档日志
db2 update db cfg for testdb using LOGRETAIN ON
db2 update db cfg for testdb using USEREXIT ON
启用增量备份
db2 update db cfg for testdb using TRACKMOD on
1. 做数据的全备份
命令:
db2 backup db online include logs
操作步骤:
F:\db2backup\test>db2 backup db testdb online include logs 备份成功。此备份映像的时间戳记是:20100424180911 F:\db2backup\test>dir TESTDB.0.DB2.NODE0000.CATN0000.20100424180911.001 驱动器 F 中的卷是 data2 卷的序列号是 1848-45E8 F:\db2backup\test 的目录 2010-04-24 18:09 110,407,680 TESTDB.0.DB2.NODE0000.CATN0000.20100424180911.001 1 个文件 110,407,680 字节 0 个目录 37,943,844,864 可用字节 |
2. 模拟事故
1). 连接数据库
命令:
建表、修改表结构、插入数据等
db2 connect to
2). 建表、修改表结构、插入数据等
db2 CREATE TABLE TEST(ID INTEGER , NAME VARCHAR(10))
db2 ALTER TABLE TEST ALTER COLUMN id SET NOT NULL
db2 REORG TABLE TEST
db2 ALTER TABLE TEST ADD PRIMARY KEY (ID)
db2 REORG TABLE TEST
db2 INSERT INTO TEST VALUES (1,'a1')
db2 INSERT INTO TEST VALUES (2,'a2')
db2 INSERT INTO TEST VALUES (3,'a3')
2). 验证表中的数据
db2 select count(*) from test
db2 select * from test
操作步骤:
连接数据库
F:\db2backup\test>db2 connect to testdb 数据库连接信息 数据库服务器 = DB2/NT 9.5.2 SQL 授权标识 = ZHOULJ 本地数据库别名 = TESTDB |
建表、修改表结构、插入数据等
F:\db2backup\test>db2 CREATE TABLE TEST(ID INTEGER , NAME VARCHAR(10)) DB20000I SQL 命令成功完成。 F:\db2backup\test>db2 ALTER TABLE TEST ALTER COLUMN id SET NOT NULL DB20000I SQL 命令成功完成。 F:\db2backup\test>db2 REORG TABLE TEST DB20000I REORG 命令成功完成。 F:\db2backup\test>db2 ALTER TABLE TEST ADD PRIMARY KEY (ID) DB20000I SQL 命令成功完成。 F:\db2backup\test>db2 REORG TABLE TEST DB20000I REORG 命令成功完成。 F:\db2backup\test>db2 INSERT INTO TEST VALUES (1,'a1') DB20000I SQL 命令成功完成。 F:\db2backup\test>db2 INSERT INTO TEST VALUES (2,'a2') DB20000I SQL 命令成功完成。 F:\db2backup\test>db2 INSERT INTO TEST VALUES (3,'a3') DB20000I SQL 命令成功完成。 |
验证表中的数据
F:\db2backup\test>db2 select count(*) from test 1 ----------- 3 1 条记录已选择。 F:\db2backup\test>db2 select * from test ID NAME ----------- ---------- 1 a1 2 a2 3 a3 3 条记录已选择。 |
3). 删除表
命令:
db2 drop table test
F:\db2backup\test>db2 drop table test DB20000I SQL 命令成功完成。 F:\db2backup\test>db2 select * from test SQL0204N "ZHOULJ.TEST" 是一个未定义的名称。 SQLSTATE=42704 |
3. 恢复数据到指定时间点
将数据库恢复到指定时间点需要以下内容:
数据库备份文件
数据库日志
1). 查看表的删除时间点
命令:
db2 list history dropped table all for
操作步骤:
F:\db2backup\test>db2 list history dropped table all for testdb 列示 testdb 的历史记录文件 匹配的文件条目数 = 1 Op 对象 时间戳记+序列 类型 设备 最早日志 当前日志 备份标识 -- --- ------------------ ---- --- ------------ ------------ -------------- D T 20100424181656 000000000000e5030003000e ---------------------------------------------------------------------------- "ZHOULJ"."TEST" 驻留在 1 表空间中: 00001 IBMDB2SAMPLEREL ---------------------------------------------------------------------------- 注释:DROP TABLE 开始时间:20100424181656 结束时间:20100424181656 状态:A ---------------------------------------------------------------------------- EID:19 DDL: CREATE TABLE "ZHOULJ"."TEST" ( "ID" INTEGER NOT NULL , "NAME" VARCHAR(10) ) IN "IBMDB2SAMPLEREL" ; ---------------------------------------------------------------------------- |
根据上面的“ 开始时间:20100424181656” 和 “结束时间:20100424181656” 确定数据库要恢复到什么时候合适。
2). 恢复数据库
命令:
db2 restore db testdb into testdb1 logtarget f:\db2backup\test\logs
操作步骤:
F:\db2backup\test>mkdir logs F:\db2backup\test>db2 restore db testdb into testdb1 logtarget f:\db2backup\test\logs DB20000I RESTORE DATABASE 命令成功完成。 |
3). 准备日志
进行数据库前滚需要日志,到原数据库的日志目录找到日志,然后复制到恢复数据库的目录下,以备回滚使用。
操作步骤:
F:\db2backup\test>db2 get db cfg for testdb | findstr /C:"日志文件路径" 日志文件路径 = C:\DB2\NODE0000\SQL00002\SQLOGDIR\ F:\db2backup\test>copy C:\DB2\NODE0000\SQL00002\SQLOGDIR\* F:\db2backup\test\logs C:\DB2\NODE0000\SQL00002\SQLOGDIR\S0000000.LOG 改写 F:\db2backup\test\logs\S0000000.LOG 吗? (Yes/No/All): yes C:\DB2\NODE0000\SQL00002\SQLOGDIR\S0000001.LOG C:\DB2\NODE0000\SQL00002\SQLOGDIR\S0000002.LOG C:\DB2\NODE0000\SQL00002\SQLOGDIR\S0000003.LOG C:\DB2\NODE0000\SQL00002\SQLOGDIR\S0000004.LOG 已复制 5 个文件。 |
4). 前滚数据库
前滚时间点的格式:
yyyy-mm-dd-HH-MM-SS.NNNNNN
命令:
db2 "rollforward db testdb1 to 2010-04-24-18-16-56.000000 using local time and stop overflow log path(F:\db2backup\test\logs\)"
F:\db2backup\test>db2 "rollforward db testdb1 to 2010-04-24-18-16-56.000000 using local time and stop overflow log path(F:\db2backup\test\logs\)" 前滚状态 输入数据库别名 = testdb1 节点数已返回状态 = 1 节点号 = 0 前滚状态 = 未暂挂 下一个要读取的日志文件 = 已处理的日志文件 = S0000000.LOG - S0000002.LOG 上次落实的事务 = 2010-04-24-18.13.56.000000 Local DB20000I ROLLFORWARD 命令成功完成。 |
4. 验证恢复是否正确
1). 连接数据库
命令:
db2 connect to testdb1
2). 查看表结构
命令:
db2look -d testdb1 -a -e -t test
3). 查询表中数据
db2 select count(*) from test
db2 select * from test
操作步骤:
F:\db2backup\test>db2 connect to testdb1 数据库连接信息 数据库服务器 = DB2/NT 9.5.2 SQL 授权标识 = ZHOULJ 本地数据库别名 = TESTDB1 |
F:\db2backup\test>db2 select count(*) from test 1 ----------- 3 1 条记录已选择。 F:\db2backup\test>db2 select * from test ID NAME ----------- ---------- 1 a1 2 a2 3 a3 3 条记录已选择。 |
F:\db2backup\test>db2look -d testdb1 -a -e -t test -- 为所有创建程序生成统计信息 -- db2look 实用程序将只考虑指定的表 -- 正在创建表的 DDL -- 此 CLP 文件是使用 DB2LOOK 版本 "9.5" 创建的 -- 时间戳记: 2010-4-24 19:51:34 -- 数据库名称: TESTDB1 -- 数据库管理器版本: DB2/NT Version 9.5.2 -- 数据库代码页: 1208 -- 数据库整理顺序为: IDENTITY -- 正在自动绑定程序包 ... -- 绑定成功 -- 正在自动绑定程序包 ... -- 绑定成功 CONNECT TO TESTDB1; ------------------------------------------------ -- 表的 DDL 语句 "ZHOULJ"."TEST" ------------------------------------------------ CREATE TABLE "ZHOULJ"."TEST" ( "ID" INTEGER NOT NULL , "NAME" VARCHAR(10) ) IN "IBMDB2SAMPLEREL" ; -- 表上主键的 DDL 语句 "ZHOULJ"."TEST" ALTER TABLE "ZHOULJ"."TEST" ADD PRIMARY KEY ("ID"); COMMIT WORK; CONNECT RESET; TERMINATE; |
通过以上步骤,说明表结构,数据都存在。恢复成功!
5. 将恢复的表导入到原数据库中
操作步骤:
F:\db2backup\test>db2 connect to testdb1 数据库连接信息 数据库服务器 = DB2/NT 9.5.2 SQL 授权标识 = ZHOULIJU... 本地数据库别名 = TESTDB1
F:\db2backup\test>db2 "export to test.ixf of ixf select * from test" SQL3104N EXPORT 实用程序 正在开始将数据导出至文件 "test.ixf"。 SQL3105N Export 实用程序已经完成导出 "3" 行。
导出的行数:3
F:\db2backup\test>db2 disconnect testdb1 DB20000I SQL DISCONNECT 命令成功完成。 F:\db2backup\test>db2 connect to testdb 数据库连接信息 数据库服务器 = DB2/NT 9.5.2 SQL 授权标识 = ZHOULIJU... 本地数据库别名 = TESTDB
F:\db2backup\test>db2 import from test.ixf of ixf create into test SQL3150N PC/IXF 文件中的 H 记录具有产品 "DB2 02.00",日期 "20100424" 和时间 "200234"。 SQL3153N PC/IXF 文件中的 T 记录具有名称 "test.ixf",限定符 "" 和源 ""。 SQL3109N 实用程序正在开始从文件 "test.ixf" 装入数据。 SQL3110N 实用程序已完成处理。从输入文件读了 "3" 行。 SQL3221W ...开始 COMMIT WORK。输入记录计数 = "3"。 SQL3222W ...对任何数据库更改的 COMMIT 都成功。 SQL3149N 处理了输入文件中的 "3" 行。已将 "3" 行成功插入表中。拒绝了 "0" 行。 读取行数 = 3 跳过行数 = 0 插入行数 = 3 更新行数 = 0 拒绝行数 = 0 落实行数 = 3 F:\db2backup\test>db2 select * from test ID NAME ----------- ---------- 1 a1 2 a2 3 a3 3 条记录已选择。 |
至此,整个操作步骤完成。