系统库- SQL Server隐藏系统库Resource Database探究
概述
对于许多熟悉 SQL Server 的人来说, 系统数据库只与四个数据库相关联 ,它们分别是master、 model、 msdb、 tempdb。即使在 SQL Server Management Studio (SSMS) 中,当我们打开系统数据库时,也只能看到这四个数据库(我们说的是经典配置,其中一些其他功能没有配置,例如复制)。但是,除了这些数据库之外,还有一个第五个系统数据库,称为资源数据库。我们将在本文中讨论这个不太熟悉的系统数据库,并介绍有关该数据库一些特性。
特性
如前所述,当我们 在 SSMS 的对象资源管理器中打开“系统数据库”时,我们只能看到四个数据库(master、 model、 msdb、 tempdb):
我们可以没有看到资源库出现。这个“隐藏”数据库是什么以及它的用途是什么?好吧,资源数据库是一个系统数据库,它使 SQL Server 升级到新版本的过程更容易、更快。现在,让我们探讨一下有关资源数据库的一些特性。
1、资源数据库是只读数据库,包含所有系统对象
实际上,逻辑上在每个数据库的 sys 模式中的所有系统对象,在物理上都位于资源数据库中。例如,在 SSMS 中,如果我们在任何数据库的“视图”下展开“系统视图”,我们可以在 sys 模式中看到许多视图:
这些视图中的数据存储在资源数据库中,事实上,如果我们从这些视图之一读取数据,就会从资源数据库中读取:
SELECT [name]
,[object_id]
,[principal_id]
,[schema_id]
,[parent_object_id]
,[type]
,[type_desc]
,[create_date]
,[modify_date]
,[is_ms_shipped]
,[is_published]
,[is_schema_published]
FROM [NewDB].[sys].[objects]
但是,如果我们尝试直接访问资源数据库,则会收到错误信息:
另外,我们只能读取资源数据库的数据,不能更改。值得一提的是,资源数据库不存储用户数据、用户元数据或实例相关的数据。
2、 资源数据库有助于将 SQL Server 升级到更新版本
在旧版本的 SQL Server 中,升级时需要资源数据库来删除和重新创建系统对象。然而,在较新的版本中,多亏了资源数据库,系统对象可以通过复制资源数据库文件来传输(因为它包含所有这些对象)。在 SQL Server 2000 及更早的版本中,没有资源数据库。它是在 SQL Server 2005 中引入的,因此使升级更容易和更快。
3、资源数据库的 ID 是 32767
SQL Server 实例中的每个数据库都有一个 ID。一个实例最多可以容纳32767个数据库,这个数也是资源库ID,对于任何实例中的任何资源库都是恒定的。因此,实际上,资源数据库被分配了实例中可能的最大数据库 ID。话虽如此,资源数据库,因此,它的 ID 通过 sys.databases表是不可见的:
SELECT * FROM sys.databases
在结果中,我们可以看到列出了所有系统和用户数据库及其 ID,但没有列出资源数据库:
使用DB_ID()和DB_NAME()函数时,有关资源数据库的信息也不可用
但是,相同的函数不返回有关资源数据库的任何信息:
--Resource database
SELECT DB_ID( 'resource' ) AS 'resource db DBID'
SELECT DB_NAME(32767) AS 'resource'
在这两种情况下都返回NULL :
如果查询有关资源数据库的一些信息,可以使用下面的查询:
SELECT SERVERPROPERTY('ResourceVersion') AS 'ResourceVersion'
SELECT SERVERPROPERTY('ResourceLastUpdateDateTime') AS 'ResourceLastUpdateDateTime'
结果显示资源数据库的版本和资源数据库上次更新的时间:
4、 不支持移动资源数据库文件
资源数据库包含一个数据和一个日志文件,分别称为mssqlsystemresource.mdf 和mssqlsystemresource.ldf。
这些文件的位置是“ <驱动器号>:\Program Files\Microsoft SQL Server\MSSQL<version num>.<instance_name>\MSSQL\Binn\”。在我们的示例中,这个位置是“ C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\Binn\”, 所以我们可以在这个位置找到这些文件:
我们可以通过以下查询检索资源数据库文件的位置:
SELECT * FROM sys.sysaltfiles WHERE dbid = 32767
正如我们前面已经讨论的, 32767 是资源数据库 ID。
5、无法使用 SQL Server 备份来备份和恢复资源数据库
我们无法执行传统的备份和恢复方法来备份或恢复资源数据库。为了备份这个数据库,我们可以备份数据库文件。值得一提的是,虽然资源数据库的数据文件扩展名为.mdf,但我们应该将其视为 .exe文件。备份文件可用于通过将它们复制到相应位置来恢复资源数据库。
结论
因此,SQL Server有五个系统数据库,而不是人们想象的四个。资源数据库是第五个“隐藏”数据库,它是只读数据库,包含 SQL Server 的所有系统对象。它用于使 SQL Server 的升级过程更快、更容易。此数据库无法备份和恢复(使用传统的 SQL Server 方法),并且其数据和日志文件的位置也无法更改。它有一个固定的数据库 ID 32767,这是每个实例的最大数据库数。
微信赞赏

支付宝赞赏

【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步