DB2插入数据一般都会进行日志操作,不过下面为您介绍的方法实现了DB2插入数据不进行日志操作,如果您感兴趣的话,不妨一看。
在程序中需要使用下面的代码
insert into a select * from b where ......
每次插入到a表的记录有600多万条,每次执行该语句DB2都会返回SQLCODE值为-964的错误码,用db2 sql0964命令查看错误原因,DB2的解释为SQL0964C The transaction log for the database is full. 然后按照DB2的说明把日志文件的大小和日志文件的数量都扩充了,如下命令
db2 update db cfg for MY_DATABASE using LOGFILSIZ 7900
db2 update db cfg for MY_DATABASE using LOGPRIMARY 30
db2 update db cfg for MY_DATABASE using LOGSECOND 20
补充一下用的是循环日志
总的日志文件扩大到了1.5G左右,然后执行下面的命令
db2 "force application all"
db2stop
db2start
db2 connect to MY_DATABASE user db2inst1 uing db2inst1
最后从新调用包含insert into ... select ...语句的存储过程,此次程序执行完毕,但效率太慢。
后来一想是否能使对某表进行的DML操作不进行日志操作,把a表和b表都删除了,从新建表,建表时选择了not logged initially子句,建完表后我把数据从新导入到b表中,最后执行包含insert into ... select ...语句的SQL存储过程,DB2仍旧返回SQLCODE的值为-964的错误码。
有没有一个高效的方法(最好能让DB2执行此类方法时不进行日志操作)解决这个问题呢?
-------------
去除记录日志。
到控制中心--配置--日志--日志活动,配置成不记录日志。
-------------
采用循环日志可以考虑调整一下数据库的commitcount参数
-------------
使用not logged initially选项建表也是可以用的。
但是要先激活not logged initially选项;
在DB2 CLP中的例子;
DB2 CREATE TABLE A ...... NOT LOGGED INITIALLY;
DB2 +C //关闭自动提交选项;
db2=>ALTER TABLE A ACTIVATE NOT LOGGED INITIALLY;
db2=>Insert into a select * from b;
db2=>commit;
commit之前由于打开了not logged intially选项,后面的Sql语句不计日志;
commit之后not logged intially选项同时被关闭;
这个时候最好执行备份,因为你这一段数据操作是没有日志的,不利于以后恢复;
不过不是很推荐使用这个方法,如果要导入大量数据,还是使用Load,Import好一些;
想要在程序中写也是可以的,DB2提供了API,可以参考API Reference