WMI 이벤트 감시자 작업
WMI 이벤트 감시자 작업은 WMI 데이터 판독기 작업과 마찬가지로 시스템의 WMI 정보를 이용하는 작업 개체입니다. WMI 데이터 판독기 작업은 현재 시스템의 상태나 정보를 읽어오는 작업이라면, WMI 이벤트 감시자 작업은 시스템에서 발생하는 이벤트를 인식하는 작업이라 할 수 있습니다. (WMI와 관련된 정보는 이전 강좌에 포함된 내용을 참고하시기 바랍니다.)
다음과 같은 경우를 생각해 봅시다.
Ÿ 지정된 폴더(예 : C:\FTPData\)에 원하는 파일이 전송되는 경우에, 파일을 읽어오는 작업을 수행하도록 합니다. Ÿ 현재 SQL Server 프로세스(sqlservr.exe)의 CPU 사용율이 30% 미만인 경우, Bulk Insert 작업을 수행하고자 하며, 그렇지 않은 경우에는 30% 미만으로 떨어질 때 까지 기다리도록 합니다. Ÿ 디스크 드라이브의 여유 공간이 10GB 이하가 되면, 오래된 파일들을 삭제하도록 합니다. Ÿ 원격지 서버의 상태를 확인한 후, 서비스가 실행될 때에 데이터 전송 작업을 수행하도록 합니다. |
필자가 담당했었던 작업 중 하나를 예로 들어 설명하겠습니다. 은행에서 매 시간마다 FTP를 이용하여 텍스트 형태의 데이터 파일이 전송되며, 이 파일들이 넘어오면 즉시 DB에 Insert를 수행한 후 데이터베이스 처리 작업을 수행합니다. 하지만, 넘어오는 시간이 정확히 정시에 전송되는 것이 아니라 5분 정도 빨리 오거나 5분 정도 늦게 오기도 합니다. 이 작업을 수행하기 위해 DTS로 텍스트 파일을 읽어오는 패키지를 만든 후, 이를 SQL Agent에 작업으로 등록하였습니다. DTS 패키지 내에서는 ActiveX 스크립트 작업을 이용하여 파일이 생성되었는지를 확인하고 파일이 있는 경우 해당 파일명을 읽어오는 작업을 작성하였으며, SQL Agent에는 매 정시 5분 전부터 5분 후까지 1분 단위로 계속 반복 수행하도록 하는 일정들을 만들어 추가하였습니다.
위와 같은 작업에서 WMI 이벤트 감시자 작업을 사용한다면 상당히 간단하고 편리하게 수행할 수 있습니다. WMI 이벤트 감시자는 OS에서 발생되는 WMI 이벤트를 인식합니다. 즉, SSIS나 SQL Server에서 해당 이벤트가 발생되었는지를 확인하는 작업을 만들고 이를 수행하는 대신, 단순히 OS가 발생시키는 이벤트를 감지하는 작업만 수행하면 됩니다. 위의 예에서와 같이, FTP든 단순 파일 복사를 이용하든 특정 폴더에 파일이 생성되면 OS에서는 파일이 새로 생겼다는 WMI 이벤트를 발생시키게 되며, 이 이벤트를 SSIS의 WMI 이벤트 감시자 작업에서 인식하게 됩니다. 이벤트가 발생되기 전까지 무한대로 기다릴지, 또는 특정 기간 동안만 기다릴 지는 WMI 이벤트 감시자 작업 내의 Timeout 속성에서 지정할 수도 있습니다. 이러한 작업 방식은 파일이 전송 되었는지 확인하기 위해 반복적으로 SQL Agent나 SQL Server, DTS를 수행함으로써 생기는 부하를 없앨 수 있으며, 이름 그대로 감시자 역할을 하는 작업 개체 하나만 실행되고 있기 때문에 훨씬 간단하고 효율적이라 할 수 있습니다.
WMI 이벤트 감시자 작업 역시 WMI 데이터 판독기 작업과 마찬가지로 WMI 연결을 사용합니다. 연결 관리자에서 WMI 연결을 추가하거나 작업 내의 WmiConnection 속성 부분에서 WMI 연결을 새로 추가해 주면 됩니다. WMI 연결 추가 방법에 대해서는 이전 글을 참고하시기 바랍니다.
WMI 이벤트 감시자 작업에서 지정할 수 있는 속성은 다음과 같습니다.
Ÿ WmiConnection – WMI 연결을 지정합니다.
Ÿ WqlQuerySourceType – WMI 이벤트를 인식하기 위한 WQL 쿼리의 입력 형태를 지정합니다. 직접 입력하도록 설정하거나, 변수에 WQL 쿼리문을 저장시킨 후, 이 변수값을 불러와서 실행하거나, 혹은 별도의 쿼리 파일을 만든 후, 이 파일에서 읽어오는 방식으로 수행할 수 있습니다.
Ÿ WqlQuerySource – 직접 입력으로 지정한 경우 WQL 쿼리를 입력합니다.
Ÿ ActionAtEvent – 이벤트가 발생되었을 때 행할 수행 동작을 설정합니다.
ú 이벤트 기록 – 단순히 이벤트가 발생된 것을 감지하고 AfterEvent 속성에 지정된 대로 진행합니다.
ú 이벤트를 기록하고 SSIS 이벤트를 실행합니다. – AfterEvent 속성에 지정된 대로 진행하는 것 외에 SSIS 패키지의 이벤트 처리기에서 WMI 이벤트 발생 시 수행되도록 설정한 작업을 실행 시킵니다. 즉, 이벤트 처리기의 WMIEventWatcherEventOccurred 처리 작업에 포함된 작업들이 수행되는 것입니다.
Ÿ AfterEvent – 이벤트가 발생된 후 WMI 이벤트 감시자 작업 결과를 성공으로 반환할 지, 실패로 반환할 지, 또는 다시 감시하도록 할 지를 설정합니다. 이벤트를 다시 감시하도록 하는 경우, 아래에 있는 NumberOfEvents의 횟수만큼 반복하게 됩니다.
Ÿ ActionAtTimeout – Timeout 속성에서 지정된 시간(초)이 지난 경우 행할 작업 형태를 지정합니다. 이 속성 역시 ActionAtEvent의 속성과 같이 단순히 시간 초과 상태로 AfterTimeout에 지정된 대로 행할 것인지, SSIS 이벤트 처리기에서 WMIEventWatcherEventTimeout 이벤트 처리 작업을 수행할 지 설정합니다.
Ÿ AfterTimeout – Timeout 속성에서 지정된 시간(초)이 지난 경우, WMI 이벤트 감시자 작업 결과를 성공으로 반환할 지, 실패로 반환할 지, 또는 다시 감시하도록 할 지를 설정합니다. 이벤트를 다시 감시하도록 하는 경우, 아래에 있는 NumberOfEvents의 횟수만큼 반복하게 됩니다.
Ÿ NumberOfEvents – 이벤트가 발생되거나 시간 초과 인 경우, 이벤트를 다시 감시할 횟수를 설정합니다. 만약 이 값을 0으로 설정하면 계속 반복해서 다시 감시하게 됩니다.
Ÿ Timeout – 이벤트가 발생할 때까지 대기할 시간을 지정합니다. 0으로 지정할 경우 무한 대기 입니다.
WMI 이벤트 발생시,
1. 정해진 작업을 한 번만 수행하도록 하는 경우에는
a. NumberOfEvents의 값을 1로 설정하고,
b. AfterEvent를 성공 반환,
c. AfterTimeout을 실패 반환
으로 설정하면 됩니다.
2. 동일한 이벤트에 대해 계속해서 작업을 수행하고 싶다면,
a. Timeout 값을 0으로 설정하고,
b. NumberOfEvents값을 0,
c. ActionAtEvent를 이벤트를 기록하고 SSIS 이벤트를 실행,
d. AfterEvent를 이벤트 다시 감시로 설정한 후,
e. 이벤트 처리기의 WMIEventWatcherEventOccurred 부분에 수행하고자 하는 작업을 추가 합니다.
이렇게 설정하면 작업자가 직접 작업을 종료시키기 전까지는 계속 작업이 수행되며, 이벤트 발생 시에도 WMI 이벤트 감시자 작업은 다음 단계로 진행하지 않게 되기 때문에 다음 단계에 작업을 추가하더라도 수행하지 못하게 됩니다.
(∵ WMI 이벤트 감시자 작업이 성공으로 결과가 반환되어야 다음 단계가 수행되지만, 항상 수행 중이기 때문입니다.)
따라하기
본 예제에서는 C:\SSISDemo\ 폴더에 특정 파일이 추가되는 경우, 해당 파일 명을 출력하도록 하는 간단한 작업을 만들어 보겠습니다. Timeout 은 30초로 설정하며, 30초 내에 해당 폴더에 파일이 추가되지 않는 경우에는 실패로 처리됩니다.
1. BIDS(Business Intelligence Development Studio)를 실행시켜서 빈 Integration Services 프로젝트를 엽니다. (기존의 프로젝트를 계속 사용하여도 됩니다.) 작업 창의 오른쪽에 있는 솔루션 탐색기 중 SSIS 패키지 부분에서 WMI이벤트감시자.dtsx 라는 이름으로 패키지 파일을 하나 추가합니다.
2. 왼쪽 도구 상자에서 WMI 이벤트 감시자 작업을 선택하여 제어 흐름 영역에 추가한 후, 이름을 [파일 생성 확인]으로 변경합니다.
3. 추가한 작업을 더블 클릭하여 속성 창을 엽니다. WMI 옵션 탭의 WmiConnection 속성에서 <새 WMI 연결..>을 선택하여 새로운 WMI 연결을 추가합니다. 본 예제에서는 Windows 인증을 사용하도록 하겠습니다. 로컬 서버가 아닌 원격 서버에 대해 WMI 정보를 읽어오는 작업을 만드는 경우, 서버 이름과 사용자 자격 증명 정보를 변경하여 사용하면 됩니다.
4. WqlQuerySourceType을 직접 입력으로 설정한 후, WqlQuerySource에 다음과 같은 WQL 쿼리를 입력합니다.
SELECT * FROM __InstanceCreationEvent WITHIN 1
WHERE TargetInstance ISA "CIM_DirectoryContainsFile"
and TargetInstance.GroupComponent= "Win32_Directory.Name=\"c:\\\\SSISDemo\""
5. ActionAtEvent를 이벤트 기록, AfterEvent를 성공 반환, ActionAtTimeout을 시간 초과 기록, AfterTimeout을 실패 반환, Timeout을 30으로 설정합니다.
여기까지가 파일이 추가되었을 때의 이벤트를 인식하는 작업입니다.
여기서 잠깐 보충 설명을 하겠습니다. 위에서 다루는 이벤트는 파일이 추가되거나 전송되었을 때, 즉 C:\SSISDemo\ 폴더에 파일이 하나가 추가되었을 때 단순히 ‘파일이 추가되었습니다.’ 라는 이벤트일 뿐이며, 추가된 파일이 무엇인지, 어떤 속성을 가지고 있는지에 대한 정보를 포함하고 있는 것은 아닙니다. 또한 위의 작업은 우리가 정한 폴더인 C:\SSISDemo 에서 그러한 이벤트가 발생되었다라는 것을 인식하는 것일 뿐입니다. 따라서 추가된 파일의 파일 명 정보나 크기, 속성 등의 정보를 읽어오기 위해서는 별도의 작업을 만들어야 합니다.
이러한 기능을 구현하는 방법에는 여러 가지가 있을 수 있으며, 본 예제에서는 WMI 이벤트 감시자 작업에 대해 중점을 두기 때문에 단순히 하기 위해 C:\SSISDemo 폴더의 파일명 전체를 텍스트로 출력시키는 작업으로 진행하도록 하겠습니다.
파일이 추가되었을 때 추가된 파일들에 대한 정보를 나타내는 전체 패키지는 추후에 진행할 활용 강좌에서 소개하도록 하겠습니다.
6. 제어 흐름 영역에 WMI 데이터 판독기 작업을 하나 추가한 후, 작업의 이름을 [파일명 출력]으로 변경하고, [파일 생성 확인] 작업의 녹색 연결선을 [파일명 출력] 작업에 연결시킵니다.
7. 추가한 WMI 데이터 판독기 작업을 더블 클릭하여 편집기 창을 연 후, WmiConnection의 속성 값은 이미 추가된 [WMI 연결 관리자]로 지정한 후, WqlQuerySource에 다음과 같은 WQL 쿼리를 입력합니다.
SELECT Name, FileSize FROM CIM_DataFile WHERE Drive='c:' and Path='\\SSISDemo\\'
8. OutputType은 데이터 테이블, OverwriteDestination은 대상 덮어쓰기, DestinationType을 파일 연결로 지정하고, Destionation의 속성에서 <새 연결..>을 이용하여 결과가 저장될 파일 연결을 추가합니다.
본 예제에서는 C:\FileResult.csv 에 결과가 저장되도록 설정하겠습니다.
9. 이제 윈도우 탐색기에서 C:\SSISDemo 라는 이름의 폴더를 만든 후 패키지를 실행합니다.
WMI 이벤트 감시자가 30초 동안 C:\SSISDemo 폴더에 파일이 추가되는지 감시하게 되며, 감시하는 동안 패키지는 실행 중인 상태를 나타내는 노란색으로 표시됩니다.
<실행 중인 상태 : 이벤트 감시 중>
<작업 실패 : 지정된 Timeout 시간인 30초 동안 C:\SSISDemo 에 파일이 추가 되지 않은 경우>
다시 패키지를 실행 시킨 상태에서 C:\SSISDemo 폴더에 아무 파일을 복사해서 넣습니다.
<작업 성공 : 지정된 시간 내에 파일 생성 이벤트가 발생한 경우>
C:\에 생성된 FileResult.csv를 확인하여 파일 정보를 확인합니다.
WMI 이벤트 감시자 작업은 WMI 데이터 판독기 작업과 함께 ETL 작업 및 데이터베이스 유지 관리 작업 등에서 상당히 유용하게 사용할 수 있는 작업 개체입니다. 이러한 작업들을 적절히 응용한다면, 보다 효율적이며 간단한 패키지를 사용할 수 있습니다.
'연구개발 > DTS & SSIS' 카테고리의 다른 글
기본 강좌 14 - 패키지 실행작업 (0) | 2009.06.20 |
---|---|
기본 강좌 13 - 스크립트 작업 (0) | 2009.06.20 |
기본 강좌 11 - WMI 데이터 판독기 작업 (0) | 2009.06.20 |
기본 강좌 10 - 전송 작업 (0) | 2009.06.20 |
기본 강좌 9 - DTS 패키지를 업그레이드 및 마이그레이션 (2) (0) | 2009.06.20 |