曾经因为对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. centos6.5环境使用RPM包离线安装MariaDB 10.0.20

    1. 进入MariaDB官网下载MariaDB需要的RPM包 2. 使用下载软件下载所需要的RPM包, 总共4个, 并上传到CentOS主机指定目录. MariaDB-10.0.20-centos6- ...

  2. sqlserver数据库系统性能监控步骤

    1.部署好环境JDK+tomcat+数据库 ①修改数据库连接账号密码db.properties ②修改applicationContext.xml文件,开启任务 <bean id="o ...

  3. [How to]HBase集群备份方法--Replication机制

    1.简介 HBase备份的方法在[How to]HBase集群备份方法文章中已经有些介绍,但是这些方法都不是HBase本身的特性在支持,都是通过MR计算框架结合HBase客户端的方式,或者直接拷贝HB ...

  4. JAVA中各种日期表示字母

    字母 日期或时间元素 表示 示例 G Era 标志符 Text AD y 年 Year 1996; 96 M 年中的月份 Month July; Jul; 07 w 年中的周数 Number 27 W ...

  5. php工厂模式的实例

    * 单例模式:用于创建单一类型的唯一实例对象 * 工厂模式:用于创建多种类型的多个实例对象 //声明形状类 class Shape { //声明静态方法create,根据容器形状不同,创建不同图形类的 ...

  6. hdu3415 单调队列模板题

    比较裸的单调队列 先求前缀和,枚举所有结束位置1~n+k即可 #include<iostream> #include<cstdio> #include<cstring&g ...

  7. review-questions

    questions: python字典中items()和iteritems()的区别 items()返回的是列表对象,而iteritems()返回的是迭代器对象 print dic.items() # ...

  8. 正确停止线程的方式三 使用Thread类中的内置的中断标记位-----------不熟悉

    package charpter10; public class Processor implements Runnable { @Override public void run() { for ( ...

  9. springboot2.0+dubbo整合分布式服务发布和调用

    最近项目上要对以前的老项目做分布式的整改,因此我专门花了点时间研究下当前比较热门的dubbo和springboot结合使用,以前使用过dubbo,但是没有与springboot结合过,在网上查了点资料 ...

  10. Shell命令 中|| &&使用

    转自:https://www.cnblogs.com/aaronLinux/p/8340281.html