時間:2015/6/28來源:IT貓撲網(wǎng)作者:網(wǎng)管聯(lián)盟我要評論(0)
事務(wù)日志(Transaction logs)是數(shù)據(jù)庫結(jié)構(gòu)中非常重要但又經(jīng)常被忽略的部分。由于它并不像數(shù)據(jù)庫中的schema那樣活躍,因此很少有人關(guān)注事務(wù)日志。
事務(wù)日志是針對數(shù)據(jù)庫改變所做的記錄,它可以記錄針對數(shù)據(jù)庫的任何操作,并將記錄結(jié)果保存在獨立的文件中。對于任何每一個事務(wù)過程,事務(wù)日志都有非常全面的記錄,根據(jù)這些記錄可以將數(shù)據(jù)文件恢復(fù)成事務(wù)前的狀態(tài)。從事務(wù)動作開始,事務(wù)日志就處于記錄狀態(tài),事務(wù)過程中對數(shù)據(jù)庫的任何操作都在記錄范圍,直到用戶點擊提交或后退后才結(jié)束記錄。每個數(shù)據(jù)庫都擁有至少一個事務(wù)日志以及一個數(shù)據(jù)文件。
出于性能上的考慮,sql server將用戶的改動存入緩存中,這些改變會立即寫入事務(wù)日志,但不會立即寫入數(shù)據(jù)文件。事務(wù)日志會通過一個標(biāo)記點來確定某個事務(wù)是否已將緩存中的數(shù)據(jù)寫入數(shù)據(jù)文件。當(dāng)SQL Server重啟后,它會查看日志中最新的標(biāo)記點,并將這個標(biāo)記點后面的事務(wù)記錄抹去,因為這些事務(wù)記錄并沒有真正的將緩存中的數(shù)據(jù)寫入數(shù)據(jù)文件。這可以防止那些中斷的事務(wù)修改數(shù)據(jù)文件。
維護事務(wù)日志
因為很多人經(jīng)常遺忘事務(wù)日志,因此它也會給系統(tǒng)帶來一些問題。隨著系統(tǒng)的不斷運行,日志記錄的內(nèi)容會越來越多,日志文件的體積也會越來越大,最終導(dǎo)致可用磁盤空間不足。除非日常工作中經(jīng)常對日志進行清理,否則日志文件最終會侵占分區(qū)內(nèi)的全部可用空間。日志的默認(rèn)配置為不限容量,如果以這種配置工作,它就會不斷膨脹,最終也會占據(jù)全部可用空間。這兩種情況都會導(dǎo)致數(shù)據(jù)庫停止工作。
對事務(wù)日志的日常備份工作可以有效的防止日志文件過分消耗磁盤空間。備份過程會將日志中不再需要的部分截除。截除的方法是首先把舊記錄標(biāo)記為非活動狀態(tài),然后將新日志覆蓋到舊日志的位置上,這樣就可以防止事務(wù)日志的體積不斷膨脹。如果無法對日志進行經(jīng)常性的備份工作,最好將數(shù)據(jù)庫設(shè)置為"簡單恢復(fù)模式"。在這種模式下,系統(tǒng)會強制事務(wù)日志在每次記錄標(biāo)記點時,自動進行截除操作,以新日志覆蓋舊日志。
截除過程發(fā)生在備份或?qū)⑴f標(biāo)記點標(biāo)為非活動狀態(tài)時,它使得舊的事務(wù)記錄可以被覆蓋,但這并不會減少事務(wù)日志實際占用的磁盤空間。就算不再使用日志,它依然會占據(jù)一定的空間。因此在維護時,還需要對事務(wù)日志進行壓縮。壓縮事務(wù)日志的方法是刪除非活動記錄,從而減少日志文件所占用的物理硬盤空間。
通過使用DBCC SHRINKDATABASE語句可以壓縮當(dāng)前數(shù)據(jù)庫的事務(wù)日志文件,DBCC SHRINKFILE語句用來壓縮指定的事務(wù)日志文件,另外也可以在數(shù)據(jù)庫中激活自動壓縮操作。當(dāng)壓縮日志時,首先會將舊記錄標(biāo)記為非活動狀態(tài),然后將帶有非活動標(biāo)記的記錄徹底刪除。根據(jù)所使用的壓縮方式的不同,你可能不會立即看到結(jié)果。在理想情況下,壓縮工作應(yīng)該選在系統(tǒng)不是非常繁忙的時段進行,否則有可能影響數(shù)據(jù)庫性能。
恢復(fù)數(shù)據(jù)庫
事務(wù)記錄備份可以用來將數(shù)據(jù)庫恢復(fù)到某一指定狀態(tài),但事務(wù)記錄備份本身不足以完成恢復(fù)數(shù)據(jù)庫的任務(wù),還需要備份的數(shù)據(jù)文件參與恢復(fù)工作。恢復(fù)數(shù)據(jù)庫時,首先進行的是數(shù)據(jù)文件的恢復(fù)工作。在整個數(shù)據(jù)文件恢復(fù)完成前,不要將其設(shè)為完成狀態(tài),否則事務(wù)日志就不會被恢復(fù)。當(dāng)數(shù)據(jù)文件恢復(fù)完成,系統(tǒng)會通過事務(wù)日志的備份將數(shù)據(jù)庫恢復(fù)成用戶希望的狀態(tài)。如果在數(shù)據(jù)庫最后一次備份后,存在多個日志文件的備份,備份程序會按照它們建立的時間依次將其恢復(fù)。
另一種被稱為log shipping的過程可以提供更強的數(shù)據(jù)庫備份能力。當(dāng)log shipping配置好后,它可以將數(shù)據(jù)庫整個復(fù)制到另一臺服務(wù)器上。在這種情況下,事務(wù)日志也會定期發(fā)送到備份服務(wù)器上供恢復(fù)數(shù)據(jù)使用。這使得服務(wù)器一直處于熱備份狀態(tài),當(dāng)數(shù)據(jù)發(fā)生改變時它也隨之更新。另一個服務(wù)器被稱作監(jiān)視(monitor)服務(wù)器,可以用來監(jiān)視按規(guī)定時間間隔發(fā)送的shipping信號。如果在規(guī)定時間內(nèi)沒有收到信號,監(jiān)視服務(wù)器會將這一事件記錄到事件日志。這種機制使得log shipping經(jīng)常成為災(zāi)難恢復(fù)計劃中使用的方案。
性能優(yōu)化
事務(wù)日志對數(shù)據(jù)庫有重要作用,同時它對系統(tǒng)的整體性能也有一定影響。通過幾個選項,我們可以對事務(wù)日志的性能進行優(yōu)化。由于事務(wù)日志是一個連續(xù)的磁盤寫入過程,在這當(dāng)中不會發(fā)生讀取動作。因此將日志文件放在一個獨立的磁盤,對優(yōu)化性能有一定作用。
另一項優(yōu)化措施與日志文件的體積有關(guān)。我們可以設(shè)置日志文件的體積不超過硬盤空間的百分之幾,或者確定它的大小。如果將其設(shè)置的過大會浪費磁盤空間,而如果設(shè)置的過小則會強制記錄文件不斷嘗試擴展,導(dǎo)致數(shù)據(jù)庫性能下降。
事務(wù)日志文件Transaction Log File是用來記錄數(shù)據(jù)庫更新情況的文件,擴展名為ldf。
在 SQL Server 7.0 和 SQL Server 2000 中,如果設(shè)置了自動增長功能,事務(wù)日志文件將會自動擴展。
一般情況下,在能夠容納兩次事務(wù)日志截斷之間發(fā)生的最大數(shù)量的事務(wù)時,事務(wù)日志的大小是穩(wěn)定的,事務(wù)日志截斷由檢查點或者事務(wù)日志備份觸發(fā)。
然而,在某些情況下,事務(wù)日志可能會變得非常大,以致用盡空間或變滿。通常,在事務(wù)日志文件占盡可用磁盤空間且不能再擴展時,您將收到如下錯誤消息:
Error:9002, Severity:17, State:2
The log file for database '%.*ls' is full.
除了出現(xiàn)此錯誤消息之外,SQL Server 還可能因為缺少事務(wù)日志擴展空間而將數(shù)據(jù)庫標(biāo)記為 SUSPECT。有關(guān)如何從此情形中恢復(fù)的其他信息,請參見 SQL Server 聯(lián)機幫助中的"磁盤空間不足"主題。
另外,事務(wù)日志擴展可能導(dǎo)致下列情形:
· 非常大的事務(wù)日志文件。
· 事務(wù)可能會失敗并可能開始回滾。
· 事務(wù)可能會用很長時間才能完成。
· 可能發(fā)生性能問題。
· 可能發(fā)生阻塞現(xiàn)象。
原因
事務(wù)日志擴展可能由于以下原因或情形而發(fā)生:
· 未提交的事務(wù)
· 非常大的事務(wù)
· 操作:DBCC DBREINDEX 和 CREATE INDEX
· 在從事務(wù)日志備份還原時
· 客戶端應(yīng)用程序不處理所有結(jié)果
· 查詢在事務(wù)日志完成擴展之前超時,您收到假的"Log Full"錯誤消息
· 未復(fù)制的事務(wù)
解決方法:
日志文件滿而造成SQL數(shù)據(jù)庫無法寫入文件時,可用兩種方法:
一種方法:清空日志。
1.打開查詢分析器,輸入命令
DUMP TRANSACTION 數(shù)據(jù)庫名 WITH NO_LOG
2.再打開企業(yè)管理器--右鍵你要壓縮的數(shù)據(jù)庫--所有任務(wù)--收縮數(shù)據(jù)庫--收縮文件--選擇日志文件--在收縮方式里選擇收縮至XXM,這里會給出一個允許收縮到的最小M數(shù),直接輸入這個數(shù),確定就可以了。
另一種方法有一定的風(fēng)險性,因為SQL SERVER的日志文件不是即時寫入數(shù)據(jù)庫主文件的,如處理不當(dāng),會造成數(shù)據(jù)的損失。
1.分離數(shù)據(jù)庫 企業(yè)管理器->服務(wù)器->數(shù)據(jù)庫->右鍵->分離數(shù)據(jù)庫
2:刪除LOG文件
附加數(shù)據(jù)庫 企業(yè)管理器->服務(wù)器->數(shù)據(jù)庫->右鍵->附加數(shù)據(jù)庫
此法生成新的LOG,大小只有500多K。
注意:建議使用第一種方法。
如果以后,不想要它變大。
sql2000下使用:
在數(shù)據(jù)庫上點右鍵->屬性->選項->故障恢復(fù)-模型-選擇-簡單模型。
或用SQL語句:
alter database 數(shù)據(jù)庫名 set recovery simple
另外,如上圖中數(shù)據(jù)庫屬性有兩個選項,與事務(wù)日志的增長有關(guān):
Truncate log on checkpoint
(此選項用于SQL7.0,SQL 2000中即故障恢復(fù)模型選擇為簡單模型)
當(dāng)執(zhí)行CHECKPOINT 命令時如果事務(wù)日志文件超過其大小的70% 則將其內(nèi)容清除在開發(fā)數(shù)據(jù)庫時時常將此選項設(shè)置為True Auto shrink定期對數(shù)據(jù)庫進行檢查當(dāng)數(shù)據(jù)庫文件或日志文件的未用空間超過其大小的25%時,系統(tǒng)將會自動縮減文件使其未用空間等于25% 當(dāng)文件大小沒有超過其建立時的初始大小時不會縮減文件縮減后的文件也必須大于或等于其初始大小對事務(wù)日志文件的縮減只有在對其作備份時或?qū)runcate log on checkpoint 選項設(shè)為True 時才能進行。
注意:一般立成建立的數(shù)據(jù)庫默認(rèn)屬性已設(shè)好,但碰到意外情況使數(shù)據(jù)庫屬性被更改,請用戶清空日志后,檢查數(shù)據(jù)庫的以上屬性,以防事務(wù)日志再次充滿。
關(guān)鍵詞標(biāo)簽:SQL,Server,日志文件
相關(guān)閱讀
熱門文章 SqlServer2005對現(xiàn)有數(shù)據(jù)進行分區(qū)具體步驟sql server系統(tǒng)表損壞的解決方法MS-SQL2005服務(wù)器登錄名、角色、數(shù)據(jù)庫用戶Access、SQL Server、Oracle常見應(yīng)用的區(qū)別
人氣排行 如何遠(yuǎn)程備份(還原)SQL2000數(shù)據(jù)庫SQL2000數(shù)據(jù)庫遠(yuǎn)程導(dǎo)入(導(dǎo)出)數(shù)據(jù)配置和注冊O(shè)DBC數(shù)據(jù)源-odbc數(shù)據(jù)源配置教程SQL2000和SQL2005數(shù)據(jù)庫服務(wù)端口查看或修改SQL Server 2005降級到2000的正確操作步驟修改Sql Server唯一約束教程淺談JSP JDBC來連接SQL Server 2005的方法SQL Server創(chuàng)建表語句介紹