데이터 수집기 문제 해결
이 항목에서는 다음 범주의 문제 해결에 대해 설명합니다.
오류 조건. 이 범주에서는 개체 모델 및 런타임 오류를 다룹니다.
성능 문제. 이 범주에서는 일반 및 특정 성능 시나리오를 다룹니다.
시스템 중지. 이 범주에서는 데이터 컬렉션 도중 하위 구성 요소의 중지를 다룹니다.
오류 조건
개체 모델 또는 런타임 시 오류가 발생할 수 있습니다.
개체 모델 오류
데이터 수집기 개체 모델은 프로그래밍 방식으로 데이터 수집기 속성 및 데이터 컬렉션 집합을 관리하는 API로 관리됩니다. 개체 모델은 데이터 수집기의 구성 메커니즘을 제공하는 뷰 및 저장 프로시저 집합에 대한 씬 래퍼입니다. 자세한 내용은 데이터 수집기 프로그래밍을 참조하십시오.
개체 모델 오류는 다음의 개체 모델 구성 요소 중 하나로 인해 발생할 수 있습니다.
Transact-SQL 오류는 데이터 수집기 저장 프로시저 중 하나에서 호출된 저장 프로시저 또는 Transact-SQL 코드에서 발생합니다.
Transact-SQL 오류는 바로 데이터 수집기 저장 프로시저에서 발생합니다.
관리되는 예외가 바로 개체 모델에서 발생합니다.
다음 표에서 개체 모델에서 발생할 수 있는 오류에 대해 설명합니다.
오류 메시지 |
오류 번호 |
설명 |
---|---|---|
활성 컬렉션 집합 '%s'의 name, target, proxy_id 또는 collection_mode를 업데이트할 수 없습니다. 컬렉션 집합을 중지한 다음 다시 업데이트해 보십시오. |
14669 |
활성 컬렉션 집합을 업데이트하려고 했습니다. 해당 유형의 업데이트가 수행되기 전에 컬렉션 집합이 중지되어야 합니다. 컬렉션 집합이 활성 상태인 동안 업로드 일정만 변경할 수 있습니다. |
활성 컬렉션 집합 '%s'(을)를 삭제할 수 없습니다. 컬렉션 집합을 중지한 다음 다시 삭제해 보십시오. |
14670 |
실행 중인 컬렉션 집합을 삭제하려고 했습니다. |
활성 컬렉션 집합 '%s'에 있는 컬렉션 항목 '%s'의 이름 또는 매개 변수를 업데이트할 수 없습니다. 컬렉션 집합을 중지한 다음 컬렉션 항목을 다시 업데이트해 보십시오. |
14671 |
실행 중인 컬렉션 집합에 있는 컬렉션 항목을 업데이트하려고 했습니다. |
활성 컬렉션 집합 '%s'에 있는 컬렉션 항목 '%s'을(를) 삭제할 수 없습니다. 컬렉션 집합을 중지한 다음 컬렉션 항목을 다시 삭제해 보십시오. |
14672 |
실행 중인 컬렉션 집합에 있는 컬렉션 항목을 삭제하려고 했습니다. |
수집기 유형 '%s'을(를) 삭제할 수 없습니다. 이 수집기 유형과 관련된 모든 컬렉션 항목을 삭제한 다음 수집기 유형을 다시 삭제해 보십시오. |
14673 |
이 수집기 유형과 관련된 모든 컬렉션 항목이 들어 있는 수집기 유형을 삭제하려고 했습니다. |
비활성 컬렉션 집합 '%s'의 데이터를 업로드할 수 없습니다. 컬렉션 집합을 시작한 다음 데이터를 다시 업로드해 보십시오. |
14674 |
실행 중이 아닌 컬렉션 집합에 수집된 데이터를 업로드하려고 했습니다. |
name, target, proxy_id, logging_level 또는 collection_mode를 업데이트할 수 없거나 활성 컬렉션 집합 '%s'에 컬렉션 항목을 추가할 수 없습니다. 컬렉션 집합을 중지한 다음 다시 업데이트해 보십시오. |
14675 |
실행 중인 컬렉션 집합을 업데이트하려고 했습니다. |
사용자에게 '%s'을(를) 변경할 수 있는 권한이 없습니다. 사용자는 데이터 수집기 역할 '%s'의 멤버여야 합니다. |
14676 |
사용자가 특정 데이터 수집기 역할로만 변경할 수 있는 속성을 업데이트하려고 했습니다. |
사용자에게 이 작업을 수행할 수 있는 권한이 없습니다. 사용자는 데이터 수집기 역할 '%s'의 멤버여야 합니다. |
14677 |
사용자가 필수적인 데이터 수집기 역할의 일부가 없는 작업을 수행하려고 했습니다. |
ID가 %d인 SQL Server 추적이 외부 사용자에 의해 중지되고 닫혔습니다. SQL Server 추적 수집기에서 추적을 다시 만들려고 시도합니다. |
14678 |
데이터 수집기에 의해 생성되고 사용된 추적이 수집기 런타임 외부에서 중단되고 닫혔습니다. |
이 데이터 웨어하우스에서는 지정한 %s(%s)을(를) 사용할 수 없습니다. |
14679 |
관리 데이터 웨어하우스의 저장 프로시저 중 하나로 전달된 매개 변수에 웨어하우스의 다른 항목과 일치하지 않는 값이 들어 있습니다. |
이 버전의 instmdw.sql은 SQL Server 2005 이상 버전을 실행 중인 서버에 대해 실행되어야만 합니다. |
14680 |
SQL Server 2000 이하 버전을 실행 중인 서버에 관리 데이터 웨어하우스를 설치하려고 했습니다. |
수집기가 실행되지 않을 때는 이 절차를 수행할 수 없습니다. 수집기를 실행한 다음 다시 시도하십시오. |
14681 |
수집기의 상태와 충돌하는 작업을 수행하려고 했습니다. |
컬렉션 집합의 상태가 변경되지만 수집기를 실행하기 전에는 컬렉션 집합이 시작되거나 중지되지 않습니다. |
14682 |
수집기를 사용하지 않을 때 컬렉션 집합을 시작 또는 중지하려고 했습니다. |
스냅숏 또는 연속 모드에서 컬렉션 집합을 사용하려면 일정이 필요합니다. |
14683 |
일정을 제공하지 않고 스냅숏 또는 연속 모드에서 컬렉션 집합을 만들거나 업데이트합니다. |
발생한 오류#: %d, 수준: %d, 상태: %d, 프로시저: %s, 줄: %d, 메시지: %s |
14684 |
데이터 수집기 구성 요소에 일반적인 오류가 발생했으며, 이 오류는 catch 블록 및 다시 throw에서 발생했습니다. |
잘못된 작업입니다. ID = %d인 컬렉션 집합의 상태가 현재 "실행 중이 아님"입니다. |
14685 |
is_running 상태가 0인 집합에 대해 sp_syscollector_create_set_queue_and_service를 호출합니다. |
구성 저장소의 MDWInstance 및 MDWDatabase 매개 변수는 null일 수 없습니다. |
14686 |
MDWInstance 또는 MDWDatabase 매개 변수에 대한 관리 데이터 웨어하우스의 연결 문자열은 null입니다. |
@cache_window 매개 변수 값(%d)이 올바르지 않습니다. 허용되는 값은 -1(실패한 이전 업로드의 모든 업로드 데이터 캐시), 0 (업로드 데이터 캐시 안 함), N (N회의 실패한 이전 업로드의 데이터 캐시, 여기서 N은 1보가 크거나 같음)입니다. |
14687 |
수집기 구성 저장소의 CacheWindow 매개 변수 값을 -1보다 작은 값으로 설정하려고 했습니다. |
SQL Server 에이전트가 중지되어 있을 때는 컬렉션 집합을 시작할 수 없습니다. SQL Server 에이전트를 시작하십시오. |
14688 |
SQL Server 에이전트를 사용하지 않을 때 컬렉션 집합을 시작하려고 했습니다. |
관리 데이터 웨어하우스가 구성되어 있지 않으면 컬렉션 집합을 시작할 수 없습니다. instmdw.sql 스크립트를 실행하여 관리 데이터 웨어하우스를 만들고 구성하십시오. |
14689 |
관리 데이터 웨어하우스가 설정되어 있지 않을 때 컬렉션 집합을 시작하려고 했습니다. |
수집기가 실행될 때는 이 절차를 수행할 수 없습니다. 수집기를 비활성화한 다음 다시 시도하십시오. |
14690 |
수집기의 상태와 충돌하는 작업을 수행하려고 했습니다. |
수집기의 상태는 null일 수 없습니다. 이는 수집기 구성 데이터가 내부적으로 손상되었음을 나타내는 것일 수 있습니다. |
14691 |
sp_syscollector_verify_collector_state에 대한 호출을 통해 null 값이 있는 CollectorEnabled 매개 변수를 발견했습니다. 이는 수집기 구성 데이터가 내부적으로 손상되었음을 나타내는 것일 수 있습니다. |
런타임 오류
컬렉션 패키지 또는 업로드 패키지를 실행하여 문제가 발생하면 런타임 오류가 발생할 수 있습니다. 오류는 다음의 구성 요소 중 하나로 인해 발생할 수 있습니다.
SQL Server 2008 Integration Services(SSIS) 패키지의 데이터 흐름. 이러한 오류는 실패한 데이터 변환 또는 데이터 잘림의 결과일 수 있습니다. 데이터 수집기는 오류의 영향을 받은 행 수를 기록하고 이 수를 데이터 수집기 로그 테이블에 기록합니다.
SSIS 패키지의 제어 흐름. 이러한 오류는 msdb 데이터베이스(msdb.dbo.sysssislog)의 SSIS 로그 테이블에 기록되고 데이터 수집기 로그 테이블에 버블링됩니다.
데이터 수집기 런타임 구성 요소(dcexec.exe). 이러한 오류는 데이터 수집기 로그 테이블에 바로 기록됩니다.
자세한 내용은 데이터 수집기 로깅을 참조하십시오.
다음 메서드 중 하나를 사용하여 런타임 오류에 대한 상태 정보를 얻는 것이 좋습니다.
Transact-SQL 저장 프로시저 및 뷰
현재 실행 중이거나 완료된 모든 컬렉션 집합 또는 패키지의 상태를 보려면 다음 쿼리를 실행합니다.
use msdb
select * from syscollector_execution_log_full
위의 쿼리에서는 다음 결과 집합을 반환합니다.
열 이름 |
설명 |
---|---|
log_id |
각 컬렉션 집합의 실행에 대한 고유한 ID로 이 뷰와 자세한 다른 로그를 조인하는 데 사용됩니다. |
parent_log_id |
부모 패키지 또는 컬렉션 집합의 ID로 컬렉션 집합의 경우 NULL입니다. ID는 부모-자식 관계로 연결되어 있으므로 어떤 패키지가 어떤 컬렉션 집합에서 시작되었는지 쉽게 파악할 수 있습니다. 또한 이 뷰는 로그 항목을 부모-자식 연결로 그룹화하고 패키지의 이름을 들여쓰기로 처리하여 호출 체인을 명확히 표시해 줍니다. |
name |
이 로그 항목이 나타내는 컬렉션 집합 또는 패키지의 이름입니다. |
collection_mode |
항목을 만들 때 컬렉션 집합 활동이 컬렉션 또는 업로드입니다. |
start_time |
컬렉션 집합 또는 패키지가 시작된 시간입니다. |
last_iteration_time |
패키지를 계속 실행하기 위해 패키지에서 마지막으로 스냅숏을 캡처한 시간입니다. |
finish_time |
종료된 패키지 및 컬렉션 집합의 실행 완료 시간입니다. |
duration |
패키지 또는 컬렉션 집합이 시작된 이후부터의 실행 시간(밀리초)입니다. |
operator |
컬렉션 집합 또는 패키지를 시작한 운영자입니다. |
status |
컬렉션 집합 또는 패키지의 상태입니다. 이 상태는 다음과 같습니다.
|
failure_task |
컬렉션 집합 또는 패키지가 실패한 경우 SSIS 패키지에서 실패를 유발한 태스크의 이름입니다. |
package_execution_id |
SSIS 로그 테이블에 대한 링크입니다. |
collection_set_id |
데이터 수집기 구성 테이블에 대한 링크입니다.
참고
collection_set_id를 필터로 사용하여 로그의 특정 컬렉션 집합에 초점을 맞출 수 있습니다.
|
자세한 내용은 syscollector_execution_log_full(Transact-SQL)을 참조하십시오.
데이터 수집기에서 제공하는 함수 중 하나를 실행하여 컬렉션 집합 및 패키지 실행에 대한 추가 정보를 얻을 수 있습니다.
다음 함수에서는 패키지에서 기록한 오류 행 수를 포함하여 컬렉션 집합 또는 패키지에 대한 자세한 통계를 반환합니다.
select * from fn_syscollector_get_execution_stats(@log_id)
다음 함수는 패키지에 대한 package_execution_id와 일치하는 SSIS 로그(sysdtslog90) 부분을 반환합니다. 패키지가 실패할 경우 이것이 루트 오류가 무엇인지 찾아내는 최상의 방법입니다.
select * from fn_syscollector_get_execution_details(@log_id)
데이터 수집기 상태 보고서
SQL Server Management Studio에서 제공된 로그를 보면 위의 Transact-SQL 쿼리에서 반환된 정보와 동일한 것을 얻을 수 있습니다. 자세한 내용은 방법: 컬렉션 집합 로그 보기를 참조하십시오.
성능 문제
성능을 검토하고 진단하는 데 사용할 수 있는 데이터의 세 가지 주요 출처가 있습니다.
첫째, 이전 섹션에서 설명한 로그 테이블에서도 성능 문제를 설명할 수 있는 유용한 정보를 제공합니다.
fn_syscollector_get_execution_stats 함수는 다음 정보를 반환합니다.
열 이름 |
설명 |
---|---|
avg_row_count_in |
패키지의 데이터 흐름 태스크에 들어간 평균 행 수입니다. |
min_row_count_in |
패키지의 데이터 흐름 태스크에 들어간 최소 행 수입니다. |
max_row_count_in |
패키지의 데이터 흐름 태스크에 들어간 최대 행 수입니다. |
avg_row_count_out |
패키지의 데이터 흐름 태스크에서 빠져 나간 평균 행 수입니다. |
min_row_count_out |
패키지의 데이터 흐름 태스크에서 나간 최소 행 수입니다. |
max_row_count_out |
패키지의 데이터 흐름 태스크에서 나간 최대 행 수입니다. |
avg_duration |
패키지의 데이터 흐름 구성 요소에 소요된 평균 시간(밀리초)입니다. |
min_duration |
패키지의 데이터 흐름 구성 요소에 소요된 최소 시간(밀리초)입니다. |
max_duration |
패키지의 데이터 흐름 구성 요소에 소요된 최대 시간(밀리초)입니다. |
성능 데이터의 두 번째 출처는 syscollector_execution_log_full 테이블이며 컬렉션 집합을 실행했거나 실행 중인 기간에 대한 정보를 알려 줍니다.
마지막으로 성능 카운터를 사용하여 성능 문제를 평가할 수 있습니다. 데이터 수집기 프로세스(dcexec.exe) 인스턴스에 대한 표준 프로세스 카운터는 특히 데이터 수집기 런타임 구성 요소가 사용 중인 시스템 리소스의 양에 대한 좋은 지표를 제공합니다.
성능 문제 시나리오
다음 두 시나리오는 데이터 수집기를 실행 중일 때 가장 발생하기 쉬운 성능 문제입니다.
데이터 수집기가 시스템 리소스를 너무 많이 소비합니다.
데이터 수집기가 컬렉션 로드를 유지할 수 없습니다.
시스템 리소스의 과도한 사용
프로세스 성능 카운터의 분석에서 dcexec.exe 프로세스가 시스템 리소스를 너무 많이 소비하는 것으로 표시될 경우 다음 조사를 수행해야 합니다.
첫째, 대부분의 리소스를 사용 중인 단일 컬렉션 집합이 있는지 확인합니다.
컬렉션 집합을 식별하려면 syscollector_execution_log_full에서 프로세스 ID를 컬렉션 집합 ID에 매핑한 다음 syscollector_collection_sets 테이블에서 컬렉션 집합을 찾습니다.
컬렉션 집합이 수집하는 내용을 확인합니다. 다음 쿼리를 사용하여 집합에 그룹핑되는 컬렉션 항목을 모두 나열합니다.
select * from syscollector_collection_set_items where collection_set_id = <id>
위 쿼리의 정보를 사용할 경우 다음 질문을 고려해 보십시오.
너무 많은 컬렉션 항목이 있습니까?
단일 컬렉션 항목이 대부분의 문제를 일으킵니까?
너무 많은 데이터를 수집 중입니까?
위의 질문 중 하나의 대답이 예인 경우 컬렉션 또는 컬렉션 항목을 수정하여 수집한 데이터의 양을 수정하는 것이 좋습니다. 이렇게 하면 리소스 사용량이 줄어듭니다.
둘째, 활성 컬렉션 집합의 개수로 인해 문제가 발생하는지 확인합니다.
다음 쿼리를 사용하여 시스템에 정의된 컬렉션 집합의 개수를 확인합니다.
select count(*) from syscollector_collection_sets
다음 쿼리를 사용하여 현재 실행 중인 컬렉션 집합의 개수를 확인합니다.
select count(*) from syscollector_execution_log_full where parent_log_id is null and status = 1
성능 문제가 중단되면 문제가 컬렉션 또는 업로드 활동에 매핑되는지 확인합니다. 일정이 모두 같을 경우 이로 인해 문제가 발생할 수 있습니다. 컬렉션 또는 업로드 일정을 조정하면 간단하게 해결될 수도 있습니다.
컬렉션 로드를 유지할 수 없음
이 상태는 컬렉션 집합을 계속 실행할 경우에만 발생합니다. 컬렉션 빈도가 높고 수집할 대용량의 데이터가 있을 경우 컬렉션 패키지는 단일 스냅숏 반복에 할당될 때에 데이터를 처리하지 못할 수도 있습니다. 로그 테이블의 avg_duration 및 max_duration 열을 특정 컬렉션 항목에 대해 정의된 컬렉션 빈도와 비교하여 이 상태를 검색할 수 있습니다.
max_duration 값이 빈도 값보다 클 경우 컬렉션 패키지가 구성된 빈도를 항상 유지하지는 못할 수도 있습니다. avg_duration 값이 빈도 값보다 클 경우 컬렉션 패키지에 계속 문제가 발생합니다. 후자의 경우 빈도를 줄이거나 컬렉션 항목을 수정하여 수집되는 데이터의 양을 제한해야 합니다.
시스템 중지
데이터 컬렉션의 일부로 실행 중인 패키지가 처리를 중지하지만 종료되지 않고 이러한 상태를 유지할 경우 시스템이 중지될 수 있습니다. 컬렉션 집합을 중지하고 다시 시작하면 대부분의 시스템 중지를 해결할 수 있습니다.
실제 중단된 것과 의도된 동작을 구분하는 것이 중요합니다.
컬렉션 패키지를 계속 실행하면 대기 상태에서 대부분의 시간을 소비하므로 정기적으로 다시 시작하여 데이터 스냅숏을 수집합니다. 데이터 수집 후 패키지는 대기 모드로 돌아갑니다. 이 대기 상태는 시스템이 중지된 것처럼 보일 수도 있지만 중지된 것은 아닙니다. 확인하려면 주의 대상 패키지에 대해 syscollector_execution_log_full 테이블을 검사합니다. last_iteration_time이 현재 시간보다 나중이 아닐 경우 시스템 중지 상태가 아닙니다.
패키지가 컬렉션 동작을 트리거할 이벤트를 기다리도록 설계되었을 수도 있습니다. 이 경우 패키지를 해당 이벤트를 기다립니다. 이것은 시스템 중지가 아닙니다.
데이터 수집기와 관련된 시스템 중지가 있는지 확인하려면 다음 검사를 수행합니다.
먼저 조사할 컬렉션 집합에 해당하는 dcexec.exe 프로세스 ID를 확인합니다.
다음으로 해당 프로세스가 실행 중이고 리소스를 사용 중인지 확인합니다. 중지 프로세스는 항상 0%의 CPU를 사용하고 추가 메모리를 할당하지 않습니다. 이 프로세스는 높은 퍼센트의 CPU를 사용할 수도 있습니다. 이러한 경우라면 루핑되고 메모리가 존재하지 않을 수도 있습니다.
마지막으로 프로세스의 로그 테이블을 검사하여 마지막으로 업데이트된 시간을 확인합니다. 업데이트 시간이 컬렉션 항목의 빈도 이상일 경우 해당 프로세스는 중지될 수 있습니다.
데이터 수집기 프로세스가 중지될 수 있는 이유는 여러 가지가 있습니다. 가장 일반적인 이유는 다음과 같습니다.
패키지가 다음 반복 신호를 받을 때까지 기다리지만 발생하지 않습니다.
패키지가 다른 패키지에서 보유하는 공유 잠금을 기다리지만 해당 잠금이 해제되지 않습니다.
제대로 처리되지 않은 패키지 실행 도중 오류가 발생했고 제어 흐름이 끊어졌지만 패키지가 완전히 실패하지는 않았습니다.
위의 경우 중 하나라면 시스템 중지와 관련된 로그에 특정 항목이 있습니다. 원인을 나타내는 메시지가 있는지 확인합니다. 시스템 중지가 발생할 경우 dcexec.exe 프로세스의 덤프를 만들어 자세히 조사합니다.