2022-09-30 16:58阅读: 513评论: 0推荐: 0

系统库- SQL Server隐藏系统库Resource Database探究

概述

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

特性

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

image-20220930155815923

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

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

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

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()函数时,有关资源数据库的信息也不可用

query results

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

--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.mdfmssqlsystemresource.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,这是每个实例的最大数据库数。

posted @   雪竹子  阅读(513)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
💬
评论
📌
收藏
💗
关注
👍
推荐
🚀
回顶
收起