搜尋本站文章

2011-10-20

「SQL Server Audit(稽核)」失敗造成伺服器被關閉。錯誤:33219,The server was stopped because SQL Server Audit 'XXX' is configured to shut down on failure.

「稽核」(Audit) SQL Server 或 SQL Server 資料庫的執行個體牽涉到追蹤和記錄系統上所發生的事件。

如果在稽核起始期間發生失敗,伺服器將不會啟動。

在此情況下,可以在命令列上使用 –f 選項來啟動伺服器。

當稽核失敗造成伺服器關閉,或是因為已針對稽核指定 ON_FAILURE=SHUTDOWN 而造成伺服器無法啟動時,MSG_AUDIT_FORCED_SHUTDOWN 事件將會寫入記錄檔中。

由於關閉將發生在初次遇到此設定時,所以此事件將會寫入一次。當稽核的失敗訊息造成伺服器關閉之後,將會寫入此事件。

管理員可藉由使用 –m 旗標在單一使用者模式下啟動 SQL Server,以略過稽核所導致的關閉。

如果您在單一使用者模式下啟動,您會將指定 ON_FAILURE=SHUTDOWN 於該工作階段執行的任何稽核降級為 ON_FAILURE=CONTINUE。

當使用 –m 旗標啟動 SQL Server 時,MSG_AUDIT_SHUTDOWN_BYPASSED 訊息將會寫入到錯誤記錄檔。


-- 01_命令提示列_啟動失敗_1067



請參考以下的錯誤訊息:

--
SQL Server 錯誤記錄檔(ERRORLOG)

The server was stopped because SQL Server Audit 'myAudit01' is configured to shut down on failure. 
To troubleshoot this issue, use the -m flag (Single User Mode) to bypass Audit-generated shutdowns when the server is starting.
...
2011-10-20 15:58:58.38 spid3s      錯誤: 33202,嚴重性: 17,狀態: 1。
2011-10-20 15:58:58.38 spid3s      SQL Server Audit could not write to file 'C:\myAdmin\Audit_Logs\myAudit03_8593CB26-3B91-49A3-A547-F43C7027A7F4.sqlaudit'.
2011-10-20 15:58:58.38 spid3s      錯誤: 33206,嚴重性: 17,狀態: 1。
2011-10-20 15:58:58.38 spid3s      SQL Server Audit failed to create the audit file 'C:\myAdmin\Audit_Logs\myAudit03_8593CB26-3B91-49A3-A547-F43C7027A7F4.sqlaudit'. Make sure that the disk is not full and that the SQL service account has the required permissions to create and write to the file.
...
2011-10-20 17:17:20.24 spid52      SQL Server Audit failed to create the audit file 'C:\myAdmin\Audit_Logs\myAudit01_D89F669C-1184-4C04-97C0-33E9AED3B593.sqlaudit'. Make sure that the disk is not full and that the SQL service account has the required permissions to create and write to the file.
2011-10-20 17:17:20.24 spid52      The server was stopped because SQL Server Audit 'myAudit01' is configured to shut down on failure. To troubleshoot this issue, use the -m flag (Single User Mode) to bypass Audit-generated shutdowns when the server is starting.
...

--
事件檢視器 Windows 應用程式記錄檔:

事件識別碼:33219
伺服器已停止,因為 SQL Server Audit 'myAudit01' 設定為於失敗時關閉。
如果要對此問題進行疑難排解,請在伺服器啟動時使用 -m 旗標 (單一使用者模式),以略過稽核所產生的關機。

-- 02_事件檢視器_33219



-- 03_事件檢視器_33202



事件識別碼:33202
SQL Server Audit 無法寫入檔案 'C:\myAdmin\Audit_Logs\myAudit03_8593CB26-3B91-49A3-A547-F43C7027A7F4.sqlaudit'。

-- 04_事件檢視器_33206



事件識別碼:33206
SQL Server Audit 無法寫入檔案 'C:\myAdmin\Audit_Logs\myAudit03_8593CB26-3B91-49A3-A547-F43C7027A7F4.sqlaudit'。




可能的解決方案

示範環境:
SQL Server 2008 R2

建議使用:
啟動參數:-m 或 –f 來修復此問題。

請參考以下的範例程式碼:

--01 假設為預設執行個體,在「命令提示字元」視窗,執行:
NET START MSSQLSERVER /m
 
-- 若具名執行個體時
NET START MSSQL$執行個體名稱 /m

--02 假設為預設執行個體,在 sqlcmd 視窗,執行:
-- 停用符合篩選條件式的多個「SQL Server Audit(稽核)」,篩選條件式:「已啟用」、「有設定寫入失敗,關閉伺服器執行個體」
USE master
GO
DECLARE @tb TABLE(rid INT IDENTITY, auditname sysname)

INSERT @tb 
 SELECT name FROM sys.server_audits
 WHERE on_failure =1 AND is_state_enabled =1

DECLARE @cnt INT=(SELECT MAX(rid) FROM @tb)

WHILE @cnt >0
BEGIN
 DECLARE @auditname sysname = (SELECT  auditname FROM @tb WHERE rid=@cnt);
 EXEC (N'ALTER SERVER AUDIT '+ @auditname +N' WITH (STATE = OFF);')
 SET @cnt -=1
END
GO

--03 關閉預設執行個體 SQL Server
NET STOP MSSQLSERVER

-- 若具名執行個體時
NET STOP MSSQL$執行個體名稱

--04 重新正常啟動 SQL Server
NET START MSSQLSERVER
 
-- 若具名執行個體時
NET START MSSQL$執行個體名稱



-- 03_命令提示列_停用稽核



或者,也可以使用 SSMS 管理工具的「物件總管」來停用「SQL Server Audit(稽核)」。

-- 04_物件總管_已經停用稽核






啟動參數

描述
-f 啟動只含最小組態的 SQL Server 執行個體。如果組態值設定 (如過度調配記憶體) 造成伺服器無法啟動,這就很有用。

以最低組態模式啟動 SQL Server 會將 SQL Server 放在單一使用者模式下。
-m 當您以單一使用者模式啟動 SQL Server 執行個體。以單一使用者模式啟動 SQL Server 執行個體時,只有單一使用者可以進行連接,且不會啟動 CHECKPOINT 處理序。

CHECKPOINT 會保證將交易規律地從磁碟快取區寫到資料庫裝置。(一般而言,如果遇到一些應該修復系統資料庫的問題時,就會使用這個選項)。


啟用 sp_configure allow updates 選項。根據預設,allow updates 是停用的。在單一使用者模式下啟動 SQL Server 可讓電腦本機管理員群組的任何成員以 sysadmin 固定伺服器角色的成員身分,連接到 SQL Server 的執行個體。




參考資料

了解 SQL Server Audit
http://msdn.microsoft.com/zh-tw/library/cc280386.aspx