首页 > 数据库 > 系统库- SQL Server隐藏系统库Resource探究

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

时间:2022-09-30 17:15:42浏览次数:48  
标签:Resource 数据库 系统 Server SQL ID 资源

概述

对于许多熟悉 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,这是每个实例的最大数据库数。

标签:Resource,数据库,系统,Server,SQL,ID,资源
From: https://www.cnblogs.com/lkj371/p/16745508.html

相关文章

  • SQL之高级数据过滤
    1、组合WHERE子句1.1、AND操作符1select2col_name3from4table_name5where6col_name='str'7and8col_name2='str';1.2、OR操作符......
  • 如何通过执行SQL为低代码项目提速?
    见多了SQL为代码开发提速,那么当低代码遇到SQL会擦出怎样的火花呢?本文将低代码和SQL结合进行介绍,让大家了解如何通过执行SQL为低代码项目提速。背景自从计算机诞生的一刻起......
  • sqlserver 之 CROSS apply
    CROSSapply作用:两张表直接连接,不需要任何的关联条件,产生的结果就是这两张表的笛卡儿集。相当于:select*fromtableA,tableB。 使用场景:如果查询结果集需要用到表值函......
  • r2d2-postgresql
    externcrater2d2;usestd::{thread,io::Read};user2d2_postgres::{postgres::{NoTls,GenericClient,SimpleQueryRow,SimpleQueryMessage},PostgresConnectionM......
  • 如何通过执行SQL为低代码项目提速?
    见多了SQL为代码开发提速,那么当低代码遇到SQL会擦出怎样的火花呢?本文将低代码和SQL结合进行介绍,让大家了解如何通过执行SQL为低代码项目提速。背景自从计算机诞生的一刻......
  • 《sql经典实例》第二版
    1数据表准备创建emp表CREATETABLE`emp`(`EMPNO`int(11)unsignedNOTNULLAUTO_INCREMENT,`ENAME`varchar(40)COLLATEutf8mb4_unicode_ciDEFAULTNULL,......
  • 工业网关如何实现MQTT、MODBUS、OPCUA、SQL、HTTP之间协议转换?
    随着工业现场总线技术以及工业物联网的蓬勃发展,不同的自动化设备往往具备多种不同的通讯协议,在实际应用中,影响了设备的数据采集与通信效率,如工业可编程控制器PLC,西门子、欧......
  • mysql循环插入分隔符分开的字符串
    CREATEDEFINER=`root`@`localhost`PROCEDURE`test`()BEGIN DECLAREi,help_topic_idINT; SETi=10469; SEThelp_topic_id=0;WHILEi<10475DOINSERTINTO`login`.t_u......
  • 【MySQL】MariaDB使用connect引擎直接访问SQLServer数据库
    场景:mariadb通过connect引擎,访问sqlserver2008中的数据。1.安装connect存储引擎如果mariadb是使用二进制包安装的话,默认已经安装了connect存储引擎否则就需要执行手......
  • SQL之过滤数据
    主要是WHERE关键字的使用,对分组前的数据进行过滤1、where子句操作符 以上有些操作是冗余的,注意并非DBMS都支持不同的写法,具体要看2、检查单个值1select2......