데이터베이스 관리자를 위한 진단 연결

SQL Server는 서버에 대한 표준 연결이 불가능한 경우 관리자에게 특별한 진단 연결을 제공합니다. 이 진단 연결을 사용하면 SQL Server가 표준 연결 요청에 응답하지 않는 경우에도 관리자가 SQL Server에 액세스하여 진단 쿼리를 실행하고 문제를 해결할 수 있습니다.

DAC(관리자 전용 연결)는 SQL Server의 암호화 및 다른 보안 기능을 지원합니다. DAC는 사용자 컨텍스트를 다른 관리자로만 변경할 수 있습니다.

SQL Server는 성공적으로 DAC가 연결되도록 모든 시도를 하지만 극단적인 경우 연결이 실패할 수도 있습니다.

적용 대상: SQL Server(SQL Server 2008~ 현재 버전), SQL Database V12.

DAC를 사용하여 연결

기본적으로 연결은 서버에서 실행되는 클라이언트에서만 허용됩니다. 네트워크 연결은 원격 관리자 연결 옵션과 함께 sp_configure 저장 프로시저를 사용하여 구성되지 않는 한 허용되지 않습니다.

SQL Server sysadmin 역할의 멤버만이 DAC를 사용하여 연결할 수 있습니다.

DAC는 특수 관리자 스위치(-A)를 사용하여 sqlcmd 명령 프롬프트 유틸리티를 통해 사용할 수 있으며 지원됩니다. sqlcmd 사용에 대한 자세한 내용은 스크립팅 변수와 함께 sqlcmd 사용을 참조하세요. sqlcmd -Sadmin:<instance_name> 형식의 인스턴스 이름에 접두admin:사를 연결할 수도 있습니다. instance_name 연결하여 SQL Server Management Studio 쿼리 편집기 DAC를 admin:<>시작할 수도 있습니다.

제한 사항

DAC는 드문 경우에서 서버 문제를 진단하기 위해서만 존재하기 때문에 연결에 몇 가지 제한 사항이 있습니다.

  • 연결에 사용할 수 있는 리소스를 보장하기 위해 SQL Server 인스턴스당 하나의 DAC만 허용됩니다. DAC 연결이 이미 활성 상태인 경우 DAC를 통해 연결하는 새 요청은 오류 17810으로 거부됩니다.

  • 리소스를 절약하기 위해 SQL Server Express는 추적 플래그 7806으로 시작하지 않는 한 DAC 포트에서 수신 대기하지 않습니다.

  • DAC는 처음에 로그인과 연결된 기본 데이터베이스에 연결을 시도합니다. 성공적으로 연결되면 master 데이터베이스에 연결할 수 있습니다. 기본 데이터베이스가 오프라인이거나 사용할 수 없는 경우 연결에서 오류 4060을 반환합니다. 그러나 다음 명령을 사용하는 대신 마스터 데이터베이스에 연결하도록 기본 데이터베이스를 재정의하면 성공합니다.

    sqlcmd -A -d 마스터

    데이터베이스 엔진 인스턴스가 시작된 경우 마스터를 사용할 수 있도록 보장되므로 DAC를 사용하여 master 데이터베이스에 연결하는 것이 좋습니다.

  • SQL Server는 DAC를 사용하여 병렬 쿼리 또는 명령을 실행하는 것을 금지합니다. 예를 들어 DAC를 사용하여 다음 문 중 하나를 실행하면 오류 3637이 생성됩니다.

    • RESTORE

    • BACKUP

  • DAC에서는 제한된 리소스만 사용할 수 있습니다. DAC를 사용하여 리소스 집약적 쿼리(예: 큰 테이블의 복잡한 조인) 또는 차단할 수 있는 쿼리를 실행하지 마세요. 이렇게 하면 DAC가 기존 서버 문제를 복잡하게 만들지 않도록 방지할 수 있습니다. 잠재적인 차단 시나리오를 방지하려면 차단할 수 있는 쿼리를 실행해야 하는 경우 가능한 경우 스냅샷 기반 격리 수준에서 쿼리를 실행합니다. 그렇지 않으면 트랜잭션 격리 수준을 READ UNCOMMITTED로 설정하고 LOCK_TIMEOUT 값을 2000밀리초 또는 둘 다와 같은 짧은 값으로 설정합니다. 이렇게 하면 DAC 세션이 차단되지 않습니다. 그러나 SQL Server가 있는 상태에 따라 DAC 세션이 래치에서 차단될 수 있습니다. CNTRL-C를 사용하여 DAC 세션을 종료할 수 있지만 보장되지는 않습니다. 이 경우 유일한 옵션은 SQL Server를 다시 시작하는 것입니다.

  • DAC와의 연결 및 문제 해결을 보장하기 위해 SQL Server는 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를 다시 시작하는 것이 유일한 해결 방법입니다. 다음은 일반 지침을 제공합니다.

    • 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 작업이 없지만 KILL 명령을 실행한 후 세션이 sys.dm_exec_sessions 유지되는 경우 사용 가능한 작업자가 없다는 의미입니다. 현재 실행 중인 작업 중 하나(sessions_id <> NULL과 함께 sys.dm_os_tasks 보기에 나열된 작업)를 선택하고 연결된 세션을 종료하여 작업자를 해제합니다. 단일 세션을 종료하는 것만으로는 충분하지 않을 수 있습니다. 여러 세션을 종료해야 할 수 있습니다.

