2007~2011/SQL Server2011. 11. 23. 08:50

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 이 아닌 목록 확인

SELECT *
 FROM sys.dm_os_loaded_modules
 WHERE company <> 'Microsoft Corporation'
(결과 없음)


2. SQLServr.exe 프로세스에 대한 전체 덤프 수집 (또는 Filtered dump) 

C:\Program Files\Microsoft SQL Server\100\Shared> SQLDUMper.exe 4520 0x1100


3. windbg 를 사용하여 덤프에서 로드된 드라이버 확인 시, 로드된 모듈이 확인되지 않습니다.

0:000> lmvm myodbc5
start             end                 module name



[Linked Server 를 대상으로 OPENQUERY 수행 후]
1. Linked Server 공급자 Microsoft OLE DB Provider for ODBC Driver 로 연결된 MySQL 서버에 쿼리 테스트

SELECT *
 FROM OPENQUERY
 (MySQL, 'SELECT * FROM T1')




(결과 반환)


2. 로드된 모듈 확인

SELECT base_address, file_version, company, description, name 
 FROM sys.dm_os_loaded_modules
 WHERE company <> 'Microsoft Corporation'

 


3. SQLServr.exe 프로세스에 대한 전체 덤프 수집

C:\Program Files\Microsoft SQL Server\100\Shared> SQLDUMper.exe 4520 0x1100


4. 덤프 생성 후 모듈 확인

0:000> lmvm myodbc5
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 를 시도할 경우 아래와 같이 모듈을 찾을 수 없다는 오류가 발생합니다.

연결된 서버 "mysql"의 OLE DB 공급자 "MSDASQL"이(가) 메시지 " 126: 지정된 모듈을 찾을 수 없습니다. (MySQL ODBC 5.1 Driver, C:\Program Files\MySQL\Connector ODBC 5.1\myodbc5.dll) 시스템 오류가 발생하여 지정한 드라이버를 로드하지 못했습니다."을(를) 반환했습니다.
메시지 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

Posted by Lai Go