1. 程式人生 > >MSSQL數據庫後臺進程(線程)

MSSQL數據庫後臺進程(線程)

也會 完成 磁盤 xtend handle 導致 inner sql數據庫 使用

與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數據庫後臺進程(線程)