系統庫-SQL Server MSDB探究
概述
MSDB 數據庫是 4 個可見系統數據庫之一,另外3個分別是master、model 和 TempDB 。MSDB目的是跟蹤一系列常見 DBA 活動歷史記錄,如備份和恢復。它還包含 SQL Server 代理的所有數據,包括作業、步驟、運算符、警報和執行歷史記錄。有時 MSDB 用于存儲 SSIS 包,盡管它更常見地存儲在實例上的 SSIS 目錄數據庫中。下面探討一下MSDB一些特性
MSDB特性
1、備份和恢復歷史存儲在 msdb 中
msdb 包含備份還原歷史記錄。因此,我們可以通過查詢相應的表來獲得幾乎所有關于已執行備份的信息。在 SSMS 中,我們可以在msdb > Tables > System Tables下找到這些表:
例如,backupset表包含有關每個備份集的信息。如果我們沒有對實例執行任何備份,則此表將為空:
SELECT * FROM [msdb].[dbo].[backupset]
如我們所見,備份集表中沒有行:
現在,讓我們進行備份,看看相關信息是如何存儲在表中的。為此,我們右鍵單擊 SSMS 上的用戶數據庫,選擇 任務 > 備份...:
然后,我們選擇備份類型(我們選擇了完整備份)和備份文件的名稱:
備份完成后,我們再次運行之前的查詢,可以看到backupset表現在返回了數據。它包含已執行備份的記錄:
如果我們想要獲取在實例上執行的備份的更詳細信息,可以運行關于備份表的關聯查詢。例如,下面的查詢返回實例上成功完成的每個備份的數據庫名稱、備份文件名和路徑、備份類型、大小、開始和完成日期:
USE msdb
GO
SELECT bs.database_name, bmf.physical_device_name,
CASE bs.type WHEN 'D' THEN 'FULL'
WHEN 'I' THEN 'DIFFERENTIAL'
WHEN 'L' THEN 'TRNSACTION LOG'
ELSE bs.type
END AS BackupType,
bs.backup_size AS BackupSizeInBytes,
bs.backup_start_date, backup_finish_date
FROM
backupmediafamily bmf
INNER JOIN
msdb.dbo.backupset bs
ON bmf.media_set_id = bs.media_set_id
示列如下:
2、msdb 數據庫包含 SQL Server 代理作業相關信息
SQL Server 代理作業的信息也存儲在 msdb 數據庫中。例如,通過使用下面的查詢,我們可以檢索當前實例上作業的一些詳細信息:
USE msdb
GO
SELECT j.name,
jh.run_date,
jh.step_name,
jh.run_time,
jh.run_duration
FROM
sysjobs j
INNER JOIN
sysjobhistory jh
ON j.job_id = jh.job_id
我們使用msdb 數據庫的sysjobs和sysjobhistory表來查看實例中的作業執行歷史記錄。結果為空,這意味著還沒有作業歷史記錄:
3、 msdb 數據庫包含用于創建作業、步驟、計劃等存儲過程
上面,我們使用 SSMS 可視化界面創建了一個作業。也可以使用相應的存儲過程通過 T-SQL 代碼創建作業。這些過程存儲在 msdb 數據庫中。為了更好地理解我們正在談論的存儲過程,讓我們生成上面創建的作業的創建腳本。我們右鍵單擊作業名稱,選擇Script Job as > CREATE To > New Query Editor Window:
在新的查詢窗口中,我們可以看到用于創建作業的完整腳本。為了輕松找到并突出顯示腳本中使用的 msdb 數據庫的存儲過程,我們只需在搜索框中 鍵入msdb :
由此可見,msdb數據庫的sp_add_job和sp_add_jobstep 存儲過程是用來創建作業和作業步驟的。我們可以通過在 msdb 數據庫的Programmability > Stored Procedures > System Stored Procedures下,找到這些存儲過程的代碼, 然后右鍵單擊其中一個并選擇 Modify:
這些過程只是與作業相關的存儲過程的兩個示例。在 msdb 中還有其他處理作業的過程,例如刪除作業和作業步驟、獲取 SQL Server 代理作業相關信息等過程。
4、msdb 數據庫包含與維護計劃相關的信息,但不在“sysdbmaintplan_”表中
維護計劃相關信息存儲在 msdb 數據庫中。讓我們創建一個維護計劃并查看相關信息的存儲位置。在 SSMS 中,我們使用維護計劃向導創建一個新的維護計劃:
我們選擇一個備份數據庫(完整)任務作為示例,并為兩個數據庫創建一個備份數據庫任務:
創建好維護計劃后,我們在msdb中查找相應的信息。當我們展開msdb 數據庫下的“System Tables” 時,我們可以看到一些以“sysdbmaintplan_”開頭的表。這可能會令人困惑,因為一方面,顧名思義,這些表應該包含維護計劃相關的數據,但另一方面,當我們查詢這些表時,它們是空的:
USE msdb
GO
SELECT * FROM sysdbmaintplans
SELECT * FROM sysdbmaintplan_databases
SELECT * FROM sysdbmaintplan_jobs
SELECT * FROM sysdbmaintplan_history
即使我們執行了維護計劃,我們也可以看到這些表中沒有相關信息:
這是因為從 SQL Server 2005 開始,這些表中的數據沒有更改,它們的存在只是為了保留現有信息,以防從舊版本升級。根據微軟的說法,上述表將在 SQL Server 的未來版本中進行剔除。但是,可以在 SSIS 包相關表中找到有關維護計劃的信息。由于任何維護計劃都會創建一個由 SQL Server 代理作業運行的 SSIS 包,如果我們查詢 msdb 數據庫中的sysssispackages和sysssispackagefolders 表,我們可以在那里找到有關我們的維護計劃的信息:
USE msdb
GO
SELECT * FROM sysssispackages
SELECT * FROM sysssispackagefolders
在結果集中,上面創建的維護計劃相關信息以紅色突出顯示:
5、msdb 數據庫包含與日志傳送相關的信息
日志傳送相關信息和存儲過程也存儲在 msdb 數據庫中。如果我們使用“log_shipping”關鍵字過濾msdb數據庫的系統表,我們可以看到日志傳送相關的表:
如果我們在系統存儲過程中使用相同的關鍵字,我們可以找到配置和監控日志傳送的存儲過程:
結論
綜上所述,在本文中,我們論述了 msdb 數據庫的一些重要特性。我們看到備份恢復相關信息以及 SQL Server 代理作業、維護計劃和日志傳送相關信息都存儲在 msdb 中。此外,在 msdb 庫中還有用于實現和監控不同數據庫任務的存儲過程,例如創建 SQL Server 代理作業或配置日志傳送等。