SQL Server 에서 사용하는 Virtual memory address space 에 로드된 모듈을 확인하기 위해 sys.dm_os_loaded_modules DMV 를 사용할 수 있습니다. SQL Server 에서 ODBC Driver 를 사용하여 Linked Server 를 사용할 때, 로드되는 라이브러리 목록을 확인하고 어느 시점에 해당 모듈이 로드되는지 아래와 같이 정리하였습니다.
[시나리오]
Microsoft OLE DB Provider for ODBC Driver 를 사용하여 MySQL 서버가 Linked Server 로 이미 구성되어 있습니다. 해당 서버에 OPENQUERY 를 사용하기 전후 SQL Server 에 로드된 모듈을 myodbc5.dll 모듈을 확인해 봅니다.
[Linked Server 를 대상으로 OPENQUERY 를 수행하기 전]
1. 모듈 제조사가 Microsoft Corporation 이 아닌 목록 확인
FROM sys.dm_os_loaded_modules
WHERE company <> 'Microsoft Corporation'
(결과 없음)
2. SQLServr.exe 프로세스에 대한 전체 덤프 수집 (또는 Filtered dump)
3. windbg 를 사용하여 덤프에서 로드된 드라이버 확인 시, 로드된 모듈이 확인되지 않습니다.
start end module name
[Linked Server 를 대상으로 OPENQUERY 수행 후]
1. Linked Server 공급자 Microsoft OLE DB Provider for ODBC Driver 로 연결된 MySQL 서버에 쿼리 테스트
FROM OPENQUERY
(MySQL, 'SELECT * FROM T1')
가
나
다
(결과 반환)
2. 로드된 모듈 확인
FROM sys.dm_os_loaded_modules
WHERE company <> 'Microsoft Corporation'
3. SQLServr.exe 프로세스에 대한 전체 덤프 수집
4. 덤프 생성 후 모듈 확인
start end module name
000007fe`f1fb0000 000007fe`f24ae000 myodbc5 (deferred)
Image path: C:\Program Files\MySQL\Connector ODBC 5.1\myodbc5.dll
Image name: myodbc5.dll
Timestamp: Wed Oct 05 05:20:30 2011 (4E8B6A8E)
CheckSum: 00000000
ImageSize: 004FE000
File version: 5.1.9.0
Product version: 5.1.9.0
File flags: 0 (Mask 3)
File OS: 40004 NT Win32
File type: 2.0 Dll
File date: 00000000.00000000
Translations: 0000.04b0 0000.04e4 0409.04b0 0409.04e4
위 경로에서 확인된 Myodbc5.dll 드라이버 이름을 임의의 이름으로 변경한 후 SQL Server 서비스를 재시작 한 뒤 inked Server 로 OPENQUERY 를 시도할 경우 아래와 같이 모듈을 찾을 수 없다는 오류가 발생합니다.
메시지 7303, 수준 16, 상태 1, 줄 3
연결된 서버 "mysql"에 대한 OLE DB 공급자 "MSDASQL"의 데이터 원본 개체를 초기화할 수 없습니다.
이 때, 다시 원래 파일명을 변경한 후 SQL Server 서비스를 재시작 하지 않아도 해당 모듈을 정상적으로 호출하여 쿼리가 성공하는 것을 확인할 수 있습니다.
[참고자료]
sys.dm_os_loaded_modules (Transact-SQL)
http://msdn.microsoft.com/en-us/library/ms179907.aspx
작성자 : Lai Go / 작성일자 : 2011.11.23