概述MSDB数据库是可见的4个系统数据库之一,另外3个分别是master、model和TempDB。MSDB的目的是跟踪一系列常见的DBA活动历史记录,例如备份和还原。它还包含所有SQLServer代理数据,包括作业、步骤、运算符、警报和执行历史记录。有时MSDB用于存储SSIS包,尽管它更常存储在实例上的SSIS目录数据库中。让我们来讨论一下MSDB的一些特点MSDB的特点1.备份和恢复历史存储在msdb中msdb包含备份和恢复历史。因此,我们几乎可以通过查询对应的表来获取执行备份的所有信息。在SSMS中,我们可以在msdb>Tables>SystemTables下找到这些表:例如,备份集表包含有关每个备份集的信息。如果我们没有在实例上执行任何备份,这个表将是空的:SELECT*FROM[msdb].[dbo].[backupset]如我们所见,备份集表中没有行:现在,让我们做一个backupandsee查看相关信息如何存储在表中。为此,我们右键单击SSMS上的用户数据库,选择任务>备份...:然后,我们选择备份类型(我们选择了完整备份)和备份文件的名称:当备份是完成,我们再次运行之前的查询,可以看到backupset表现在返回了数据。它包含执行的备份记录:如果我们想获得有关在实例上执行的备份的更多详细信息,我们可以对备份表运行关系查询。例如,以下查询返回在实例上成功完成的每个备份的数据库名称、备份文件名和路径、备份类型、大小、开始和完成日期:USEmsdbGOSELECTbs.database_name,bmf.physical_device_name,CASEbs。输入WHEN'D'然后'FULL'当'I'然后'DIFFERENTIAL'当'L'然后'TRNSACTIONLOG'ELSEbs.typeENDASBackupType,bs.backup_sizeASBackupSizeInBytes,bs.backup_start_date,backup_finish_dateFROMbmfINNERdJOINbmf.media_set_id=bs.media_set_id列出如下:2.msdb数据库包含有关SQLServer代理作业的信息。有关SQLServer代理作业的信息也存储在msdb数据库中。例如,我们可以使用以下查询检索当前实例上作业的一些详细信息:USEmsdbGOSELECTj.name,jh.run_date,jh.step_name,jh.run_time,jh.run_durationFROMsysjobsjINNERJOINsysjobhistoryjhONj。job_id=jh.job_id我们使用msdb数据库的sysjobs和sysjobhistory表来查看实例中的job执行历史。结果为空,说明还没有jobhistory:3.msdb数据库包含了创建jobs、steps、schedules等的存储过程,上面我们使用SSMS可视化界面创建了一个job。也可以使用相应的存储过程通过T-SQL代码创建作业。这些程序存储在msdb数据库中。为了更好地理解我们正在讨论的存储过程,让我们为上面创建的作业生成创建脚本。我们右键单击作业名称,选择ScriptJobas>CREATETo>NewQueryEditorWindow:在新的查询窗口中我们可以看到用于创建作业的完整脚本。为了方便的查找和高亮脚本中使用的msdb数据库的存储过程,我们只需在搜索框中输入msdb:由此我们可以看出msdb数据库的存储过程sp_add_job和sp_add_jobstep是用来创建job和jobsteps的.我们可以在Programmability>StoredProcedures>SystemStoredProcedures下的msdb数据库中找到这些存储过程的代码,然后右键单击其中一个并选择Modify:这些过程只是与作业相关的存储过程的两个示例。msdb中还有其他处理作业的过程,例如删除作业和作业步骤、获取有关SQLServer代理作业的信息等。4.msdb数据库包含维护计划相关信息,但不在“sysdbmaintplan_”表中维护计划相关信息存储在msdb数据库中。让我们创建一个维护计划并查看相关信息的存储位置。在SSMS中,我们使用维护计划向导创建一个新的维护计划:我们选择一个备份数据库(完整)任务为例,为两个数据库创建一个备份数据库任务:创建维护计划后,我们在msdb中找到它相应的信息。当我们展开msdb数据库下的“SystemTables”,可以看到一些以“sysdbmaintplan_”开头的表。这可能会造成混淆,因为一方面,顾名思义,这些表应该包含维护计划相关数据,但另一方面,当我们查询这些表时,它们是空的:USEmsdbGOSELECT*FROMsysdbmaintplansSELECT*FROMsysdbmaintplan_databasesSELECT*FROMsysdbmaintplan_jobsSELECT*FROMsysdbmaintplan_history即使我们执行了维护计划,也可以看到这些表中并没有相关的信息:这是因为这些表中的数据从SQLServer2005开始就没有发生过变化,它们的存在只是为了保留已有的信息,在从旧版本升级的情况。根据Microsoft的说法,上表将在SQLServer的未来版本中弃用。但是,有关维护计划的信息可以在SSIS包相关表中找到。由于任何维护计划都会创建一个由SQLServer代理作业运行的SSIS包,如果我们查询msdb数据库中的sysssispackages和sysssispackagefolders表,我们可以在那里找到有关我们的维护计划的信息:USEmsdbGOSELECT*FROMsysssispackagesSELECT*FROMsysssispackagefolders在结果集中,上面创建的维护计划相关信息以红色突出显示:5.msdb数据库包含与日志传送相关的信息日志传送相关信息和存储过程也存储在msdb数据库中。如果我们使用“log_shipping”关键字过滤msdb数据库的系统表,我们可以看到日志传送相关的表:如果我们在系统存储过程中使用相同的关键字,我们可以找到用于配置和监控日志传送的存储过程:结论总之,在本文中我们讨论了msdb数据库的一些重要特性。我们看到与备份恢复以及SQLServer代理作业、维护计划和日志传送相关的信息存储在msdb中。此外,msdb库中还有存储过程,用于实施和监控不同的数据库任务,例如创建SQLServer代理作业或配置日志传送。
