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