3. 성능 로그를 DB에 입력하자.
백도훈
에이디컨설팅 선임 컨설턴트
Foreach 루프 컨테이너를 하나 더 추가해서 옮긴 로그 파일을 DB에 입력하는 역할을 맡기도록 하겠습니다.
이쯤 되면 질문이 나올 법도 한 게, 왜 앞에서 만든 Foreach 루프 컨테이너에서 이동한 파일을 그대로 DB에 입력하지 않았느냐 일 것입니다.
그 이유는, 로그 파일의 DB 입력을 확실하게 하기 위해서 입니다.
어떤 이유에서든지 DB의 서비스가 잠시 내려갔었다고 가정해보겠습니다.
하나의 Foreach 루프 컨테이너에 파일 이동과 DB 입력을 모두 구현해놨다면 파일이 이동은 되겠지만 DB가 서비스 중이지 않기 때문에 입력되지는 않을 것입니다. 이렇게 되면 서비스가 중지되어있는 상태에서 Job이 실행된 만큼 좀비가 된 로그 파일들이 늘어나게 될 것입니다.
따라서 파일을 일괄적으로 한 번에 모두 이동하고, 이동된 파일을 일괄적으로 DB에 입력하는 형태가 유실되는 파일이 생기지 않는 구조가 아닐까 생각합니다.
1. Foreach 루프 컨테이너를 추가하고 이름을 Log파일 DB입력이라고 변경하겠습니다.
PerfLog파일 이동 작업과 연결 시킵니다.
더블 클릭하여 Foreach 루프 편집기를 엽니다.
좌측에서 컬렉션 메뉴를 선택합니다.
열거자 구성의 폴더, 찾아보기 버튼을 클릭하고 이동된 로그 파일이 있는 폴더를 지정합니다.
(저의 경우에는 D:\LogFiles 폴더입니다.)
파일 속성에는 *.csv를 입력합니다.
파일 이름 검색은 이름 및 확장명을 선택합니다.
좌측 메뉴의 변수 매핑을 선택하고 변수 속성에 FileName을 선택하고 인덱스는 0으로 설정합니다.
2. Log파일 DB입력 작업 안에 데이터 흐름 작업을 추가하고 더블 클릭해서 데이터 흐름 디자이너 모드로 변경합니다.
3. 연결 관리자에서 새 플랫 파일 연결을 만듭니다.
연결 관리자 이름은 TargetFile이라고 입력합니다.
파일 이름에는 옮겨진 로그 파일의 폴더를 찾아 파일 하나를 선택해서 값을 입력합니다.
csv파일에 데이터 앞 뒤로 큰 따옴표가 붙기 때문에 그 따옴표를 떼기 위해 텍스트
건너뛸 머리글 행은 2를 입력합니다. (첫 행은 카운터 이름이기 때문이고, 두 번째 행은 올바른 값이 들어가지 않는 카운터가 있기 때문입니다.)
하단에 보면 열이 정의되지 않았다며 경고 아이콘이 떠 있는데 이것은 좌측 열 메뉴를 한번 클릭해서 들어가주면 자동으로 해결됩니다.
확인 버튼을 클릭해서 편집을 종료합니다.
Foreach 루프 컨테이너에서 선택한 폴더 안의 모든 파일 명을 던져주는데 이것을 동적으로 처리하기 위해 설정을 추가하도록 하겠습니다.
TargetFile의 Expressions 속성 중 ConnectionString 속성을 추가합니다.
값으로 @[사용자::TargetDir] + @[사용자::FileName]를 입력합니다.
4. 플랫 파일 원본을 데이터 흐름 디자이너 창에 추가하고 더블 클릭하여 편집 창을 엽니다.
그럼 자동으로 방금 생성한 TargetFile이 연결 관리자로 입력되어 있을 것 입니다.
확인 버튼을 클릭하고 편집을 종료합니다.
5. 파생 열을 추가하여 플랫 파일 원본과 연결합니다.
열 0 ~ 열 5를 모두 파생 열에 추가하고 다음과 같이 이름과 식을 변경합니다.
카운터 로그에 가끔 빈 값(공백)이 입력되기도 합니다. 항상 올바른 값이 들어오는 건 아니더군요.
그 때를 대비해서 빈 값이 넘어오면 0으로 대치하는 조건부 식을 추가했습니다.
파생 열 이름 |
식 |
PerfTime |
(DT_DATE)SUBSTRING([열 0],1,19) |
ProcessorTime |
[열 1] == " " ? 0 : (DT_DECIMAL,17)[열 1] |
UserConnections |
[열 2] == " " ? 0 : (DT_DECIMAL,17)[열 2] |
BatchRequests |
[열 3] == " " ? 0 : (DT_DECIMAL,17)[열 3] |
SqlCompilations |
[열 4] == " " ? 0 : (DT_DECIMAL,17)[열 4] |
ProcessorQueueLength |
[열 5] == " " ? 0 : (DT_DECIMAL,17)[열 5] |
6. 연결 관리자에서 새 OLE DB 연결을 추가하고 앞에서 만든 DB와 연결합니다. (앞에서의 스크립트를 그대로 실행했다면 PerfMonDB 데이터베이스와 연결하시면 됩니다.)
새로 만든 연결 이름은 TargetDB로 변경하겠습니다.
7. OLE DB 대상을 추가하고 파생열과 연결합니다.
OLE DB 대상을 더블 클릭하여 편집 창을 엽니다. 연결 관리자는 TargetDB와 연결합니다.
테이블은 PerfData로 선택하고 테이블 잠금은 해제를 해주기로 하죠.
좌측 매핑 메뉴를 클릭해서 입력 열과 대상 열의 매핑이 잘 되었는지 확인합니다.
8. 자, 이제 다시 제어 흐름 디자인 창으로 돌아오겠습니다.
DB 입력까지 마무리 되었으니 로그 파일을 삭제하도록 하겠습니다.
파일 시스템 작업을 Log 파일 DB 입력 안에 추가하고 DB 입력과 연결하겠습니다.
이름은 로그 파일 삭제라고 변경할까요?
편집기를 열어 Operation을 파일 삭제로 변경하고 SourceConnection은 TargetFile로 연결하겠습니다.
기억하시겠지만 TargetFile은 DB 입력 데이터 흐름 작업 내에서 플랫 파일 원본의 연결로 설정했었기 때문에 같은 Foreach 루프 컨테이너 안에서는 삭제할 로그 파일을 지정하고 있습니다.
패키지의 기본 골격이 모두 마무리 되었습니다.
한번 실행을 해보겠습니다.
앞의 글에서 말씀 드린 것처럼 아웃 리치를 다녀오는 사이에 Agent에 작업을 걸어놓고 갔다 돌아왔더니 꽤 많은 데이터가 쌓였었습니다.
모두 실행이 잘 되셨나요? ^^;;
'연구개발 > DTS & SSIS' 카테고리의 다른 글
SSIS를 이용한 서버 성능 수집 프로세스 구현 - 메일 발송 (0) | 2009.06.20 |
---|---|
SSIS를 이용한 서버 성능 수집 프로세스 구현 - 엑셀 내보내기 (0) | 2009.06.20 |
SSIS를 이용한 서버 성능 수집 프로세스 구현 - 로그 파일 이동 (0) | 2009.06.20 |
SSIS를 이용한 서버 성능 수집 프로세스 구현 - 성능 로그 남기기 (0) | 2009.06.20 |
SSIS를 이용한 서버 성능 수집 프로세스 구현 - 소개와 구조 설명 (0) | 2009.06.20 |