溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

怎么實(shí)現(xiàn)DB2數(shù)據(jù)庫事務(wù)日志已滿的分析

發(fā)布時(shí)間:2021-12-30 16:29:56 來源:億速云 閱讀:180 作者:柒染 欄目:云計(jì)算

這篇文章給大家介紹怎么實(shí)現(xiàn)DB2數(shù)據(jù)庫事務(wù)日志已滿的分析,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

某日下午,開發(fā)報(bào)告說在執(zhí)行DML操作時(shí),數(shù)據(jù)庫報(bào)事務(wù)日志已滿的錯(cuò)誤。

db2diag.log數(shù)據(jù)庫日志中的報(bào)錯(cuò)信息:

2013-04-01-16.43.30.736907+480 E2147482982C502    LEVEL: Error

PID     : 126660               TID  : 1           PROC : db2agent (SSO) 0

INSTANCE: db2inst1             NODE : 000         DB   : SSO

APPHDL  : 0-1103               APPID: GA0429B5.F627.130401082711

FUNCTION: DB2 UDB, data protection, sqlpgResSpace, probe:2860

MESSAGE : ADM1823E  The active log is full and is held by application handle

         "1103".  Terminate this application by COMMIT, ROLLBACK or FORCE

         APPLICATION.

客戶端具體信息如下:

$db2 delete from tzsdb01
DB21034E  該命令被當(dāng)作 SQL 語句來處理,因?yàn)樗皇怯行У摹懊钚刑幚砥鳌泵睢?br/>在 SQL 處理期間,它返回:
SQL0964C  數(shù)據(jù)庫的事務(wù)日志已滿。  SQLSTATE=57011

這個(gè)問題的原因是:表中數(shù)據(jù)量過大,delete 時(shí),會寫入日志,但日志容量過小。

解決方法:  增大日志容量、數(shù)據(jù)量 或 減少一次的刪除數(shù)據(jù)量,分多次刪除。

生產(chǎn)環(huán)境為避免白天停庫,提示開發(fā)分多次刪除,這樣就不出錯(cuò)了。但是要徹底解決這個(gè)問題,還需申請停庫修改數(shù)據(jù)庫參數(shù)。

我們先看一下,數(shù)據(jù)庫的關(guān)于日志的配置參數(shù)

$ db2 get db cfg for tzsdb01

      Database Configuration for Database zssqdb01

Database configuration release level                    = 0x0d00
Database release level                                  = 0x0d00

Database territory                                      = cn
Database code page                                      = 1208
Database code set                                       = UTF-8
Database country/region code                            = 86
Database collating sequence                             = IDENTITY

Multi-page file allocation enabled                      = YES

Log retain for recovery status                          = RECOVERY
User exit for logging status                            = YES

Self tuning memory                    (SELF_TUNING_MEM) = ON
Size of database shared memory (4KB)  (DATABASE_MEMORY) = AUTOMATIC(1662183)
Database memory threshold               (DB_MEM_THRESH) = 10
Max storage for lock list (4KB)              (LOCKLIST) = AUTOMATIC(130720)
Percent. of lock lists per application       (MAXLOCKS) = AUTOMATIC(97)
Package cache size (4KB)                   (PCKCACHESZ) = AUTOMATIC(421273)
Sort heap thres for shared sorts (4KB) (SHEAPTHRES_SHR) = AUTOMATIC(46809)
Sort list heap (4KB)                         (SORTHEAP) = AUTOMATIC(9361)

Database heap (4KB)                            (DBHEAP) = AUTOMATIC(2626)
Catalog cache size (4KB)              (CATALOGCACHE_SZ) = 300
Log buffer size (4KB)                        (LOGBUFSZ) = 4096

Log file size (4KB)                         (LOGFILSIZ) = 1024
Number of primary log files                (LOGPRIMARY) = 10
Number of secondary log files               (LOGSECOND) = 4
Changed path to log files                  (NEWLOGPATH) =
Path to log files                                       = /home/db2inst1/db2inst1/NODE0000/SQL00001/SQLOGDIR/

先看增大日志的容量,注意紅色的值為1024

$db2 update db cfg for zssqdb01 using logfilsiz 8192           將其增大到8192

然后停止應(yīng)用,停庫再啟庫就生效了

$db2 force applications all

$db2stop

$db2start

如果需要增大日志的數(shù)據(jù)量則需要進(jìn)行計(jì)算和這樣設(shè)置,這時(shí)日志容量已變?yōu)?192

Log file size (4KB)                         (LOGFILSIZ) = 8192
Number of primary log files                (LOGPRIMARY) = 10
Number of secondary log files               (LOGSECOND) = 4

現(xiàn)在的日志數(shù)據(jù)量為

計(jì)算公式如下:

數(shù)據(jù)庫事務(wù)日志的數(shù)據(jù)量大小 = ( LOGPRIMARY + LOGSECOND )* LOGFILSIZ * 4KB

即:

( 10 + 4)* 8192 * 4KB = 458752 K = 458 M  (大約數(shù))

下面斷開此數(shù)據(jù)庫的所有連接

修改主日志文件個(gè)數(shù):    db2 update db cfg for <dbname> using LOGPRIMARY 15

修改輔助日志文件個(gè)數(shù):db2 update db cfg for <dbname> using LOGSECOND 10

這時(shí)的大小=(15+10)*8192*4KB=819200K=819M (大約數(shù))

然后停庫再啟庫,問題得到解決。

注:LOGPRIMARY+LOGSECOND不能超過255,日志空間大小不能超過256G。對于LOGPRIMARY和LOGFILSIZ參數(shù)的修改需要斷開連接,重連數(shù)據(jù)庫才能生效。LOGSECOND參數(shù)的修改則立即生效,對于生產(chǎn)系統(tǒng)比較快的應(yīng)急解決辦法,可以直接先修改此參數(shù)。

補(bǔ)充知識:

1,主日志文件的數(shù)目 LOGPRIMARY

此數(shù)據(jù)庫配置參數(shù)用來指定要預(yù)分配的主日志文件個(gè)數(shù)。主日志文件建立分配給恢復(fù)日志文件的固定存儲器數(shù)量。在循環(huán)日志管理模式下,數(shù)據(jù)庫事務(wù)將按順序重復(fù)使用主日志,也就是當(dāng)一個(gè)主日志已滿時(shí),順序使用下一個(gè)主日志,如果主日志已滿,則按需一次分配一個(gè)輔助日志,輔助日志在使用完后,將被釋放。如果你發(fā)現(xiàn)數(shù)據(jù)庫會經(jīng)常分配輔助日志文件,則可能需要通過增大日志文件大小或增大主日志文件的數(shù)目來提高系統(tǒng)性能。

2,輔助日志文件的數(shù)目 LOGSECOND

此數(shù)據(jù)庫配置參數(shù)用來指定按需分配的輔助日志文件個(gè)數(shù)。盡量不要把此參數(shù)的值設(shè)置成“ -1 ” ,“ -1 ”代表你在請求一個(gè)無限的活動日志空間,數(shù)據(jù)庫也不會報(bào)數(shù)據(jù)庫事務(wù)日志已滿錯(cuò)誤,如果空間不足則會報(bào)日志磁盤已滿錯(cuò)誤。

3,日志文件大小 LOGFILSIZ

此數(shù)據(jù)庫配置參數(shù)用來指定日志文件的大小。

4,數(shù)據(jù)庫事務(wù)日志已滿錯(cuò)誤

數(shù)據(jù)庫事務(wù)日志已滿錯(cuò)誤是指當(dāng)前事務(wù)無法寫入到活動日志中(此時(shí)主日志文件和輔助日志文件已經(jīng)全部用完或者沒有足夠當(dāng)前事務(wù)寫入的空間),需要注意的是,這個(gè)錯(cuò)誤和日志磁盤空間已滿是兩個(gè)概念。數(shù)據(jù)庫事務(wù)日志已滿不是由于磁盤空間滿引起的,而是由于沒有落實(shí)的事務(wù)總體過大,超過了數(shù)據(jù)庫事務(wù)日志所能容納的最大大小所造成的。

當(dāng)出現(xiàn)這樣的錯(cuò)誤時(shí),不要嘗試使用 DB2STOP FORCE 命令來強(qiáng)制停掉數(shù)據(jù)庫,建議大家使用 FORCE APPLICATION 命令停掉引起這個(gè)錯(cuò)誤的應(yīng)用程序或者停掉所有的應(yīng)用程序。也不建議大家使用 KILL 命令來殺掉任何 DB2 相關(guān)的進(jìn)程。如果 使用DB2STOP FORCE命令hang住了,最后再嘗試殺掉進(jìn)程,重新DB2START或重啟服務(wù)器。

關(guān)于怎么實(shí)現(xiàn)DB2數(shù)據(jù)庫事務(wù)日志已滿的分析就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI