程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> SyBase數據庫 >> SyBase綜合文章 >> DB2插入數據不進行日志操作的實現

DB2插入數據不進行日志操作的實現

編輯:SyBase綜合文章

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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved