'2009/02'에 해당되는 글 4건
- 2009/02/18 SQL Server 2005 Analysis Service - 큐브 만들기
- 2009/02/17 MSDTC 설정 문제 해결 - DTCTESTER.EXE
- 2009/02/11 원곡보다 나은 걸...소녀시대-GEE
- 2009/02/03 SQL Server 2005 Agent Job 수행 결과 조회 후 실패 알림
작업 데이터베이스는 MS에서 Sample로 제공하는 AdvenctureWorks 데이터베이스를 사용합니다.
SQL Server 2005 클라이언트 유틸리티를 설치하면 Visual Studio 2005에서 BI 프로젝트를 생성할 수 있습니다. Analysis Service 프로젝트를 생성해서 다음과 같은 작업을 수행합니다.
1. 데이터 원본
공급자(Provider)는 .NET 공급자와 네이티브OLEDB 공급자를 모두 지원합니다. 우리는 기본 공급자인 네이티브 OLEDB의 Sql Native Clinet를 사용해서 AdventureWorks를 연결합니다.
2. 데이터 원본 뷰
데이터 원본 뷰 생성 마법사에서 Sales.SalesOrderHeader와 Sales.SalesOrderDetail 테이블을 추가하고 완료합니다.
완료되면 데이터 원본 뷰 디자이너가 출력되는데 디자이너 팝업 메뉴에서 “새 명명된 쿼리”를 선택합니다.
이름은 SalesOrderDate로 하고 다음 쿼리를 입력합니다.
SELECT SalesOrderID, YEAR(OrderDate) AS OrderYear, MONTH(OrderDate)
AS OrderMonth, DAY(OrderDate) AS OrderDay
FROM Sales.SalesOrderHeader
SalesOrderDate는 차원(Dimension) 역할을 할 뷰입니다.
이 쯤에서 차원(Dimesion)과 팩터(Factor)를 알아봅시다.
팩터는 실제 분석할 대상 데이터입니다. 연도별 매출액을 집계 낼 때 매출데이터가 팩터가 되고 년도가 차원이 됩니다.
저는 차원을 팩터를 분석하는 기준 데이터라고 이해하고 있습니다.
매출액을 연도별로 집계를 낼 때 기준이 되는 데이터는 연도가 되는 거죠.
이 연도가 차원이고 차원 중에서 자주 쓰이는 [시간 차원]에 해당합니다.
일반적으로 차원과 팩터는 관계 데이터베이스와 마찬가지로 관계가 설정되어야 합니다. 차원에 주키(Primary Key)가 있고 팩터에서 차원의 주키를 참조하는 외부키(Foreign Key)가 있어야 합니다.
다음과 같은 관계가 되는 거죠.
SalesOrderDate의 SalesOrderID 컬럼을 논리적 기본키로 설정한 후에 SalesOrderHeader의 SalesOrderID와 관계를 설정합니다. 기본키(대상) 테이블이 SalesOrderDate(차원) 테이블이 되고 외래키(원본) 테이블이 SalesOrderHeader(팩터)와 SalesOrderDetail(팩터) 테이블이 됩니다.
주의할 것은 팩터에 있는 외래키 값 모두가 차원의 주키에 포함되어야 한다는 겁니다. 즉 SalesOrderHeader(팩터)의 SalesOrderID=10 인 레코드가 있는데 SalesOrderDate(차원)의 SalesOrderID에는 10인 값이 없을 경우 큐브를 생성하고 처리할 때 다음과 같은 오류가 발생합니다.
OLAP 저장소 엔진 오류: 특성 키를 찾을 수 없습니다: 테이블: Sales_SalesOrderHeader, 열: SalesOrderID, 값: 43659.
OLAP 저장소 엔진 오류: 특성 키를 찾을 수 없어 레코드를 건너뛰었습니다. 데이터베이스: AdventureWorksOLAP, 큐브: Adventure Works, 측정값 그룹: Sales Order Header, 파티션: Sales Order Header, 레코드: 1의 차원: Sales Order Date 특성: SalesOrderID.
3. 큐브
이제 큐브를 만들어 보죠.
큐브 마법사를 실행합니다. 생성 방법 선택 다이얼로그에서 [데이터 원본을 사용하여 큐브 생성]을 선택하고 [자동 생성] 체크박스를 해제합니다.
물론 자동으로 생성해도 깔끔하게 생성됩니다만 수동으로 생성해봐야 더 빨리 이해할 수 있습니다.
팩트 및 차원 테이블 식별 다이얼로그에서 다음 그림과 같이 [Sales.SalesOrderHeader]를 팩트 테이블로 [SalesOrderDate]를 차원 테이블로 각각 선택합니다.
다음->다음을 선택한 후 최종 마침을 선택하면 큐브와 차원이 각각 생성됩니다.
생성된 큐브를 더블클릭하면 큐브 작업 윈도우가 나옵니다.
세세하게 살펴보지 않고 두 가지만 짚어보기로 하죠.
A) 처리
프로젝트가 변경되었을 경우 먼저 리빌드 후 서버에 배포를 합니다
서버는 SQL Server 2005 Analysis Service가 설치된 서버인데 로컬서버라 가정합니다.
배포하고 난 후 SSMS에서 Analysis Service에 연결하면 다음과 같이 Visual Studio에서 생성한 BI프로젝트가 배포된 것을 확인할 수 있습니다.
큐브 처리는 다음 아이콘을 클릭해서 진행할 수 있습니다.
처리를 시작하면 다음과 같은 오류를 만날 수도 있습니다.
이 오류는 데이터베이스 원본 생성시 선택한 ImpersonationMode(윈도우 자격 증명 가장)에 문제가 있을 경우 발생합니다. 이럴 경우 데이터 원본의 속성 다이얼로그를 연 후 다음과 같이 변경하시면 됩니다.
모든 오류를 수정하고 처리가 성공하면 다음 그림과 같은 다이얼로그를 볼 수 있습니다.
B. 브라우저
마지막으로 처리된 큐브 데이터를 확인해 보죠.
다음과 같이 [브라우저] 탭을 선택합니다.
왼쪽 Adventure Works 트리뷰에서 Measures 항목의 [Sales Order Header] 팩터를 확장한 후, [Sales Order Header 카운트] 항목을 다음과 같이 드래그&드랍합니다.
[Sales Order Date] 차원에서 [Order Year] 항목을 다음과 같이 행 필드 영역에 드래그 & 드랍합니다.
[Order Month]와 [Order Day] 항목도 차례로 행 필드 영역에 드래그 & 드랍하면 다음과 같이 처리된 결과 데이터를 탐색할 수 있게 됩니다.
이상으로 SQL Server 2005 Analysis Service에서 큐브를 만드는 방법을 살펴보았습니다.
앞으로 살펴볼 항목은 다중차원(Multi-Dimension)과 2개 이상의 데이터 원본을 사용해서 큐브를 만드는 방법입니다.
물론 스킵한 항목들을 꼼꼼하게 살펴볼 필요도 있습니다만 MSDN에 필요한 만큼 충분히 자세히 설명하고 있으므로 생략하도록 하겠습니다.
dtcping은 정상인데 dtctester.exe 로 했을때 다음과 같은 에러가 날 경우.
Error:
SQLSTATE=25S12,Native error=0,msg='[Microsoft][SQL Native Client]트랜잭션이 이미
암시적 또는 명시적으로 커밋되거나 중단되었습니다.
'
Error:
SQLSTATE=24000,Native error=0,msg=[Microsoft][SQL Native Client]잘못된 커서 상태
입니다.
Typical Errors in DTC Output When
a. Firewall Has Ports Closed
-OR-
b. Bad WINS/DNS entries
-OR-
c. Misconfigured network
-OR-
d. Misconfigured SQL Server machine that has multiple netcards.
Aborting DTC Transaction
Releasing DTC Interface Pointers
Successfully Released pTransaction Pointer.
다음 두 가지를 생각해 볼 수 있습니다.
1. CID 중복
서버 OS를 클론설치할 경우 MSDTC의 CID가 같아 분산 트랜잭션오류가 나느 경우가 있습니다.
regedit에서 "msdtc"로 찾기를 하면 HKEY_CLASSES_ROOT\CID 밑에 Description이 MSDTC인 CID(GUID)를 찾을 수 있습니다. 이 GUID를 GUID생성기로 생성한 새로운 GUID로 변경 후 서버를 재시작 하면 됩니다.
2. 클러스터링
그래도 문제가 해결되지 않았고 분산 트랜잭션에 참여하는 서버 중에 클러스터링된 서버가 있을 경우 다음 사항을 체크해 봅니다.
분산 트랜잭션에 참여하는 모든 서버의 hosts 파일에는 참여하는 서버의 machine name과 ip가 등록되어 있어야 합니다.
클러스터링에 참여하지 않는 서버에는 특히 hosts 파일에 다음 항목이 추가되어 있어야 합니다.
192.168.xxx.02 cluster02
192.168.xxx.11 vmsql
192.168.xxx.35 vmdtc
클러스터링으로 묶인 물리적 서버의 호스트들을 등록하고 가상 mssql과 가상 msdtc의 호스트를 각각 등록해야 합니다.
이런 포스트는 잘 안쓰는데 정말 매력적이라 어쩔수 없네요...^^
SQL Server Agent Job(이후 작업으로 통일)이 성공하거나 실패했을 때 운영자에게 알릴 수 있는 방법이 있습니다.
다음 그림과 같이 작업 속성 중에 알림 탭을 보면 전자메일, 호출, Net Send, Windows 응용 프로그램 이벤트로그에 쓰기… 등의 알림 방법을 선택할 수 있습니다.
각각의 알림을 설정하는 방법은 SQL Server 2005 도움말이나 관련 웹사이트를 참조하세요.
이 글에서는 위 알림 설정을 사용할 수 없고(Net Send는 막혀있고 SMTP 메일 서버에 접속 불가능 할 때) ,
SMS와 메일을 DB의 테이블에 레코드를 추가하는 방식으로 전송할 수 있는 상용솔루션이 설치되어 있다고 가정합니다.
- 새로운 작업을 생성합니다.
- 작업속성에서 단계 탭을 선택한 후 유형을 "Transact-SQL 스크립트(T-SQL)"을 선택합니다.
-
명령 입력박스에 다음의 구문을 입력합니다.
|
declare @run_status tinyint , @message nvarchar(1024)
select @run_status = null
select @run_status = h.run_status , @message = h.message from msdb.dbo.sysjobhistory h inner join msdb.dbo.sysjobs j on h.job_id = j.job_id where step_id = 0 -- 작업결과단계 and j.name = '작업이름' and h.run_date = convert(char(8), getdate(), 112) order by h.run_date desc, h.run_time desc
select @run_status
-- 작업실패 if isnull(@run_status, 0) = 0 -- 0:실패, 1:성공, 2:... begin
메일전송SP 실행(오류메시지= @message) end |
@j.name = '작업이름' 부분에 실제 체크할 작업이름을 정확히 입력하시고,
메일전송SP 실행하는 부분을 적절히 수정하시면 됩니다.
-
일정 탭에서 체크할 작업이 수행된 이후의 시간을 설정합니다.
예를 들면 체크할 작업이 매일 오전 1시에 수행될 때 매일 오전 2시로 설정하면 됩니다.
- 저장합니다.



이올린에 북마크하기
Prev
Rss Feed