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