Sql-Server

如果 SQL Server 失去與 master 和 msdb 系統數據庫所在的 SAN 的網路連接,它會離線嗎?

  • January 23, 2021

我有一個設置,其中 3 台伺服器組合成可用性組

所有 3 台伺服器都有本地直接連接的 SSD 驅動器,使用者數據庫文件託管在這些驅動器上

但是 AG 中每台伺服器的系統數據庫(master 和 msdb)都託管在通過網路訪問的 SAN 設備上

尚未將它們移動到本地 SSD 驅動器

問題:

在任何伺服器和 SAN 設備之間的網路連接失去(電纜損壞、NIC 損壞、一些臨時網路故障等)的假設情況下,

  • 該伺服器上的 SQL Server 服務會立即離線或停止正常工作嗎?
  • 或者如果 master 和 msdb 在網路中斷之前記憶體在 RAM 中,它會繼續工作一段時間?

從文件

可用性組數據庫級別執行狀況檢測故障轉移選項文件的警告部分包含一些可能會改進我們對該問題的猜測的資訊:

需要注意的是,Database Level Health Detection 選項目前不會導致 SQL Server 監控磁碟正常執行時間,並且 SQL Server 不會直接監控數據庫文件的可用性。如果磁碟驅動器發生故障或變得不可用,則不一定會觸發可用性組自動故障轉移。

例如,當數據庫空閒且沒有活動事務且沒有發生物理寫入時,如果某些數據庫文件變得不可訪問,SQL Server 可能不會對文件執行任何讀取或寫入 IO,並且可能不會更改狀態立即為該數據庫,因此不會觸發故障轉移。稍後,當發生數據庫檢查點,或發生物理讀取或寫入以完成查詢時,SQL Server 可能會注意到文件問題,並通過更改數據庫狀態以及隨後設置了數據庫級別健康檢測的可用性組來做出反應將由於數據庫執行狀況更改而進行故障轉移。

又例如,當SQL Server數據庫引擎需要讀取數據頁來完成查詢時,如果數據頁記憶體在緩衝池記憶體中,則可能不需要物理訪問的磁碟讀取來完成查詢請求。因此,即使啟用了數據庫執行狀況選項,失去或不可用的數據文件也可能不會立即觸發自動故障轉移,因為數據庫狀態不是立即的。

來自(足夠接近的)實驗室測試

  1. 我將數據mastermsdb日誌文件放在筆式驅動器(驅動器 D:) 上——為了簡潔起見,我不會描述這個過程;
  2. 啟動實例並在我的實驗室數據庫上執行一些 DML Lab
  3. 連接master我執行的數據庫select name, state_desc from sys.databases;查詢結果集
  4. 拔下筆式驅動器(沒有Safely Remove Hardware and Eject Media,只是從桌面上拔下它);
  5. 在我的實驗室數據庫上執行了更多的 DML——Lab一切都很好,我什至更新了一個表;
  6. SQL Server 僅在我嘗試執行時才注意到該問題CREATE DATABASE StorageOffline;。我收到以下錯誤消息:

消息 823,級別 24,狀態 2,第 4 行作業系統在文件“D:\MSSQL\master.mdf”中的偏移量 0x0000000041c000 處讀取期間向 SQL Server 返回錯誤 21(設備未準備好。)。SQL Server 錯誤日誌和作業系統錯誤日誌中的其他消息可能會提供更多詳細資訊。這是威脅數據庫完整性的嚴重系統級錯誤情況,必須立即糾正。完成完整的數據庫一致性檢查 (DBCC CHECKDB)。這個錯誤可能是由許多因素引起的;有關詳細資訊,請參閱 SQL Server 聯機叢書。

  1. 得到錯誤後,我重複了第 3 步,結果是一樣的:所有數據庫的狀態仍然是ONLINE。因此,儘管 SQL Server 知道驅動器文件存在問題,但D:\它並沒有改變數據庫的狀態,也沒有使實例離線;

我繼續使用Lab數據庫幾分鐘沒有(明顯的)主要問題,並且在我寫這個答案時實例才停止工作。當然,在生產中繼續工作並不是一個可靠的狀態,但是下線需要一些時間。


結論

基於這些資訊,我的想法是:

該伺服器上的 SQL Server 服務會立即離線或停止正常工作嗎?

我會說不。我還沒有使用可用性組,但是如果該功能旨在使重要的數據庫保持線上狀態並且它不監控磁碟正常執行時間或正在積極監控的數據庫的數據庫文件可用性,它不會更快地註意到問題不屬於可用性組的數據庫。

或者如果 master 和 msdb 在網路中斷之前記憶體在 RAM 中,它會繼續工作一段時間?

是的,但這取決於您的環境有多忙。數據庫將保持線上狀態,直到 SQL Server 嘗試在數據庫文件上讀取master或寫入內容。msdb

但我同意京東的觀點,你不應該依賴這種情況給你足夠的時間來採取任何措施來避免你的實例下線。

引用自:https://dba.stackexchange.com/questions/283570