概述

对于许多熟悉 SQL Server 的人来说, 系统数据库只与四个数据库相关联 ,它们分别是master、 model、 msdb、 tempdb。即使在 SQL Server Management Studio (SSMS) 中,当我们打开系统数据库时,也只能看到这四个数据库(我们说的是经典配置,其中一些其他功能没有配置,例如复制)。但是,除了这些数据库之外,还有一个第五个系统数据库,称为资源数据库。我们将在本文中讨论这个不太熟悉的系统数据库,并介绍有关该数据库一些特性。

特性

如前所述,当我们 在 SSMS 的对象资源管理器中打开“系统数据库”时,我们只能看到四个数据库(master、 model、 msdb、 tempdb):

sqlserver收缩数据可用空间(系统库-SQLServer隐藏系统库Resource)(1)

我们可以没有看到资源库出现。这个“隐藏”数据库是什么以及它的用途是什么?好吧,资源数据库是一个系统数据库,它使 SQL Server 升级到新版本的过程更容易、更快。现在,让我们探讨一下有关资源数据库的一些特性。

1、资源数据库是只读数据库,包含所有系统对象

实际上,逻辑上在每个数据库的 sys 模式中的所有系统对象,在物理上都位于资源数据库中。例如,在 SSMS 中,如果我们在任何数据库的“视图”下展开“系统视图”,我们可以在 sys 模式中看到许多视图:

sqlserver收缩数据可用空间(系统库-SQLServer隐藏系统库Resource)(2)

这些视图中的数据存储在资源数据库中,事实上,如果我们从这些视图之一读取数据,就会从资源数据库中读取:

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]

sqlserver收缩数据可用空间(系统库-SQLServer隐藏系统库Resource)(3)

但是,如果我们尝试直接访问资源数据库,则会收到错误信息:

sqlserver收缩数据可用空间(系统库-SQLServer隐藏系统库Resource)(4)

另外,我们只能读取资源数据库的数据,不能更改。值得一提的是,资源数据库不存储用户数据、用户元数据或实例相关的数据。

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,但没有列出资源数据库:

sqlserver收缩数据可用空间(系统库-SQLServer隐藏系统库Resource)(5)

使用DB_ID()DB_NAME()函数时,有关资源数据库的信息也不可用

sqlserver收缩数据可用空间(系统库-SQLServer隐藏系统库Resource)(6)

但是,相同的函数不返回有关资源数据库的任何信息:

--Resource database SELECT DB_ID( 'resource' ) AS 'resource db DBID' SELECT DB_NAME(32767) AS 'resource'

在这两种情况下都返回NULL :

sqlserver收缩数据可用空间(系统库-SQLServer隐藏系统库Resource)(7)

如果查询有关资源数据库的一些信息,可以使用下面的查询:

SELECT SERVERPROPERTY('ResourceVersion') AS 'ResourceVersion' SELECT SERVERPROPERTY('ResourceLastUpdateDateTime') AS 'ResourceLastUpdateDateTime'

结果显示资源数据库的版本和资源数据库上次更新的时间:

sqlserver收缩数据可用空间(系统库-SQLServer隐藏系统库Resource)(8)

4、 不支持移动资源数据库文件

资源数据库包含一个数据和一个日志文件,分别称为mssqlsystemresource.mdfmssqlsystemresource.ldf

这些文件的位置是“ <驱动器号>:\Program Files\Microsoft SQL Server\MSSQL<version num>.<instance_name>\MSSQL\Binn\”。在我们的示例中,这个位置是“ C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\Binn\”, 所以我们可以在这个位置找到这些文件:

sqlserver收缩数据可用空间(系统库-SQLServer隐藏系统库Resource)(9)

我们可以通过以下查询检索资源数据库文件的位置:

SELECT * FROM sys.sysaltfiles WHERE dbid = 32767

正如我们前面已经讨论的, 32767 是资源数据库 ID。

sqlserver收缩数据可用空间(系统库-SQLServer隐藏系统库Resource)(10)

5、无法使用 SQL Server 备份来备份和恢复资源数据库

我们无法执行传统的备份和恢复方法来备份或恢复资源数据库。为了备份这个数据库,我们可以备份数据库文件。值得一提的是,虽然资源数据库的数据文件扩展名为.mdf,但我们应该将其视为 .exe文件。备份文件可用于通过将它们复制到相应位置来恢复资源数据库。

结论

SQL Server有五个系统数据库,而不是人们想象的四个。资源数据库是第五个“隐藏”数据库,它是只读数据库,包含 SQL Server 的所有系统对象。它用于使 SQL Server 的升级过程更快、更容易。此数据库无法备份和恢复(使用传统的 SQL Server 方法),并且其数据和日志文件的位置也无法更改。它有一个固定的数据库 ID 32767,这是每个实例的最大数据库数。首文在本人博客https://www.cnblogs.com/lkj371/p/16745508.html发表,转载请注明出处。

,