通過測試SQL Server數據庫數據和日誌驅動器增強AlwaysOn故障轉移策略
譯者注:
該腳本適合在SQL Server 2012\2014中配置爲自動故障轉移的副本中部署。
前言
在SQL Server 2012和2014,在自動故障轉移模式的AlwaysOn可用性組不會在數據庫級別錯誤觸發故障轉移。例如:如果用戶數據庫的數據或日誌文件失敗,或者用戶數據庫損壞並導致狀態從在線變爲其他狀態(如置疑),數據庫羣集不會自動故障轉移可用性組。
在SQL Server 2016,我們在創建和修改可用性組命令的部分添加了一個額外的配置設置叫做DB_FAILOVER,如果在主副本的一個數據處於非在線狀態將觸發故障轉移。意思是,如果AG配置爲自動故障轉移,並且處於同步狀態的數據庫遇到失敗,數據庫級別的錯誤將會觸發自動故障轉移。
添加這個腳本的方法,使你你可以再遇到磁盤故障時讓羣集執行自動故障轉移。該VB腳本在腳本中指定的路徑執行文件寫入。如果寫入失敗,意味着磁盤失敗並且腳本失敗。失敗的腳本導致羣集中的腳本資源失敗。如果在腳本資源上的依賴恰當配置,這將導致由於磁盤/VB腳本失敗的羣集觸發故障轉移。
因爲這個腳本不需要連接或以任何方式利用SQL Server,你可以針對SQL Server 2012\2014\2016部署。但在2016中的收益不如配置啓用參數DB_FAILOVER,因爲一個數據庫級別的失敗導致自動故障轉移。
翻譯自:
在SQL Server 2012和2014,AlwaysOn健康診斷以多種方式檢測SQL Server進程的健康。然而,沒有在AlwaysOn可用性組上的數據庫的可訪問性或存活性的健康檢測。如果承載可用性組數據庫或日誌文件的磁盤丟失,AlwaysOn健康診斷不會檢測該事件,並且應用程序運行時錯誤訪問數據庫失敗。丟失驅動器或訪問承載可用性數據庫數據和日誌文件的驅動器錯誤,會影響訪問你的生產數據的訪問。
正如可用性組的自動故障轉移的彈性故障轉移策略所描述:
“損壞的數據庫和置疑的數據庫不會在任何失敗條件級別上檢測。因此,一個數據庫損壞或置疑(是否由於硬件失敗、數據故障或其他問題)絕不會觸發自動故障轉移。”
注意:SQL Server 2016增強數據庫健康檢測的AlwaysOn健康診斷。如果你的AlwaysOn可用性組開啓數據庫健康檢測,並且數據庫狀態轉化爲非ONLINE狀態(sys.databases.state_desc),整個可用性組將自動故障轉移。可參考MSDN關於“CREATE AVAILABILITY GROUP”的“DB_FAILOVER”部分。
你可以通過檢測磁盤健康來增強數據庫的可用性。添加一個普通的腳本資源到你的可用性組資源組,做基本的針對承載可用性組數據庫數據和日誌文件的驅動器的讀或寫測試。以下描述如何添加一個普通腳本資源作爲一個可用性組資源的依賴,通過甲苯的磁盤健康檢查來增強AlwaysOn健康檢測。
使用一個普通腳本資源來做基本的SQL Server數據和日誌驅動器健康檢查
這是一個高級別的描述關於部署普通的腳本資源來檢測可用性組數據庫驅動器健康。
添加一個普通的腳本集羣資源到可用性組資源組。讓可用性組資源依賴於普通資源腳本。這樣,如果腳本資源報告IsAlive失敗,Windows羣集會嘗試重啓或者故障轉移可用性組資源。
普通腳本集羣資源IsAlive測試在特定的數據驅動器位置創建一個文本文件、在特定的日誌驅動器位置創建一個文本文件。如果文件存在,腳本將會覆蓋它。
該腳本打包爲GenericScript_SQLIsAlive.zip,包括:
Sqlisalive.vbs
這個普通的腳本用Visual Basic腳本編寫,並部署Windows羣集IsAlive。
Add_SQLIsAliveScript.ps1
這個PowerShell腳本添加普通腳本資源到你的可用性組資源組,並設置可用組依賴於你的普通腳本資源。
Readme.txt
部署普通腳本資源的按步驟的指南,和如何測試腳本的額外指南。
部署普通腳本資源
I. 配置普通腳本sqlisalive.vbs。
數據和日誌驅動器路徑:
當前,普通腳本配置爲測試一下驅動器和路徑:c:\temp\data和c:\temp\log。對於測試目的,在每個副本的本地驅動器上創建這些路徑(主副本和自動故障轉移夥伴輔助副本)。之後,你可以修改它們爲適當的你的數據庫數據和日誌文件位於的驅動器和路徑。
DataDriveFile=”c:\temp\data\ScriptFileData.txt”
LogDriveFile=”c:\temp\log\ScriptFileLog.txt”
II. 配置和執行PowerShell腳本來部署普通腳本到你的可用性組。
注意:這個普通腳本只部署每60秒運行的IsAlive。
1. 確保你的可用性組有兩個副本配置爲自動故障轉移。
2. 拷貝普通腳本文件到相同的本地存儲路徑,像配置爲自動故障轉移的副本的所有服務器的“C:\temp\sqlisalive.vbs”。
3. 創建用於健康檢查的路徑,C:\temp\data和C:\temp\log。
4. Add_SQLIsAliveScript.ps1腳本添加普通腳本資源到你的可用性組,並在普通腳本資源上添加一個依賴到你的可用性組資源。在Add_SQLIsAliveScript.ps1,修改如下變量:
設置$ag爲你的可用性組名稱。
設置$listener爲你的可用性組監聽器名稱。如果你的可用性組沒有監聽器,設置$listener爲””。
設置$scriptfilepath爲你的sqlisalive.vbs腳本的路徑和文件名。
5. 在承載主副本的服務器上,運行PowerShell腳本Add_SQLIsAliveScript.ps1去添加普通腳本資源到你的可用性組資源組。
6. 打開故障轉移羣集管理器,並檢查可用性組資源組來確認添加了普通腳本資源到可用性組資源組。普通腳本應該出現在資源頁面,並在可用性組資源組爲在線狀態。
7. 確認可用性組資源中在普通腳本資源上創建了依賴。
注意:
額外的readme.txt包含如何測試腳本資源來確認它可以故障轉移到你的可用性組資源的指南。
通過普通腳本資源診斷失敗檢測
對承載主副本的節點生成羣集日誌,並搜索“Data Drive Create File”或“Log Drive Create File”,以定位普通腳本資源IsAlive成功或失敗的報告:
00001b04.00002924::2015/12/07-17:16:41.798 INFO [RES] Generic Script <sqlisalive>: Entering IsAlive
00001b04.00002924::2015/12/07-17:16:41.801 INFO [RES] Generic Script <sqlisalive>: Data Drive Create File Succeeded
00001b04.00002924::2015/12/07-17:16:41.801 INFO [RES] Generic Script <sqlisalive>: Log Drive Create File Succeeded
或者例如,你設置\Data目錄爲只讀:
00001b04.00002924::2015/12/07-17:17:41.801 INFO [RES] Generic Script <sqlisalive>: Entering IsAlive
00001b04.00002924::2015/12/07-17:17:41.804 INFO [RES] Generic Script <sqlisalive>: Data Drive Create File Succeeded
00001b04.00002924::2015/12/07-17:17:41.804 INFO [RES] Generic Script <sqlisalive>: Data Drive Create File Failed
00001b04.00002924::2015/12/07-17:17:41.804 INFO [RES] Generic Script <sqlisalive>: Permission denied
00001b04.00002924::2015/12/07-17:17:41.804 ERR [RES] Generic Script <sqlisalive>: 'IsAlive' script entry point returned FALSE.'
00001b04.00002924::2015/12/07-17:17:41.804 INFO [RES] Generic Script <sqlisalive>: Return value of 'IsAlive' script entry point caused HRESULT to be set to 0x00000001.
00001b04.00002298::2015/12/07-17:17:41.804 WARN [RHS] Resource sqlisalive IsAlive has indicated failure.