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