本篇文章為大家展示了如何理解MSSQL數據庫后臺進程,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。
與Oracle數據庫類似,微軟數據庫產品MSSQL也有諸多后臺進程來保證數據庫系統的高效正常運轉,由于MSSQL采用的是線程模型,應該叫做后臺線程,為了大家易于理解,我們在暫且稱之為后臺進程,下面我們就來簡要看一下:
與Oracle數據庫類似,微軟數據庫產品MSSQL也有諸多后臺進程來保證數據庫系統的高效正常運轉,由于MSSQL采用的是線程模型,應該叫做后臺線程,為了大家易于理解,我們在暫且稱之為后臺進程,下面我們就來簡要看一下:
1、 數據寫相關進程
1) Lazy writer:該進程用來確保系統緩沖區(buffer pool)中有足夠的自由內存,該進程定期掃描緩沖內存頁,以發現不常使用的內存頁并將其移出緩沖區,期間,會先將臟頁數據寫出到磁盤并移除緩沖區。
2) Eager writer:和lazy writer類似,該進程也是負責將緩沖區內的臟頁寫出到磁盤,但它寫出的這些內存頁主要是和非日志(non-logged,例如:bulk insert,select into)操作相關,期間,允許讀寫新頁并行發生。
3) Checkpoint:該進程定期掃描緩沖區以發現特定數據庫的臟頁,并將這些臟頁寫出到磁盤,通過創建一個在此之前確認所有臟頁都寫出到磁盤的時間點,可以減少最近數據庫恢復需要的時間。用戶可以通過提交checkpoint命令來請求一個檢查點操作,或者系統也可以根據消耗的日志空間或時間自動產生一個檢查點操作,此外,當系統中的某些事件也會導致檢查點的發生,例如:增減或移除數據文件或日志文件,實例的關閉等。當檢查點發生時,該進程將緩沖區內的臟頁寫出到磁盤,無論相關事務是否已經提交,都要寫出到磁盤。
值得一提的是,這三個后臺進程都是異步的,即它們在進行IO操作的同時可以去做其他工作,稍后再來檢查之前IO的完成情況。
2、 事務日志相關進程
1) Log writer:該進程負責將事務日志從緩沖區刷出到磁盤日志文件。MSSQL2016前的版本,每個實例只有一個log writer進程,因此,該進程負責實例中的所有數據庫log buffer。該進程通過異步IO完成log buffer到磁盤的寫出,當用戶提交一個事務時,該進程阻塞該用戶會話,直到將相關數據庫log buffer數據刷出到磁盤完成,同時,該進程還可以繼續其他數據庫log buffer的工作。MSSQL系統中的諸多事件都會觸發log writer進程向磁盤寫出log buffer中的內容,例如:會話提交當前事務,log buffer被寫滿,checkpoint等。
此外,該進程將lredo記錄從log cache/buffer寫出到磁盤log files時,寫出單位是可以變化的,從512~64k不等,這點來說,不像data buffer寫出進程一樣,最小必須是數據頁大小。
2) Backup log:該進程雖然嚴格來說算不上一個后臺進程,因為它用于完成用戶發出的“backup log…”命令,但它卻是和事務日志緊密相關。
3、 系統監視和管理相關進程
1) Signal handler:該進程主要負責MSSQL實例的啟動和關閉。
2) Task manager:該進程也會參與MSSQL實例的啟動過程,主要用來啟動實例相關的所有數據庫。此外,該進程還負責啟動MSSQL內部某些任務,以及監視實例服務進程和啟動時間等任務。
3) Resource monitor:該進程主要負責監視內存層面的使用和狀態,并在必要時對MSSQL相關緩沖進行調整,當檢測到沒有用戶需求被處理時,將自動進入空閑狀態。
4) Lock monitor:該進程負責監視阻塞時間超過系統相關閾值的場景,同時,還負責解決死鎖問題。
5) Ghost cleanup:該進程會周期性的喚醒,并對所有索引中已被標記為刪除的索引項進行檢查,然后,將這些索引項物理移除。
6) Trace queue task:該進程負責監視跟蹤文件和行集供應者。對跟蹤文件,該進程每4秒就會將數據刷出到磁盤文件;對行集,將會關閉超過10分鐘沒收到任何事件的供應者。
4、 作業調度相關進程
SQLServer Agent:嚴格來說,這并不算是一個后臺進程,而是windows服務,該服務負責完成各種作業的調度和執行。
5、 其他相關進程
1) XE Timer和XE Dispatcher:這些是擴展事件(Extended Event)相關的進程,負責定期將收集到的數據從緩沖異步發送到目的地。
2) BRKR EVENT HNDLR和BRKR TASK:這些事件是服務代理人(Service Broker)相關進程。前者主要負責處理服務代理的所有啟動和關閉事件;后者為執行內部服務代理任務的眾多進程之一。
我們可以通過如下SQL來查詢MSSQL實例后臺進程相關的信息:
select t.os_thread_id,r.session_id,r.status,r.command
from sys.dm_os_threads t inner join sys.dm_os_workers w on t.thread_address=w.thread_address
inner join sys.dm_exec_requests r on w.task_address=r.task_address
where r.status like '%background%';
上述內容就是如何理解MSSQL數據庫后臺進程,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。