DB2删除表的恢复

DB2删除表的恢复

对于表误删这个问题,依赖于备份情况,有以下几种解决方案:
1.如果该表的表结构可以重建,而且数据可以从其它渠道获得,那可以考虑重建。
2.如果做过数据库备份并且是归档日志模式,这种情况下,有经验的DBA可能都会想到通过对数据库做restore+roIlforward,前滚到表删除之前的状态,但表删除之后所做的数据变化都将丢失,而且数据量很大的话,恢复的时间会比较长,影响系统的正常使用。

如果只恢复这个表所属的表空间呢?
表空间前滚的最小恢复时间点概念:当有drop、create、alter等DDL操作发生时,DB2会在系统表中更新定义,并更新表空间的最小恢复时间点,只有前滚到最小恢复时间之后才能才能保证系统表和数据库对象保持一致。本例中,直接通过前滚表空间的方式来复原删除表是不可能的,因为该表删除后,系统表空间中己经不存在这张表的定义。
如果我们能够得到这张表的定义,并且取得删除前的数据,那就可以重建了,这正是dropped table恢复原理,简单地说,dropped table recovery利用删除表恢复历史文件和表空间前滚机制(仅在归档模式下可用)分别获得删除表的定义和数据。该机制要求表空间的dropped table recovery选项必须打开,缺省情况下建表空间时该选项是打开的,如果没有打开,也可以使用
ALTER TABLESPACE〈TBSPACENAME> DROPPED TABLE RECOVERY ON进行更改。

举例

  1. 首先创建一张t2表,并插入了1条数据,然后做一个在线备份,代码如下:

    /home/db2inst1>db2 “create table temp (id int,name char(20))”
    /home/db2inst1>db2 “insert into temp values(10,‘zhang’)”
    /home/db2inst1>db2 backup db mbmdb online

    Backup successful. The timestamp for this backup image is : 20210205094616

  2. 删除表并在历史文件查找删除表的定义

/home/db2inst1>db2 drop table temp

启动了droppedtablerecovery选项后,删除表时,DB2会在日志中记录一些额外的信息,如tablename、timestamp、TID和FID等信息,并在历史文件中记name、timestamp、TID、FID和建表语句的DDL,这些信息将在随后的恢复中用到。

  1. 在历史文件查找删除表的定义

/home/db2inst1>db2 list history dropped table all for mbmdb

 Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
 -- --- ------------------ ---- --- ------------ ------------ --------------
  D  T  20210205095746                                        0000000000003fd600020007 
 ----------------------------------------------------------------------------
  "DB2INST1"."TEMP" resides in 1 tablespace(s):

 00001 USERSPACE1
 ----------------------------------------------------------------------------
    Comment: DROP TABLE
 Start Time: 20210205095746
   End Time: 20210205095746
     Status: A
 ----------------------------------------------------------------------------
  EID: 175

 DDL: CREATE TABLE "DB2INST1"."TEMP" ( "ID" INTEGER , "NAME" CHAR(20 OCTETS) )  IN "USERSPACE1"                 ORGANIZE BY ROW;         
 ----------------------------------------------------------------------------
  1. 恢复删除表所在的表空间,并将表空间前滚。

    /home/db2inst1> db2 “restore db mbmdb” tablespace(userspace1)taken at 20210205094616"
    userspace1:这里是已删除表原先所在的表空间名 (在上图DDL语句中可找到)
    20210205094616:这里是最近一次备份的时间戳

  2. 进行前滚

前滚时指定要恢复的表backupid(对应listdroppedtable中的backupid,每个backupid对
应一张删除表)。在前滚的过程将表数据导出到一个目录里,通过to指定

/home/db2inst1>mkdir /home/db2inst/data
/home/db2inst1>db2 "rollforward database mbmdb to end of logs tablespace(USERSPACE1) recover dropped table 0000000000003fd600020007 to /home/db2inst/data"
/home/db2inst是数据存放的路径

  1. 进入目录查看
[db2_test3:db2inst1]:/home/db2inst1> cd /home/db2inst1/data
[db2_test3:db2inst1]:/home/db2inst1/data> ls
NODE0000
[db2_test3:db2inst1]:/home/db2inst1/data> cd NODE0000
[db2_test3:db2inst1]:/home/db2inst1/data/NODE0000> ls
createTEMP_0204.ddl  data
[db2_test3:db2inst1]:/home/db2inst1/data/NODE0000> cat data
10,"zhang  
  1. 重建表结构,并导入数据

重建表结构

[db2_test3:db2inst1]:/home/db2inst1/data/NODE0000> db2 -tvf createTEMP_0204.ddl
CREATE TABLE "DB2INST1"."temp" ( "ID" INTEGER , "NAME" CHAR(20)) in "USERSPACE1"
DB20000I  The SQL command completed successfully.
 

导入数据
db2 “load from data of del insert into temp nonrecoverable”
使用nonrecoverable选项可以避免load pending

实际操作中出现的问题

在第四步恢复删除表所在的表空间时,却对所有的表空间进行了恢复,执行了如恢复下代码:
/home/db2inst1> db2 “restore db mbmdb tablespace (userspace1) taken at 20210205094616”
所有的表空间都进入了表锁用户无法连接进入数据库。最后只能删除该数据库恢复后进行前滚

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值