DB2插入數(shù)據(jù)不進(jìn)行日志操作的實(shí)現(xiàn)
DB2插入數(shù)據(jù)一般都會進(jìn)行日志操作,不過下面為您介紹的方法實(shí)現(xiàn)了DB2插入數(shù)據(jù)不進(jìn)行日志操作,如果您感興趣的話,不妨一看。
在程序中需要使用下面的代碼
insert into a select * from b where ......
每次插入到a表的記錄有600多萬條,每次執(zhí)行該語句DB2都會返回SQLCODE值為-964的錯誤碼,用db2 sql0964命令查看錯誤原因,DB2的解釋為SQL0964C The transaction log for the database is full. 然后按照DB2的說明把日志文件的大小和日志文件的數(shù)量都擴(kuò)充了,如下命令
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
補(bǔ)充一下用的是循環(huán)日志
總的日志文件擴(kuò)大到了1.5G左右,然后執(zhí)行下面的命令
db2 "force application all"
db2stop
db2start
db2 connect to MY_DATABASE user db2inst1 uing db2inst1
***從新調(diào)用包含insert into ... select ...語句的存儲過程,此次程序執(zhí)行完畢,但效率太慢。
后來一想是否能使對某表進(jìn)行的DML操作不進(jìn)行日志操作,把a(bǔ)表和b表都刪除了,從新建表,建表時選擇了not logged initially子句,建完表后我把數(shù)據(jù)從新導(dǎo)入到b表中,***執(zhí)行包含insert into ... select ...語句的SQL存儲過程,DB2仍舊返回SQLCODE的值為-964的錯誤碼。
有沒有一個高效的方法(***能讓DB2執(zhí)行此類方法時不進(jìn)行日志操作)解決這個問題呢?
-------------
去除記錄日志。
到控制中心--配置--日志--日志活動,配置成不記錄日志。
-------------
采用循環(huán)日志可以考慮調(diào)整一下數(shù)據(jù)庫的commitcount參數(shù)
-------------
使用not logged initially選項(xiàng)建表也是可以用的。
但是要先激活not logged initially選項(xiàng);
在DB2 CLP中的例子;
DB2 CREATE TABLE A ...... NOT LOGGED INITIALLY;
DB2 +C //關(guān)閉自動提交選項(xiàng);
db2=>ALTER TABLE A ACTIVATE NOT LOGGED INITIALLY;
db2=>Insert into a select * from b;
db2=>commit;
commit之前由于打開了not logged intially選項(xiàng),后面的Sql語句不計日志;
commit之后not logged intially選項(xiàng)同時被關(guān)閉;
這個時候***執(zhí)行備份,因?yàn)槟氵@一段數(shù)據(jù)操作是沒有日志的,不利于以后恢復(fù);
不過不是很推薦使用這個方法,如果要導(dǎo)入大量數(shù)據(jù),還是使用Load,Import好一些;
想要在程序中寫也是可以的,DB2提供了API,可以參考API Reference
【編輯推薦】
DB2 SQL腳本批量執(zhí)行的實(shí)現(xiàn)過程