曾经因为对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. $ db2 +c "insert into t1 select * from t1"
  4. DB20000I  The SQL command completed successfully.
  5. $ db2 "commit"
  6. 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. $ db2 +c "insert into t1 select * from t1"
  4. DB20000I  The SQL command completed successfully.
  5. $ db2 "rollback"
  6. DB20000I  The SQL command completed successfully.
  7. $ db2 "select * from t1"
  8. BIRTHDATE
  9. ----------
  10. SQL1477N  For table "MIAOQINGSONG.T1" an object "5" in table space "2" cannot
  11. be accessed.  SQLSTATE=55019

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

db2 事务日志的更多相关文章

  1. SQL0946N错误及DB2事务日志

    在对DB2数据库进行批量增删的时候, 如果数据量比较大会导致SQL0964N错误, DB2 Knowledge center(http://pic.dhe.ibm.com/infocenter/db2 ...

  2. DB2事务日志

    1.DB2数据库的日志原理 事务日志记录数据库中所有对象和数据的改变,在早前版本中最大可达256G,其大小为( logprimary + logsecond ) * logfilsiz,其中logpr ...

  3. db2事务日志已满解决办法

    查看事务日志配置(MICRO_11为数据库名称): db2 get db cfg for MICRO_11 运行结果: 日志文件大小(4KB)                         (LOG ...

  4. DB2事务日志已满的解决方法

    DB2命令终端输入: db2 update db cfg for <dbname> using LOGPRIMARY 50 db2 update db cfg for <dbname ...

  5. DB2 的事务日志

    1.     DB2事务日志:DB2的日志分主日志和次日志,主日志是在数据库第一次被连接和激活时创建的,而次日志是当写满所有的主日志后,才动态分配次日志,主日志和次日志受设置个数的制约,当配置的所有主 ...

  6. DB2不记录事务日志

    1. DB2大数据处理不记录事务日志步骤:  建表需要添加属性“NOT LOGGED INITIALLY”  在大批量更改操作的同一个事务开始时执行:“ALTER TABLE tabname ACTI ...

  7. 【DB2】数据库的事务日志已满。SQLSTATE=57011

    问题描述 在使用数据库的时候报错如上图,我们先使用db2 get db cfg for sample查看相关配置参数,其中sample为数据库名称 C:\Users\Thinkpad>db2 g ...

  8. db2 活动日志激增的原因分析处理

    本文简单地介绍了DB2中日志的使用.活动日志以及首个活动日志的概念.日志满的原因.日志满的诊断.临时处理以及避免办法 日志使用 下图显示了并发事务条件下,日志使用的示意 有3个并发的程序Process ...

  9. 浅谈SQL Server中的事务日志(二)----事务日志在修改数据时的角色

    简介 每一个SQL Server的数据库都会按照其修改数据(insert,update,delete)的顺序将对应的日志记录到日志文件.SQL Server使用了Write-Ahead logging ...

随机推荐

  1. win32编程:L,_T() ,TEXT和_TEXT

    L的使用: 在字符串前面的大写字母L,用来告诉编译器该字符串应该作为Unicode来编译.它用来将ASNI转换为Unicode,Unicode字符串中每个字符占16位(两个字节),而在ASNI中每个字 ...

  2. 去除Many2one字段的“创建并编辑”选项

    要去除Many2one字段的“创建并编辑”选项,只要在view.xml里对应的field定义里增加options="{'no_create_edit':1}即可 <field name ...

  3. python内存数据库pydblite

    Pure-Python engine 最近由于项目开发中发现python informixDB模块对多线程的支持非常不好,当开启两个线程同时连接informix数据库的时候,数据库会报错,显示SQL ...

  4. 转载:Java中的字符串常量池详细介绍

    引用自:http://blog.csdn.net/langhong8/article/details/50938041 这篇文章主要介绍了Java中的字符串常量池详细介绍,JVM为了减少字符串对象的重 ...

  5. Expm 9_1 有向图中环的判断问题

    [问题描述] 给定一个有向图,要求使用深度优先搜索策略,判断图中是否存在环. package org.xiu68.exp.exp9; public class Exp9_1 { //用深度优先搜索判断 ...

  6. appium运行报错java.net.SocketException: socket write error

    这个错我调了 快两天一点头绪没有,脚本正常跑没问题,但是就是控制台输出信息报错,没法定位问题在哪.报错如图: 虽然这个报错不影响测试结果,但是本人有强迫症,一定要查出究竟: 我的尝试: 1.那天试验, ...

  7. 解决LoggerFactory is not a Logback LoggerContext but Logback is on the classpath

    因为引用了log4j2同时还引用了logback

  8. LeetCode(7):颠倒整数

    Easy! 题目描述:给定一个范围为 32 位 int 的整数,将其颠倒. 例1: 输入:132 输出:321 例2: 输入:-123 输出:-321 例3: 输入:120 输出:21 注意:假设我们 ...

  9. python 全栈开发,Day142(flask标准目录结构, flask使用SQLAlchemy,flask离线脚本,flask多app应用,flask-script,flask-migrate,pipreqs)

    昨日内容回顾 1. 简述flask上下文管理 - threading.local - 偏函数 - 栈 2. 原生SQL和ORM有什么优缺点? 开发效率: ORM > 原生SQL 执行效率: 原生 ...

  10. Android开发之实现多次点击事件

    在Android中给我们提供了单次点击事件.但并没有给我们提供双击,或者实现在一定时间内的多次事件.所以需要我们自己在单机监听上进行修改实现. 有如下两种实现方式: 1.定义一个存贮上一个第一次点击的 ...