justdba
作者justdba·2013-03-31 02:50
数据库管理员·ccit

不记日志DML或Load nonrecoverable前滚恢复测试

字数 3509阅读 7449评论 0赞 0
#load nonrecoverable、DML操作不记日志时前滚恢复测试 

--drop table test
--drop table testnolog
create table test (id int)
create table testnolog(name varchar(10))

--初始化表数据
insert into test values (1)
insert into testnolog values ('xxx')

--全备份一次
backup db sample online to c:bak include logs  --时间戳:20130331022630

--关闭自动提交,模拟一个事务多条操作、其中存在不记日志操作
update command options using c off
list command options
alter table testnolog activate not logged initially
insert into test values (2)
insert into testnolog values ('yyy')
commit

--查看插入结果
db2 => select * from test
ID
-----------
          1
          2
          
db2 => select * from testnolog
NAME
----------
xxx
yyy

--测试恢复,注意:备份是包含日志include logs恢复时需要参数logtarget释放,rollforward使用overflow log path进行在线日志的前滚恢复,备份不包含include logs,db2自动查找db cfg中在线日志路径
restore db sample from c:bak taken at  20130331022630  logtarget c:baklogs
rollforward db sample to end of logs and stop overflow log path (c:baklogs) 

--是否可以回滚到当前?
                                 前滚状态

 输入数据库别名                      = sample
 节点数已返回状态                = 1

 节点号                                = 0
 前滚状态                                    = 未暂挂
 下一个要读取的日志文件          =
 已处理的日志文件                = S0000010.LOG - S0000011.LOG
 上次落实的事务                  = 2013-03-30-18.31.03.000000 UTC

DB20000I  ROLLFORWARD 命令成功完成。

--test表数据是否丢失?
terminate
db2 
connect to sample
db2 => select * from test
ID
-----------
          1
          2
          
--testnolog表数据是否丢失?
db2 => select * from testnolog

NAME
----------
SQL1477N  对于表 "ADMINISTRATOR.TESTNOLOG",不能访问表空间 "3" 中的对象 "10"。
SQLSTATE=55019

--查看诊断信息
db2 => ? SQL1477N
SQL1477N  对于表 "<表名>",不能访问表空间 "<表空间标识>" 中的对
      象 "<对象标识>"。
说明:
试图访问一个表,而该表的其中一个对象是不可访问的。由于下列原因之一,该
表可能不可访问:
*  当回滚工作单元时,该表激活了 NOT LOGGED INITIALLY。
*  该表是分区的已声明临时表,因为声明了临时表(所有已声明临时表都具有模
   式名 SESSION),导致一个或多个分区失败。
*  ROLLFORWARD 在此表上遇到了 NOT LOGGED INITIALLY 激活,或者遇到了
   NONRECOVERABLE 装入。
不允许访问此表,因为不能保证其完整性。

用户响应:
可以执行下列操作之一。
*  如果对象是一个表,并且它已经激活了 NOT LOGGED INITIALLY,那么删除该
   表。如果需要此表,那么重新创建。
*  如果对象是一个数据分区,那么将它与表拆离。如果需要此数据分区,那么添
   加一个新的数据分区。
*  如果对象是一个非分区索引,那么删除该索引。如果需要此索引,那么创建一
   个新索引。
*  如果该表是已声明临时表,那么删除该表。如果此表是必需的,那么再次对其
   进行声明。
*  否则,从表空间或数据库备份中复原。备份映像必须在非可恢复操作(NOT
   LOGGED INITIALLY 操作或 NONRECOVERABLE 装入)完成之后的落实点之后获
   取。

--db2diag.log报警信息
2013-03-31-02.34.44.921001   Instance:DB2   Node:000
PID:1492(db2syscs.exe)   TID:2612   Appid:*LOCAL.DB2.130330183427
data management  sqldSetupSQLCA Probe:3   Database:SAMPLE

ADM5570W  在表 "ADMINISTRATOR.TESTNOLOG" 的表空间 "3" 中,在标识为 "10"
的不可用对象上尝试进行了访问。如果该对象是一个表,那么必须将其删除。如果该对象是
一个分区,那么必须将其拆离。如果该对象是一个非分区索引,那么将必须删除该索引。
         


#结论:进行不记日志操作后,务必备份数据库,否则会造成即使成功前滚到当前(不影响同一事务内的其他表操作),但数据库中数据一致性遭到破坏(同一个事务内仅恢复了一个表的数据)!

如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!

0

添加新评论0 条评论

Ctrl+Enter 发表

作者其他文章

相关文章

相关问题

相关资料

X社区推广