數據庫運維人員,在維護數據庫時,有時會遇到一些特殊的情況,例如,SQL Server實例無法訪問,此時需要用到管理員在緊急情況下專用的連接;有時,在做一些系統級別的配置修改時,當前數據庫不能被其他用戶訪問,必須把數據庫切換到單用戶模式。居安思危,在系統正常運行時,多做一些演練,避免在真正出現異常時,手忙腳亂。先解釋一下兩個術語:
專用管理連接(Dedicated Administrator Connection, DAC)是SQL Server提供的一個特殊的診斷連接,用於連接數據執行診斷查詢和故障排除,當其他任何方式都無法連接不到SQL Server時,DAC是唯一的方法。不是所有的Login都可以使用DAC,只有sysadmin 服務器角色的成員,才可以使用DAC。每個SQL Server實例,只能有一個DAC連接。如果當前已經有一個DAC連接,SQL Server拋出錯誤 17810。
單用戶模式( Single-User mode),是指只允許一個用戶連接到SQL Server實例或數據庫,通常情況下,單用戶模式用於修復系統數據庫等維護操作,例如,還原master數據庫,修改實例級別的配置選項。
一,連接DAC
通常情況下,DBA通過sqlcmd 命令行工具訪問SQL Server,登陸到SQL Server實例所在的主機(Host),以Administrator身份運行DOS界面,輸入命令:sqlcmd -A,參數-A指定的是Administrator選項。
默認情況下,DAC嘗試去連接跟Login關聯的默認的數據庫,如果默認的數據庫離線,或不可訪問,DAC連接拋出錯誤 4060,可以使用 -d 參數指定登陸的數據庫,推薦登陸master數據庫,因為,一旦SQL Server實例啟動成功,那么master數據庫必定處於在線和可訪問狀態,sqlcmd 命令行代碼如下:
sqlcmd –A –d master
sqlcmd的參數是大小寫敏感的,常用參數是:
sqlcmd -S [protocol:]server[\instance_name][,port] -E (use trusted connection) -U login_id -P password -d db_name -A (dedicated administrator connection) -q "cmdline query" -Q "cmdline query" (and exit)
二,單用戶模式( Single-User mode)
SQL Server支持兩種啟用單用戶模式的方法:在啟動SQL Server實例時進入單用戶模式,在SQL Server實例運行時把數據庫切換到單用戶模式,前者是SQL Server實例級別,后者是數據庫級別。
1,啟動參數(startup option)
啟動參數用於在SQL Server 實例啟動時,指定實例級別的選項,默認的啟動參數是:
- -d master_file_path :用於指定master數據庫的數據文件路徑
- -l master_log_path :用於指定master數據庫的日志文件路徑
- -e error_log_path :用於指定存儲錯誤日志的的文件路徑
這些默認參數是在安裝SQL Server時,系統自動指定的,DBA能夠通過SQL Server 配置管理器(SQL Server Configuration Manager)查看和配置 Startup Parameters,如下圖所示,通過Add按鈕增加啟動參數,通過Remove刪除啟動參數:
2,使用啟動參數啟用單用戶模式
參數 -m ,以單用戶模式開始SQL Server實例。使用該選項,當DBA以-m參數啟動SQL Server實例時,DBA卻無法登陸SQL Server實例,一個未知的客戶端應用程序已經占用了唯一的連接,SQL Server實例拋出的異常是:當前已經有用戶登陸,
參數 -mClientApplicationName 能夠指定允許登陸的客戶端應用程序,ClientApplicationName是大小寫敏感的。
例如, 參數 -mSQLCMD 指定連接到SQL Server實例的連接必須是sqlcmd 客戶端程序,參數 -m"Microsoft SQL Server Management Studio - Query" 指定連接到SQL Server實例的連接必須是SSMS。
3,在SQL Server實例運行時,把數據庫切換到單用戶模式
在設置數據庫進入單用戶模式(SINGLE_USER)時,確保數據庫選項 AUTO_UPDATE_STATISTICS_ASYNC 被設置未OFF,這是一個后台進程,用於更新數據庫的統計信息,當該選項被設置未ON,該后台進程會占用數據庫的唯一的連接,這樣,其他用戶無法訪問到數據,使用如下腳本禁用 AUTO_UPDATE_STATISTICS_ASYNC選項:
ALTER DATABASE database_name SET AUTO_UPDATE_STATISTICS_ASYNC OFF;
當把數據庫切換到單用戶模式時,如果其他用戶已經連接到數據庫,那么,該連接將會被關閉,SQL Server也不會提供任何警告。在切換到單用戶模式時,通常會使用 WITH ROLLBACK IMMEDIATE 選項,這會導致未完成的事務立即回滾,並立即把其他連接斷開。命令執行完成之后,數據庫切換到單用戶模式,等到維護操作結束之后,用戶可以在當前的連接中執行命令,把數據庫切換到多用戶模式(MULTI_USER),這樣其他用戶可以正常連接到數據庫。
USE master; GO ALTER DATABASE AdventureWorks2012 SET SINGLE_USER WITH ROLLBACK IMMEDIATE; GO ALTER DATABASE AdventureWorks2012 SET MULTI_USER; GO
四,登陸觸發器(Logon Trigger)
登陸觸發器有時會阻止所有用戶訪問數據庫,包括sysadmin角色的成員,當無法連接到SQL Server實例時,使用DAC是唯一的途徑,DBA只能使用DAC登陸到數據庫,刪除登陸觸發器,把數據庫恢復到正常訪問狀態。
Step1:使用DAC連接到數據庫,以管理員身份(Run as Administrator)啟動DOS界面,使用sqlcmd連接DAC:
sqlcmd -A
Step2:刪除登陸觸發器,在命令行中輸入以下命令,輸入go (batch分隔符),執行命令,刪除登陸觸發器
drop trigger login_trigger_name on all server; go
參考文檔:
Diagnostic Connection for Database Administrators
Database Engine Service Startup Options