db2 事务日志

曾经因为对DB2 的 NOT LOGGED INITIALLY 属性认识不足而吃了亏。当时需要往表中插入大量的数据,最初也没有考虑太多就使用了传统的insert 命令,由于数据量实在过于巨大,而且系统中还运行着其他事务,报"SQL0964C  数据库的事务日志已满" 的错误,便查找DB2 中是否也有类似Oracle 中的Not logging 的特性。

     DB2 中的表的not logged initially 特性,可以避免insert、delete、update 数据产生的日志。以为在建表的时候指定该属性就可以避免insert 产生的日志(只要将自动提交的功能闭关,使用not logged initially 特性建表以后马上接下去执行事务,not logged initially特性是有效的),结果还是因为日志量太大报数据库日志满的错误。求助DBA得知需要在每次事务执行前激活not logge initially 特性(ALTER TABLE <tableName> ACTIVATE NOT LOGGED INITIALLY;)如果一张表在创建的时候没有指定表的not logged initially 特性,使用该alter tabele ... activate not logged initially 语句也是可以激活not logged initially 特性的。激活表的not logged initially 特性以后,接下来的DML操作在事务结束前不记日志。使用方式如下:
commit;--提交前一个事务。
ALTER TABLE <tableName> ACTIVATE NOT LOGGED INITIALLY;--激活表的not logged initially 特性。
insert/delete/update --DML操作不及日志,可以减少系统的日志量和提高DML语句的操作性能。
commit;--关闭表的not logged initially 特性。
为了控制事务需要将QC或者Toad 等开发和运行环境中的自动提交(autocommit)的功能关闭。使用not logged initially 特性建好表以后,如果DDL语句提交了那么才需要激活表的not logged initially 特性。
   使用Not logged initially 特性最重要的是要控制好事务。

 

DB2如何开启不记日志模式?开启之后,会有哪些后果?

有些DB2操作,比如insert/update/delete/import,若数据量较大,则会占用大量日志,甚至导致日志满。如果需要的话,可以开启不记日志模式

我这里也举个例子,下面事务中的insert语句是不记日志的:

 
  1. $ db2 +c "alter table t1 activate not logged initially"  
  2. DB20000I  The SQL command completed successfully.  
  3.   
  4. $ db2 +c "insert into t1 select * from t1"  
  5. DB20000I  The SQL command completed successfully.  
  6.   
  7. $ db2 "commit"  
  8. DB20000I  The SQL command completed successfully.  


注意,这里的不记日志操作,仅仅在同一个事务内有效,也就是说,这个事务结束(发出了commit命令)之后,后续操作会重新记录日志。


------分割线--------


开启不记日志操作可能的严重后果如下
  1.1 如果在这个事务中显式地发出了rollback命令,或者SQL因为意外情况失败(比如锁超时、内存不足等)导致回滚,则该表将不能访问,必须被删除:

 
  1. $ db2 +c "alter table t1 activate not logged initially"  
  2. DB20000I  The SQL command completed successfully.  
  3.   
  4. $ db2 +c "insert into t1 select * from t1"  
  5. DB20000I  The SQL command completed successfully.  
  6.   
  7. $ db2 "rollback"  
  8. DB20000I  The SQL command completed successfully.  
  9.   
  10. $ db2 "select * from t1"  
  11.   
  12. BIRTHDATE  
  13. ----------  
  14. SQL1477N  For table "MIAOQINGSONG.T1" an object "5" in table space "2" cannot  
  15. be accessed.  SQLSTATE=55019  


  1.2 如果数据库出问题,使用rollforward命令(rollforward到上面操作时间点之后)将无法恢复该表,rollforward完成之后,该表将被置于不可访问状态。

 

posted @ 2017-04-26 00:24  潇湘灬隐者  阅读(922)  评论(0)    收藏  举报