DAC 포트

SQL Server는 사용 가능한 경우 TCP 포트 1434의 DAC를 수신 대기하거나 데이터베이스 엔진 시작할 때 동적으로 할당된 TCP 포트를 수신 대기합니다. 오류 로그에는 DAC가 수신 대기 중인 포트 번호가 포함됩니다. 기본적으로 DAC 수신기는 로컬 포트에서만 연결을 허용합니다. 원격 관리 연결을 활성화하는 코드 샘플은 원격 관리자 연결 서버 구성 옵션을 참조하세요.

원격 관리 연결이 구성되면 SQL Server를 다시 시작하지 않고도 DAC 수신기가 사용하도록 설정되고 클라이언트가 DAC에 원격으로 연결할 수 있습니다. 먼저 DAC를 로컬로 사용하여 SQL Server에 연결한 다음 sp_configure 저장 프로시저를 실행하여 SQL Server가 응답하지 않는 경우에도 DAC 수신기가 원격으로 연결을 수락하도록 설정할 수 있습니다.

클러스터 구성에서 DAC는 기본적으로 꺼져 있습니다. 사용자는 sp_configure 원격 관리자 연결 옵션을 실행하여 DAC 수신기가 원격 연결에 액세스할 수 있도록 할 수 있습니다. SQL Server가 응답하지 않고 DAC 수신기가 사용하도록 설정되지 않은 경우 DAC와 연결하려면 SQL Server를 다시 시작해야 할 수 있습니다. 따라서 클러스터형 시스템에서 원격 관리자 연결 구성 옵션을 사용하도록 설정하는 것이 좋습니다.

DAC 포트는 시작하는 동안 SQL Server에 의해 동적으로 할당됩니다. 기본 인스턴스에 연결할 때 DAC는 연결할 때 SSRP(SQL Server Resolution Protocol) 요청을 SQL Server 브라우저 서비스에 사용하지 않습니다. 먼저 TCP 포트 1434를 통해 연결합니다. 연결이 실패할 경우 SSRP 호출을 실행하여 포트를 설정합니다. SQL Server Browser가 SSRP 요청을 수신 대기하지 않는 경우 연결 요청은 오류를 반환합니다. DAC가 수신 대기 중인 포트 번호를 찾으려면 오류 로그를 참조하세요. SQL Server가 원격 관리 연결을 허용하도록 구성된 경우 명시적 포트 번호로 DAC를 시작해야 합니다.

sqlcmd-Stcp: <server,port><>

SQL Server 오류 로그에는 기본적으로 1434인 DAC의 포트 번호가 나열됩니다. SQL Server가 로컬 DAC 연결만 허용하도록 구성된 경우 다음 명령을 사용하여 루프백 어댑터를 사용하여 연결합니다.

sqlcmd-S127.0.0.1,1434

예시

이 예제에서 관리자는 서버 URAN123 가 응답하지 않음을 확인하고 문제를 진단하려고 합니다. 이를 위해 사용자는 sqlcmd 명령 프롬프트 유틸리티를 활성화하고 DAC를 나타내는 -A을 사용하여 서버 URAN123에 연결합니다.

sqlcmd -S URAN123 -U sa -P <xxx> -A

이제 관리자는 쿼리를 실행하여 문제를 진단하고 응답하지 않는 세션을 종료할 수 있습니다.

스크립팅 변수와 함께 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)

서버 구성 옵션(SQL Server)

트랜잭션 관련 동적 관리 뷰 및 함수(Transact-SQL)

추적 플래그(Transact-SQL)