#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 条评论