專用管理連接(DAC)和單用戶模式


數據庫運維人員,在維護數據庫時,有時會遇到一些特殊的情況,例如,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

 

參考文檔:

sqlcmd Utility

Diagnostic Connection for Database Administrators

Database Engine Service Startup Options

Start SQL Server in Single-User Mode

Set a Database to Single-user Mode


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM