系統庫 - SQL Server Master 探究

概述

最近公司做了一個關於 SQLSERVER 的大項目,所以對 SQL SERVER 進行了探究。master 數據庫,是 SQL Server 中最重要的系統數據庫。master 數據庫包含有關 SQL Server 系統的所有信息,包括有關初始化的信息、配置設置、與實例相關的元數據、有關所有其他數據庫的信息,例如數據庫文件的位置等。這就是爲什麼主數據庫的存在和正常功能對於任何 SQL Server 實例都是至關重要的。在本文中,我們將說明有關這個重要數據庫的五個事實。

解決方案

通過以下幾個事實,我們將闡明 master 一些重要特性和功能。

1 、 登錄帳戶和其他實例範圍的元數據存儲在 SQL Server master 庫中

你有沒有想過登錄名存儲在哪裏?例如,您知道 “sa” 登錄名及其密碼存儲在哪裏嗎?好吧,登錄信息存儲在主數據庫中。雖然在 SQL 登錄的情況下,它們的密碼哈希也存儲在主數據庫中,但對於 Windows 登錄,SQL Server 依賴於 Windows 進行身份驗證。因此,可以在 master 數據庫中找到 “sa” 帳戶及其散列密碼。我們可以通過運行下面的 T-SQL 代碼來獲取這些信息:

SELECT name AS LoginName, password_hash 
FROM sys.sql_logins 
WHERE name='sa'

我們可以從 SQL 查詢中看到登錄名和密碼哈希:

不僅登錄帳戶,而且所有系統級信息都存儲在主數據庫中。鏈接服務器和端點是另外兩個這樣的例子。可能會出現一個問題:我們在哪裏可以看到存儲所有這些信息的這些表?當我們在 SQL Server Management Studio (SSMS) 中展開 master 數據庫的 “表” 時,我們看不到相關的表。主 “表” 下沒有表 (如果我們沒有手動創建),“系統表” 下只有四個表,如下所示:

這是因爲包含系統級信息的表是隱藏的,並且在 SSMS 中不可見。

2、master 庫並不存儲系統對象

有一個常見的誤解,即系統對象是存儲在主數據庫中的。雖然在 SQL Server 的舊版本(例如 SQL Server 2000)中,主數據庫包含系統對象,但在新版本中,這些數據不再存儲在 master 數據庫中。從 SQL Server 2005 開始,這些對象存儲在資源數據庫中,這是一個隱藏的只讀系統數據庫。因此,主數據庫不再包含系統對象,例如 sys.objects 中的數據。

3、如果 master 數據庫不可用,則無法啓動 SQL Server

我們知道初始化信息,實例中其他數據庫的信息及其文件位置都存儲在 master 庫中,如果 master 庫不可用,則實例無法啓動。我們可以通過使 master 庫不可用來說明這種行爲。爲此,我們可以停止實例(強烈建議僅在測試實例上執行所有這些測試),將 master 庫文件(數據和日誌或僅其中一個)移動到另一個位置,然後嘗試啓動實例.

要停止實例,我們打開 SQL Server 配置管理器並選擇相應的實例,右鍵單擊它並選擇停止。

在使用上面顯示的屬性選項的實例的啓動參數中,我們可以找到 master 庫文件的位置。

所以,讓我們將 master 數據庫的數據文件複製到另一個位置。

然後,我們嘗試啓動實例,方法是右鍵單擊它並選擇 Start。

實例將無法啓動,我們收到以下錯誤。

如果我們打開 ERRORLOG 文件,我們可以看到錯誤原因描述:

4、可以在 master 數據庫中創建用戶對象,但不建議這樣做

雖然我們可以在 master 數據庫中創建表、存儲過程等用戶對象,但不建議這樣做。但是在某些情況下,有些人出於某些目的不遵循最佳實踐並在主數據庫中創建用戶對象。這通常會發生在 T-SQL 代碼中沒有使用 “USE ” 語句,則將會在主數據庫中創建對象。因爲當我們在 SSMS 中打開一個新的查詢窗口時,默認數據庫是主數據庫(除非它被更改)。

要在 master 數據庫中查找用戶創建的對象,我們可以運行以下 Transact-SQL 代碼。

SELECT *FROM master.sys.objects 
WHERE is_ms_shipped=0

其中 is_ms_shipped 爲 0 或 1(位數據類型字段),並顯示對象是由內部 SQL 組件 (1) 還是不是 (0) 創建。在如下的例子中,我們可以看到我們有兩個用戶創建的對象。

5、master 數據庫只允許創建完整備份

建議對 master 數據庫進行全新備份。特別是在我們創建、刪除或修改新數據庫、登錄帳戶和更改配置值時,執行主數據庫的備份非常重要。另外,如果你已經在 master 數據庫中創建了用戶對象(上面不推薦這樣做),根據這些用戶創建對象的變化, 備份 master 數據庫是合理的。無法對主數據庫進行事務日誌或差異備份。

如果我們嘗試在 master 數據庫上執行備份操作,我們可以看到唯一可用的選項是完整備份。

小結

總而言之,我們探討了有關 SQL Server master 數據庫的五個有趣事實。具體來說,我們瞭解到主數據庫包含 SQL 身份驗證用戶的登錄帳戶和密碼哈希。此外,我們瞭解到 master 數據庫不包含系統對象(自 SQL Server 2005 起,它們存儲在資源數據庫中)。如果 master 數據庫不可用, SQL Server 實實例則無法啓動。此外展示了我們是否可以在主數據庫中創建用戶對象。最後,我們瞭解到主數據庫的唯一可能備份是完整備份。

來源:

https://www.toutiao.com/article/7148013807389508131/?log_from=df29fc587d143_1664414026761

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/MLx9910T72jPSSxCuF-06g