zoukankan      html  css  js  c++  java
  • 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完成之后,该表将被置于不可访问状态。

  • 相关阅读:
    【SPOJ】6779 Can you answer these queries VII
    【SPOJ】1557 Can you answer these queries II
    【SPOJ】2916 Can you answer these queries V
    【CodeForces】86D Powerful array
    【SPOJ】1043 Can you answer these queries I
    【HDU】3727 Jewel
    【HDU】3915 Game
    【SPOJ】1043 Can you answer these queries III
    【SPOJ】2713 Can you answer these queries IV
    成为一名更好的软件工程师的简单方法
  • 原文地址:https://www.cnblogs.com/xiaojianblogs/p/6765879.html
Copyright © 2011-2022 走看看