解決簡單恢復模式下產生的日誌增長
簡介
最近測試伺服器進行資料歸檔,其間程式設計師發現一個問題,空間不足,我檢視原因發現日誌檔案暴漲。然後將資料庫改為簡單恢復模式,但是依然存在這個問題。經過查詢資料發現了日誌檔案在簡單模式下依然增加的原因。
Simple概念
Simple恢復模式也叫做”Checkpoint with truncate log“,其實這個名字更形象,在Simple模式下,SQL Server會在每次checkpoint或backup之後自動截斷log,也就是丟棄所有的閒置日誌記錄,僅保留用於例項啟動時自動發生的instance recovery所需的少量log,這樣做的好處是log檔案非常小,不需要DBA去維護、備份log,但壞處也是顯而易見的,就是一旦資料庫出現異常,需要恢復時,最多隻能恢復到上一次的備份,無法恢復到最近可用狀態,因為log丟失了。
Checkpoint
CheckPoint和lazyWriter一樣,都會將緩衝區內臟資料寫入到磁碟,同時在簡單恢復模式下截斷日誌;lazyWriter快取不足的時候會觸發執行,這裡我們暫且不做討論。
針對CheckPoint我請教了Careyson以後總結出以下幾個觸發其執行的原因:
- 一些Internal CheckPoint時,比如說關閉資料庫例項等。
- 資料庫完整備份或差異備份(日誌備份不會觸發checkpoint)。
- 資料庫恢復模式為簡單恢復模式下當日志文件使用超過70%時。
- CheckPoint執行的時間間隔閾值被足夠多的日誌記錄超過。
- 手動執行CheckPoint。
場景描述:
Simple模式主要用於非critical的業務,比如開發庫和測試庫,那麼這次由於測試環境的磁碟緊張我們也都採用了簡單模式。但是資料歸檔發生時依然產生了大量的日誌,並且增加了磁碟佔用,這又是什麼原因那?因為我們在歸檔處理中使用了大量的insert和delete以及update操作,這樣話,短時間內產生了大量的日誌,這個時候日誌迅速增加;又因為在SQL Server中,CheckPoint是一個完整的過程,這個過程的耗時取決於髒資料的大小。一旦在很短時間內,日誌的CheckPoint沒完成的時候日誌增加超過了日誌的規定上限。則將產生更多的日誌。
如上所述,產生這個問題的原因就是:CheckPoint時間間隔閾值被足夠多的日誌記錄超過,觸發CheckPoint才寫入磁碟。
下面這個例項來自於:
讓我們用一個指令碼來實際的闡明這種行為。首先在一個測試資料庫中執行一下指令碼建立一個測試表並填充一些資料。
測試資料庫設定:
1.設定為簡單的恢復模式。
2.日誌的大小為100M。
3.日誌檔案的自動增長被禁用(因為觀察日誌空間被用完的錯誤比檢查自動增長要容易)。
--建立表並初始化資料create table test(i int, c char(1000))
go
declare @i int
set @i = 1
while @i < 10000 --插入9999條測試資料
begin
insert test values(@i, 'abc')
set @i = @i + 1
end
執行以下指令碼,觀察資源競爭:
set nocount on godeclare @change_size int
set @change_size = 100 -- 根據需要來調整這個值
declare @i int
set @i = 1
while @i < 100
begin
if @i % 2 = 0
update test set c = replicate('a', @change_size)
else
update test set c = replicate('b', @change_size)
select @i = @i + 1
end
反覆根據修改@change_size來看結果,當我將@change_size改為120甚至更大時,得到了9002的錯誤資訊,非常準確的告訴我資料庫的事務日誌已滿。
通過上面這個引用的例子,很好地再現了問題的產生機制,那麼我們怎麼處理這個情況那?
解決
方案1:
強制執行CheckPoint。但是執行後有個很不好的影響,嚴重影響了儲存過程的執行時間。由此可知這樣做很消耗效能啊。
方案2:
縮短CheckPoint時間間隔閾值。
預設值是0,意味著由SQL Server來管理這個回覆間隔。
也可以SQL語句實現這個功能:
方案3:
增大日誌檔案大小。
總結:
日誌檔案是一個雙刃劍,WAL機制很好的保證了資料的一致性和維護性。但是也產生了額外的效能和維護的成本的上升。需要我們根據實際情況去處理這些不同的情景。需要注意的是在TempDB中是不會產生日誌的,除非手動執行。除此之外,並非所有的時間間隔後都會產生日誌,因為當資料很少的時候有可能不觸發Checkpoint執行。
相關推薦
解決簡單恢復模式下產生的日誌增長
簡介 最近測試伺服器進行資料歸檔,其間程式設計師發現一個問題,空間不足,我檢視原因發現日誌檔案暴漲。然後將資料庫改為簡單恢復模式,但是依然存在這個問題。經過查詢資料發現了日誌檔案在簡單模式下依然增加的原因。 Simple概念 Simple恢復模式也叫做”Checkpoint with trunc
(2.6)備份與還原--在簡單恢復模式下事務日誌的角色
除了 空間 ble 暫時 cover recovery html AC truncated 簡介 在簡單恢復模式下,日誌文件的作用僅僅是保證了SQL Server事務的ACID屬性。並不承擔具體的恢復數據的角色。正如”簡單”這個詞的字面意思一樣,數據的備份和恢復僅僅
(2.7)備份與還原--在完全恢復模式下事務日誌的角色
ges 需要 很多 對數 for 事情 mage .com .html 簡介 生產環境下的數據是如果可以寫在資產負債表上的話,我想這個資產所占的數額一定不會小。而墨菲定律(事情如果有變壞的可能,無論這種可能性有多小,它總會發生)仿佛是給DBA量身定做的。在上篇文章介
(2.8)備份與還原--在大容量恢復模式下事務日誌的角色
數據一致性 過程 使用 非正常關閉 cnblogs 地方 重建 結構 恢復 簡介 日誌的作用是保證持久性和數據一致性,通過日誌可以實現數據的Undo與Redo,因此通過日誌,SQL Server不僅僅可以實現災難恢復,還可以通過日誌的Redo來實現高可用性。本篇文章
SQL Server事務日誌管理的進階,第5級:在完全恢復模式下管理日誌
SQL Server事務日誌管理的進階,第5級:在完全恢復模式下管理日誌 原文連結:http://www.sqlservercentral.com/articles/Stairway+Series/73785/ 託尼·戴維斯(Tony Davis)著,2012年1月27日
sql伺服器第5級事務日誌管理的階梯:完全恢復模式下的日誌管理
sql伺服器第5級事務日誌管理的階梯:完全恢復模式下的日誌管理 原文連結http://www.sqlservercentral.com/articles/Stairway+Series/73785/ 作者 Tony Davis, 2012/01/27 系列 本文是階
翻譯《Stairway to SQL Server Replication: Level 5- Managing the Log in Full Recovery Mode》 SQL Server事務日誌管理的進階,第5級:在完全恢復模式下管理日誌
SQL Server事務日誌管理的進階,第5級:在完全恢復模式下管理日誌 SQL Server事務日誌管理的進階,第5級:在完全恢復模式下管理日誌 作者:託尼·戴維斯(Tony Davis) 時間:2012年1月27日 原文連結:http://www.sqlser
第五次翻譯:SQL Server事務日誌管理的進階,第5級:在完全恢復模式下管理日誌
SQL Server中事務日誌管理的階梯,第5級:在完全恢復模式下管理日誌 作者:Tony Davis,2012/01/27 文章轉載自:http://www.sqlservercentral.com/articles/Stairway+Series/73785/ 該系列
pm2 cluster模式下log4js日誌不列印問題
上禮拜第一次使用pm2的cluster模式,因為我的是node,利用pm2的cluster模式比較簡單,採坑採坑; 常規操作就是在pm2啟動檔案配置 instances 和 exec_mode 欄位,前一個定義例項個數,後者指定模式(fork / cluster) { "ap
【已解決】開發模式下,微信公眾號自定義選單顯示不全
原因是,最後一個元素有逗號 <?php $appid = "wx111111111111111"; $appsecret = "2222222222222222222222222222"; $url = "https://api.weixin.qq.com/cgi
解決Ubuntu Recovery模式下只讀問題
You should now see a root prompt, something like this: [email protected]:~# At this stage it is possible you have a read-only files
CentOS7.x忘記使用者或者root密碼, 解決單使用者模式下修改密碼不生效的問題
忘記使用者密碼,root密碼出現亂碼的問題,那是因為系統是中文的, 解決方法切換英文命令:LANG=en,不切換也行修改完,記得加這句touch / .autorelabel 目的是更新selinux
Spark執行在Standalone模式下產生的臨時目錄的問題
Spark 的Job任務在執行過程中產生大量的臨時目錄位置,導致某個分割槽磁碟寫滿,主要原因spark執行產生臨時目錄的預設路徑/tmp/spark* 專案中使用的版本情況 Hadoop: 2.7.1 Spark:1.6.0 JDK:1.8.0 1、專案運維需求 線上的
Java 關於策略模式+簡單工廠模式下的思考
導讀 最近在做公司一個訊息閘道器的服務,包括:簡訊、微信、郵件等,所有請求通過一個入口,方便介面的管理(記錄日誌、介面限流白名單啥的)。如何寫這個介面呢,還有為了以後擴充套件,對接過簡訊、微信、公眾號的童鞋大概都瞭解,首先定義一個模板,然後後臺傳入json,替換模板中的值,然後傳送。設計框架大概思路是這樣
oracle 歸檔模式下刪除current日誌不完全恢復
com variable file end mounted 啟動數據庫 lte status archive 歸檔模式 SYS@orcl> archive log list Database log mode Archive Mode Automat
ARCHIVELOG模式下使用者管理恢復聯機重做日誌檔案—當前活動組所有成員全部損壞
1、在關閉狀態下 當前活動組所有成員全部損壞,需要不完全恢復然後resetlogs開啟資料庫。恢復完成後會自動建立一個丟失了的online redo logfile。 [sql] view plain copy print
ARCHIVELOG模式下使用者管理恢復聯機重做日誌檔案—非活動組所有成員全部損壞
聯機重做日誌檔案至少需要兩組,oracle建議每組的成員至少要兩個,也需要多路複用的。因為每組的成員的內容的都是一樣的。同一組內只要有一個成員還存在就可以保證不丟資料的。 1、在open狀態下非活動組所有成員全部損壞,可以重建一個成員。 [sql
檢測到在整合的託管管道模式下不適用的ASP.NET設定的解決方法(非簡單設定為【經典】模式)
我們將ASP.NET程式從IIS6移植到IIS7,可能執行提示以下錯誤: HTTP 錯誤 500.23 - Internal Server Error 檢測到在整合的託管管道模式下不適用的 ASP.NET 設定。 為什麼會出現以上錯誤?
檢測到在整合的託管管道模式下不適用的ASP.NET設定的解決方法(非簡單設定為【經典】模式)。
我們將ASP.NET程式從IIS6移植到IIS7,可能執行提示以下錯誤: HTTP 錯誤 500.23 - Internal Server Error 檢測到在整合的託管管道模式下不適用的 ASP.NET 設定。 為什麼會出現以上錯誤? 在IIS7的應用程式池
關於多執行緒在簡單的懶漢模式下執行緒安全問題的解決
一個簡單的懶漢模式,例如: public class SingleTonDemo { public static void main(String[] args) { // TODO Aut