天天看點

系統庫- SQL Server隐藏系統庫Resource Database探究

作者:雪竹頻道

概述

對于許多熟悉 SQL Server 的人來說, 系統資料庫隻與四個資料庫相關聯 ,它們分别是master、 model、 msdb、 tempdb。即使在 SQL Server Management Studio (SSMS) 中,當我們打開系統資料庫時,也隻能看到這四個資料庫(我們說的是經典配置,其中一些其他功能沒有配置,例如複制)。但是,除了這些資料庫之外,還有一個第五個系統資料庫,稱為資源資料庫。我們将在本文中讨論這個不太熟悉的系統資料庫,并介紹有關該資料庫一些特性。

特性

如前所述,當我們 在 SSMS 的對象資料總管中打開“系統資料庫”時,我們隻能看到四個資料庫(master、 model、 msdb、 tempdb):

系統庫- SQL Server隐藏系統庫Resource Database探究

我們可以沒有看到資源庫出現。這個“隐藏”資料庫是什麼以及它的用途是什麼?好吧,資源資料庫是一個系統資料庫,它使 SQL Server 更新到新版本的過程更容易、更快。現在,讓我們探讨一下有關資源資料庫的一些特性。

1、資源資料庫是隻讀資料庫,包含所有系統對象

實際上,邏輯上在每個資料庫的 sys 模式中的所有系統對象,在實體上都位于資源資料庫中。例如,在 SSMS 中,如果我們在任何資料庫的“視圖”下展開“系統視圖”,我們可以在 sys 模式中看到許多視圖:

系統庫- SQL Server隐藏系統庫Resource Database探究

這些視圖中的資料存儲在資源資料庫中,事實上,如果我們從這些視圖之一讀取資料,就會從資源資料庫中讀取:

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]           
系統庫- SQL Server隐藏系統庫Resource Database探究

但是,如果我們嘗試直接通路資源資料庫,則會收到錯誤資訊:

系統庫- SQL Server隐藏系統庫Resource Database探究

另外,我們隻能讀取資源資料庫的資料,不能更改。值得一提的是,資源資料庫不存儲使用者資料、使用者中繼資料或執行個體相關的資料。

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,但沒有列出資源資料庫:

系統庫- SQL Server隐藏系統庫Resource Database探究

使用DB_ID()和DB_NAME()函數時,有關資源資料庫的資訊也不可用

系統庫- SQL Server隐藏系統庫Resource Database探究

但是,相同的函數不傳回有關資源資料庫的任何資訊:

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

在這兩種情況下都傳回NULL :

系統庫- SQL Server隐藏系統庫Resource Database探究

如果查詢有關資源資料庫的一些資訊,可以使用下面的查詢:

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

結果顯示資源資料庫的版本和資源資料庫上次更新的時間:

系統庫- SQL Server隐藏系統庫Resource Database探究

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\”, 是以我們可以在這個位置找到這些檔案:

系統庫- SQL Server隐藏系統庫Resource Database探究

我們可以通過以下查詢檢索資源資料庫檔案的位置:

SELECT * FROM sys.sysaltfiles  WHERE dbid = 32767           

正如我們前面已經讨論的, 32767 是資源資料庫 ID。

系統庫- SQL Server隐藏系統庫Resource Database探究

5、無法使用 SQL Server 備份來備份和恢複資源資料庫

我們無法執行傳統的備份和恢複方法來備份或恢複資源資料庫。為了備份這個資料庫,我們可以備份資料庫檔案。值得一提的是,雖然資源資料庫的資料檔案擴充名為.mdf,但我們應該将其視為 .exe檔案。備份檔案可用于通過将它們複制到相應位置來恢複資源資料庫。

結論

SQL Server有五個系統資料庫,而不是人們想象的四個。資源資料庫是第五個“隐藏”資料庫,它是隻讀資料庫,包含 SQL Server 的所有系統對象。它用于使 SQL Server 的更新過程更快、更容易。此資料庫無法備份和恢複(使用傳統的 SQL Server 方法),并且其資料和日志檔案的位置也無法更改。它有一個固定的資料庫 ID 32767,這是每個執行個體的最大資料庫數。首文在本人部落格https://www.cnblogs.com/lkj371/p/16745508.html發表,轉載請注明出處。

繼續閱讀