반응형
/********************************************************************************************
-- Title : [2k8] SQL Server에서 Oracle로 분산 트랜잭션 설정하기
-- Reference : sqlleader.com 한대성님
-- Key word : oracle 오라클 분산 트랜잭션 distributed transaction
********************************************************************************************/

일반 쿼리는 문제없음

KRDSHANORA : Oracle Server

 

분산 트랜잭션을 이용하면 다음과 같은 에러가 발생함



연결된 서버 "KRDSHANORA" OLE DB 공급자 "OraOLEDB.Oracle"() 메시지 "New transaction cannot enlist in the specified transaction coordinator. "() 반환했습니다.

Msg 7391, Level 16, State 2, Line 2

연결된 서버 "KRDSHANORA" OLE DB 공급자 "OraOLEDB.Oracle"() 분산 트랜잭션을 시작할 수 없으므로 요청한 작업을 수행할 수 없습니다.

 

 

다음과 같은 방식대로 상황을 점검해 보자.

1.     MSDTC가 실행 중인가?

: 분산 트랜잭션을 수행하기 위해서는 MSDTC 서비스가 필요하다. 단순히 쿼리 창에서 BEGIN DISTRIBUTED TRANSACTION 만을 실행시켜서 문제가 없는지 확인한다. 에러가 난다면, 제어판 à 관리도구 à 서비스 에서 Distributed Transaction Coordinator (클러스터 환경인 경우, MSDTC 리소스)가 시작되었는지 확인한다.

 

2.     다른 MSSQL 또는 오라클 서버에 대해서는 분산 트랜잭션이 제대로 되는지 확인한다.

: 다른 MSSQL도 안된다면, 보안 설정 문제가 원인일 수 있다. 3단계를 점검.

MSSQL로는 잘 되는데, 오라클로는 안된다면, 4단계부터 점검

 

3.     제어판 à 관리도구 à 구성요소 서비스를 열어서, 콘솔 루트 à 구성 요소 서비스 à 컴퓨터 à 내 컴퓨터에서 마우스 오른쪽 버튼을 클릭해서 나타나는 메뉴에서 속성을 선택.

MSDTC 탭으로 이동 후, 보안 구성을 선택


보안 구성 내에 다음과 같이 설정되어 있는지 확인한다.


특히 오라클과의 트랜잭션 처리를 위해서는 XA 트랜잭션 사용이 체크되어 있어야 한다.

 

4.     MSSQL에서 오라클로, 오라클에서 MSSQL MSDTC 이름으로 Name Resolution이 제대로 되는지 확인한다.

: 단순히, MSSQL 서버에서 PING <오라클서버명> 및 오라클 서버에서 PING <SQL 서버명> Cluster MSDTC가 있는 경우, PING <MSDTC>을 해서 제대로 되는지 확인한다.

만약, 제대로 PING이 안 된다면, Host 파일 등에 직접 IP와 이름을 명시해주는 방법을 취한다.

 

5.     135 포트가 제대로 열려있는지 확인한다.

: 명령 창에서 telnet <오라클 서버명> 135 를 실행해서 연결이 되면 열려있는 것이다.

 

6.     위의 사항 모두 점검했다면, Oracle Linked Server의 속성에서 RPC, RPC내보내기 체크되어 있는지 확인한다.

 

7.     마지막으로, 실행에서 regedit를 입력해서 레지스트리 편집기를 연다.

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSDTC\MTxOCI 부분을 열어서, OraSqlLib, OraXaLib 부분을 확인한다.

 

Oracle Client 설치 버전과 상관없이 SQLLib80.dll, xa80.dll이라고 값이 설정되어 있을 것이다. 이 값을, 설치된 Oracle Client 버전에 맞게 수정한다.

) Oracle 10g Client인 경우,


) Oracle 11g Client인 경우,


 

8.     Server를 리부팅한 후, 분산 트랜잭션을 이용한 쿼리를 수행해본다.

 

 


반응형

+ Recent posts