適用対象:SQL Server
Azure SQL Database
Azure SQL Managed Instance
SQL Server では、サーバーへの標準の接続が確立できないときに、管理者向けの特殊な診断接続が用意されています。 診断接続を使用することにより、SQL Server が標準の接続要求に応答していない場合でも、管理者は SQL Server にアクセスして診断クエリを実行し、問題のトラブルシューティングを行うことができるようになります。
この DAC (専用管理者接続) では、暗号化やその他の SQL Serverのセキュリティ機能がサポートされます。 DAC で実行できるのは、ユーザー コンテキストを別の管理者ユーザーに変更する操作のみです。
SQL Server は DAC 接続を正常に行うたびに試行しますが、極端な状況では成功しない可能性があります。
DAC を使用して接続する
また、既定では、サーバーで実行されているクライアントからしか接続できません。
sp_configure
ストアド プロシージャとリモート管理者接続サーバー構成オプションを使用して構成しない限り、ネットワーク接続は許可されません。
DAC を使用して接続できるのは、 SQL Server sysadmin ロールのメンバーのみです。
DAC は、sqlcmd
コマンド プロンプト ユーティリティで特殊な管理者スイッチ (-A
) を指定することによって使用できます。
sqlcmd
の使用の詳細については、「sqlcmd - スクリプト変数で使用する」を参照してください。 また、インスタント名の前にプレフィックス admin:
を付けて sqlcmd -S admin:<instance_name>
という形式で接続することもできます。 さらに、admin:<instance_name>
に接続することによって、SQL Server Management Studio クエリ エディターから DAC を開始することもできます。
SQL Server Management Studio から DAC を確立するには:
オブジェクト エクスプローラーや開かれているすべてのクエリ ウィンドウなど、関連する SQL Server インスタンスへのすべての接続を切断します。
メニューから [ファイル] > [新規] > [データベース エンジン クエリ] の順に選択します
[接続] ダイアログ ボックスの [サーバー名] フィールドに、
admin:<server_name>
(既定のインスタンスを使用する場合) またはadmin:<server_name>\<instance_name>
(名前付きインスタンスを使用する場合) を入力します。
DAC ポート
SQL Server では、TCP ポート 1434 (使用可能な場合) または データベース エンジン の起動時に動的に割り当てられる TCP ポートで DAC をリッスンします。 エラー ログには、DAC がリッスンしているポート番号が含まれています。 既定では、DAC リスナーはローカル ポートでの接続のみを受け入れます。 リモート管理接続をアクティブにするコード サンプルについては、「 サーバー構成: リモート管理者接続」を参照してください。
リモート管理接続を構成すると、SQL Server を再起動しなくても DAC リスナーが有効になり、クライアントからリモートで DAC に接続できるようになります。 SQL Server が応答しない場合でも、DAC リスナーを有効にしてリモート接続を受け入れることができます。これを行うには、まず DAC をローカルに使用して SQL Server に接続してから、sp_configure
ストアド プロシージャを実行してリモート接続からの接続を受け入れます。
クラスター構成では、DAC は既定でオフになります。 ユーザーは、sp_configure
の remote admin connection オプションを実行すると、DAC リスナーを有効にしてリモート接続にアクセスできます。 SQL Server が応答せず、DAC リスナーが有効になっていない場合は、DAC で接続するために SQL Server を再起動する必要が生じる場合があります。 この理由から、クラスター システムでは remote admin connections 構成オプションを有効にすることをお勧めします。
DAC ポートは、起動中に SQL Server によって動的に割り当てられます。 既定のインスタンスに接続する場合、DAC では SQL Server Browser サービスへの SSRP ( SQL Server Resolution Protocol) 要求が使用されません。 まず、TCP ポート 1434 経由で接続が試行されます。 接続が失敗した場合、ポートを取得するために SSRP 呼び出しが実行されます。 SQL Server Browser が SSRP 要求をリッスンしていない場合は、接続要求によってエラーが返されます。 DAC がリッスンしているポート番号を確認するには、エラー ログを参照します。 SQL Server がリモート管理接続を受け入れるように構成されている場合、次のように DAC を明示的なポート番号で開始する必要があります。
sqlcmd -S tcp:<server>,<port>
SQL Server のエラー ログには DAC のポート番号が一覧されます。既定のポート番号は 1434 です。 SQL Server がローカルの DAC 接続のみを受け入れるように構成されている場合は、次のコマンドを実行し、ループバック アダプターを使用して接続します。
sqlcmd -S 127.0.0.1,1434
制限事項
DAC の唯一の目的は、ごくまれな状況でサーバーの問題を診断することであるので、この接続には次のようないくつかの制限があります。
接続に使用できるリソースを確保するために、DAC は 1 つの SQL Serverのインスタンスにつき 1 つしか許可されません。 DAC 接続が既にアクティブな場合は、DAC を使用して接続する新たな要求は、エラー 17810 で拒否されます。
リソースを節約するために、トレース フラグ 7806 で開始されない限り、SQL Server Express は DAC ポートでリッスンしません。
DAC では、まずログインに関連付けられた既定のデータベースへの接続が試行されます。 正常に接続されたら、
master
データベースに接続できます。 既定のデータベースがオフライン状態であるか、または別の原因で使用できない場合、接続の際にエラー 4060 が返されます。 ただし、master
データベースへ接続するために、次のコマンドを使用する代わりに既定のデータベースをオーバーライドすると成功します。sqlcmd -A -d master
DAC を使用するときは、
master
データベースに接続することをお勧めします。これはデータベース エンジンのインスタンスが起動するとmaster
を使用できることが保証されているためです。SQL Server では、DAC で複数のクエリやコマンドを並列実行することは禁止されています。 たとえば、DAC で次のいずれかのステートメントを実行すると、エラー 3637 が生成されます。
RESTORE...
BACKUP...
DAC では、使用できるリソースが制限されます。 DAC を使用して、リソースを大量に消費するクエリや、他のクエリをブロックできるクエリを実行しないでください。 これは、DAC によって既存のサーバーの問題が悪化するのを防ぐためです。 ブロックする可能性のあるシナリオを回避するために、ブロックする可能性のあるクエリを実行する必要がある場合は、可能であれば、スナップショット ベースの分離レベルでクエリを実行します。それ以外の場合は、トランザクション分離レベルを
READ UNCOMMITTED
に設定し、LOCK_TIMEOUT
値を 2000 ミリ秒などの短い値に設定します。またはその両方です。 これにより、DAC セッションがブロックされるのを防ぐことができます。 ただし、 SQL Server の状態によっては、ラッチで DAC セッションがブロックされることがあります。 Ctrl キーを押しながら C キーを押して DAC セッションを終了できることがありますが、終了できないこともあります。 その場合、唯一のオプションは SQL Server を再起動することです。SQL Server では、DAC による接続とトラブルシューティングを確実に行うために、限定されたリソースを確保して DAC で実行されるコマンドを処理します。 通常、次に示す単純な診断関数とトラブルシューティング関数を実行する場合には、この限定されたリソースだけで十分です。
理論上は、DAC で並列に実行する必要のない Transact-SQL ステートメントはすべて実行できますが、次の診断およびトラブルシューティング コマンドに使用を制限することを強くお勧めします。
基本的な診断を行うための動的管理ビューのクエリ。たとえば、ロックの状態を確認する sys.dm_tran_locks、キャッシュの正常性を確認する sys.dm_os_memory_cache_counters、アクティブなセッションと要求を確認する sys.dm_exec_requests と sys.dm_exec_sessions などです。 リソースを集中的に消費する動的管理ビュー (たとえば、sys.dm_tran_version_store ではバージョン ストアの完全なスキャンが実行され、集中的に I/O が行われる可能性があります) や複雑な結合を使用する動的管理ビューは使用しないようにしてください。 パフォーマンスへの影響に関する詳細については、特定の 動的管理ビューのリファレンスを参照してください。
カタログ ビューのクエリ。
DBCC FREEPROCCACHE、DBCC FREESYSTEMCACHE、DBCC DROPCLEANBUFFERS、DBCC SQLPERF などの基本的な DBCC コマンド。 DBCC CHECKDB、DBCC DBREINDEX、DBCC SHRINKDATABASE などのリソースを集中的に消費するコマンドは避けてください。
Transact-SQL
KILL <spid>
コマンド。 SQL Server の状態によっては、KILL
コマンドが成功しない場合があります。 唯一のオプションは、SQL Server または Azure SQL Managed Instance の場合にインスタンスを再起動することです。 次に一般的なガイドラインをいくつか示します。SELECT * FROM sys.dm_exec_sessions WHERE session_id = <spid>;
というクエリを実行し、SPID が強制終了されたかどうかを確認します。 行が返されなかった場合は、セッションが強制終了されたことを示します。セッションが依然として確立されている場合は、クエリ
SELECT * FROM sys.dm_os_tasks WHERE session_id = <spid>;
を実行して、このセッションに割り当てられたタスクがあるかどうかを確認します。 タスクが存在する場合は、セッションが現在強制終了中である可能性が高くなります。 これにはかなりの時間がかかる可能性があり、まったく成功しない可能性があります。このセッションに関連付けられているタスクが
sys.dm_os_tasks
に存在しないが、sys.dm_exec_sessions
コマンドの実行後もセッションがKILL
のままである場合は、ワーカーが使用できないことを意味します。 現在実行中のタスク (sys.dm_os_tasks
を含むsessions_id <> NULL
ビューに一覧表示されているタスク) のいずれかを選択し、関連付けられているセッションを強制終了してワーカーを解放します。 1 つのセッションを強制終了するだけでは不十分な場合があります。複数のセッションを強制終了する必要がある場合があります。
Azure SQL Database の制限事項
DAC を使用して Azure SQL データベースに接続するときに、-d
オプションを使用して接続文字列でデータベース名も指定する必要があります。
Azure SQL Managed Instance の制限事項
DAC は、Azure SQL Managed Instance のプライベート エンドポイントでは機能しません。 SQL マネージド インスタンスでは、DAC はポート 1434 でリッスンします。 SQL マネージド インスタンスへのプライベート エンドポイントではポート 1433 での接続のみが許可されるため、プライベート エンドポイントを使用して DAC 接続を確立することはできません。 DAC に接続するには、SQL マネージド インスタンスと同じ仮想ネットワークに存在する必要があります。
例示
この例では、管理者がサーバー contoso-server
が応答していないことに気付き、その問題を診断します。 これを行うには、次のように、ユーザーが sqlcmd
コマンド プロンプト ユーティリティをアクティブにし、DAC であることを示す contoso-server
を指定して、サーバー -A
に接続します。
sqlcmd -S contoso-server -U sa -P <StrongPassword> -A
これで、管理者はクエリを実行して問題を診断し、場合によっては応答していないセッションを終了させることができます。
SQL Database に接続する同様の例では、 -d
パラメーターを含む次のコマンドを使用してデータベースを指定します。
sqlcmd -S serverName.database.windows.net,1434 -U sa -P <StrongPassword> -d AdventureWorks
関連コンテンツ
- スクリプト変数で sqlcmd を使用する
- sqlcmd ユーティリティ
- SELECT (Transact-SQL)
- sp_who (Transact-SQL)
- sp_lock (Transact-SQL)
- KILL (Transact-SQL)
- DBCC CHECKALLOC (Transact-SQL)
- DBCC CHECKDB (Transact-SQL)
- DBCC OPENTRAN (Transact-SQL)
- DBCC INPUTBUFFER (Transact-SQL)
- サーバー構成オプション
- トランザクション関連の動的管理ビューおよび関数 (Transact-SQL)
- DBCC TRACEON (Transact-SQL) を使用してトレース フラグを設定する