文章編號: 317375 - 上次校閱: 2011年5月10日 - 版次: 7.0 執行 SQL Server 之電腦上的交易記錄檔意外地擴充或滿溢
在此頁中結論 在 SQL Server 7.0、SQL Server 2000 與 SQL Server 2005
中,使用自動成長設定,便可讓交易記錄檔自動擴充。 一般而言,檢查點或交易記錄備份會觸發交易記錄截斷,如果交易記錄檔能保留其間發生的交易最大數目,那麼檔案大小就會十分固定。 但是,在某些情況下,交易記錄可能會變得非常大,而導致空間不足或是滿溢。一般而言,當交易記錄檔佔據可用的硬碟空間而且無法繼續擴充時,您就會收到下列錯誤訊息: Error:9002, Severity:17, State:2 The log file for database '%.*ls' is full. (錯誤:9002,嚴重性:17,狀態:資料庫 '%.*ls' 的記錄檔已滿) Error:9002, Severity:17,
State:2 The transaction log for database '%.*ls' is full.To find out why space in the log cannot be reused, see the log_reuse_wait_desc column in sys.databases (錯誤:9002,嚴重性:17,狀態:2 資料庫 %.*ls 的交易記錄檔已滿。如果要瞭解為何無法重複使用記錄檔中的空間,請參閱 sys.databases 中的 log_reuse_wait_desc 欄位。) 此外,交易記錄擴充可能會導致下列情況:
原因因為下列的原因或情況,可能會擴充交易記錄檔:
未認可的交易如果您沒有發出明確的 COMMIT 或 ROLLBACK 命令,則明確交易會維持在未認可的狀態。當應用程式發出 CANCEL 或 Transact SQL KILL 命令,但沒有對應的 ROLLBACK 命令時,最常發生這個問題。發生交易取消的情況,但並未復原;因此,SQL Server 無法截斷這個動作之後的每個交易,因為中止的交易仍在開啟中。您可以使用 DBCC OPENTRAN Transact-SQL 參照,以確定在特定時間中,資料庫中是否有現用交易。 如需有關這個特定案例的詳細資訊,請按一下下列文件編號,檢視「Microsoft 知識庫」中的下列文件:295108?
(http://support.microsoft.com/kb/295108/
)
Incomplete transaction may hold large number of locks and case blocking
171224?
(http://support.microsoft.com/kb/171224/
)
INF: Understanding How the Transact-SQL KILL Command Works
此外,請參閱《SQL Server 線上叢書》中的<DBCC
OPENTRAN>主題。可能會產生未認可交易的案例:
超大型交易根據每次的交易,截斷交易記錄檔中的記錄。如果交易範圍相當大,除非交易完成,否則都不會將之後開始的交易及任何交易從交易記錄中移除。這可能會造成大型的記錄檔。如果交易夠大,記錄檔可能會用盡可用的硬碟空間,並產生「交易記錄已滿」類型的錯誤訊息,例如「錯誤 9002」。當您收到此類型的錯誤訊息,如需如何處理的詳細資訊,請參閱本文的<其他相關資訊>一節。此外,將需要許多時間及 SQL Server 負荷才能復原大型交易。操作:DBCC DBREINDEX 及 CREATE INDEX因為 SQL Server 2000 的復原模型產生的變更,所以當您使用完整復原模式並執行 DBCC DBREINDEX,交易記錄擴充的程度會比 SQL Server 7.0 在相同的復原模式中,藉由使用 SELECT INTO 或 BULK COPY,並關閉 "Trunc.Log on chkpt."。雖然在 DBREINDEX 作業之後的交易記錄大小可能會有問題,但這個方法的確提供了較佳的記錄還原效能。 還原交易記錄檔備份時這會在下列「Microsoft 知識庫」文件中進行說明:232196?
(http://support.microsoft.com/kb/232196/
)
INF: Log Space Used Appears to Grow After Restoring from Backup
如果您將 SQL Server 2000 設定為使用大量登入模式,並發出 BULK COPY 或 SELECT INTO 陳述式,則在您備份交易記錄時,將會標記每個變更的範圍,並在之後進行備份。雖然這可以讓您在執行大量作業之後,備份交易記錄並從失敗中復原,但這也會增加交易記錄的大小。SQL Server 7.0 不具備這個功能。SQL Server 7.0 只會記錄已變更的程度,但不會記錄實際的程度。因此,雖然在大量登入模式中,記錄作業在 SQL Server 2000 會比在 SQL Server 7.0 佔據較多的空間,但不會大於完整模式所使用的空間。 用戶端應用程式未處理所有結果如果您向 SQL Server 發出查詢,但未立即處理結果,則可能會保留鎖定並降低伺服器上的並行。例如,假設您發出的查詢,需要兩頁的資料列才能填寫結果集。SQL Server 會剖析、編譯及執行查詢。這代表會將共用鎖定置放在這兩頁上,其中會包含您必須符合查詢的資料列。此外,假設並非所有資料列都可放入一個 SQL Server TDS 封包 (亦即伺服器與用戶端通訊的方法)。則會填入 TDS 封包並將之傳送到用戶端。如果第一頁的所有資料列都可容納在 TDS 封包中,SQL Server 就會釋放該頁上的共用鎖定,但會保留第二頁的共用鎖定。SQL Server 之後會等候用戶端要求其他資料 (例如,您可以使用 DBNEXTROW/DBRESULTS、SQLNextRow/SQLResults 或 FetchLast/FetchFirst 來執行這項操作)。 這代表在用戶端要求其餘資料之前,共用鎖定都會予以保留。要求第二頁資料的其他處理序可能會被封鎖。 在交易記錄檔完成擴充之前,查詢逾時,且您收到錯誤的「記錄已滿」錯誤訊息在這種情況下,雖然有足夠的磁碟空間,您仍會收到「空間不足」錯誤訊息。這種情形在 SQL Server 7.0 和 SQL Server 2000 中會有所不同。 如果交易記錄幾乎滿溢,查詢可能會導致交易記錄自動進行擴充。這會花費額外的時間,而且查詢可能會因此停止,或超過其逾時期間。SQL Server 7.0 在這個情況下會傳回錯誤 9002。這個問題不適用於 SQL Server 2000。 在 SQL Server 2000 中,如果您開啟資料庫的 [自動壓縮] 選項,則會有一小段時間,交易記錄會嘗試自動擴充,但是因為同時間會執行 [自動壓縮] 功能,所以無法進行此項操作。這也可能造成錯誤 9002 的錯誤執行個體。 一般而言,會迅速自動擴充交易記錄檔。但是,在下列情況下,可能會花費比一般更長的時間:
未複寫的交易如果您使用複寫,便可以擴充 publisher 資料庫的交易記錄檔大小。對已複寫物件造成影響的交易會被標記為「可供複寫」。直到記錄讀取器工作將交易複製到散發資料庫並予以取消標記之前,在檢查點或您備份交易記錄之後,將不會刪除這些交易 (例如未認可交易)。如果記錄讀取器工作發生問題,因而無法讀取 publisher 資料庫中的這些交易,則交易記錄的大小可能會隨著未複寫交易數量的增加而繼續擴充。您可以使用 DBCC OPENTRAN Transact-SQL 參照以辨別最舊的未複寫交易。如需有關疑難排解未複寫交易的其他資訊,請參閱《SQL Server 線上叢書》的<sp_replcounters>和<sp_repldone>主題。 如需詳細資訊,請按一下下面的文件編號,檢視「Microsoft 知識庫」中的文件: 306769?
(http://support.microsoft.com/kb/306769/
)
FIX: Transaction Log of Snapshot Published Database Cannot Be Truncated
240039?
(http://support.microsoft.com/kb/240039/
)
FIX: DBCC OPENTRAN Does Not Report Replication Information
198514?
(http://support.microsoft.com/kb/198514/
)
FIX: Restore to New Server Causes Transactions to Remain in Log
其他相關資訊 會將任何資料庫的交易記錄管理為一組虛擬記錄檔 (VLF),其大小是 SQL Server
在內部根據記錄檔大小和記錄擴充程度而加以判斷。記錄會持續以整個 VLF 的單位進行擴充,而且只可以壓縮成 VLF 範圍。VLF
存在於三個狀態其中之一:ACTIVE、RECOVERABLE 及 REUSABLE。
如需詳細資訊,請參閱《SQL Server 線上叢書》的<交易記錄實體架構>主題。此外,您可以在 Inside SQL Server 7.0 的 190 頁 (Soukup, Ron.Inside Microsoft SQL Server 7.0, Microsoft Press, 1999)、以及 Inside SQL Server 2000 的 182 到 186 頁 (Delaney, Kalen.Inside Microsoft SQL Server 2000, Microsoft Press, 2000) 中看到這個主題的絕佳圖表和討論。 SQL Server 7.0 及 SQL Server 2000 資料庫可以進行自動擴充和自動壓縮。您可以使用這些選項協助您壓縮或擴充交易記錄。 如需有關這些選項將如何影響伺服器的詳細資訊,請按一下下面的文件編號,檢視「Microsoft 知識庫」中的文件: 315512?
(http://support.microsoft.com/kb/315512/
)
INF:SQL Server 中的 Autogrow 及 Autoshrink 設定考量
交易記錄檔的截斷和壓縮之間有差異。當 SQL Server 截斷交易記錄檔時,這代表該檔案
(例如已認可的交易) 的內容已經遭到刪除。但是,當您從磁碟空間的觀點 (例如,在 Windows Explorer 中或使用 dir 命令) 來檢視檔案的大小,大小是維持不變的。但是,新的交易目前可以重新使用 .ldf 檔案內部的空間。只有當 SQL Server
壓縮交易記錄檔的大小時,您才可以確實看到記錄檔的實體大小中的變更。如需有關如何壓縮交易記錄的詳細資訊,請按一下下面的文件編號,檢視「Microsoft 知識庫」中的文件: 256650?
(http://support.microsoft.com/kb/256650/
)
INF:如何將 SQL Server 交易記錄檔壓縮
272318?
(http://support.microsoft.com/kb/272318/
)
INF: Shrinking the Transaction Log in SQL Server 2000 with DBCC SHRINKFILE
如需有關 SQL Server 6.5
交易記錄使用率的詳細資訊,請按一下下面的文件編號,檢視「Microsoft 知識庫」中的文件:110139?
(http://support.microsoft.com/kb/110139/
)
INF:SQL 交易記錄檔滿溢的原因
這篇文章中的資訊適用於:
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。 | 其他資源 其他支援網站社群立即取得協助文章翻譯
|






Windows Live
Facebook
Twitter
Linkedin
Digg it
Yahoo
Delicious
StumbleUpon
Yammer
Reddit
Technorati
FriendFeed
Email
回此頁最上方
