網站由於歷史原因,使用了sqlserver和mysql兩種數據庫,數據庫版本是SQLServer2012和MySql5.5,兩庫間交換數據以前都是走的接口,太麻煩。一下子把mysql遷移到sqlserver也不太合適,於是就想通過數據庫連接的形式讓sqlserver側可以直接訪問mysql的數據。
從網上東拼西湊,一步步搞通了,整理如下:
一、從mysql網站上下載ODBC驅動
http://dev.mysql.com/downloads/connector/odbc/
找到合適自己操作系統的版本下載並安裝,我的是WINDOWS64位版本,
二、配置ODBC數據源
打開【管理工具】—>【數據源(ODBC)】,選擇【系統DSN】,點擊【添加】,選擇【MySQL ODBC 5.3 Unicode Driver】,完成
輸入自定義的數據源名稱XXX和描述,輸入要連接的mysql服務器ip地址/端口/用戶名/密碼及數據庫實例名,點擊test,測試成功,OK。
三、配置數據庫鏈接
打開sqlserver management studio,選擇【服務器對象】,右擊【鏈接服務器】,選擇【新建鏈接服務器】,
【常規】選項卡中輸入自定義的服務器鏈接名稱,選擇【其它數據源】
【提供程序】項,選擇【Microsoft OLE DB Provider For ODBC Drivers】,別選錯
輸入產品名稱(自定義)、數據源名稱(上一步定義的名稱XXX)
【安全性】選項卡,選擇【使用此安全上下文建立連接】,輸入遠程登錄用戶名和密碼
確定!
如果沒有報錯,刷新【鏈接服務器】節點,右擊新增的鏈接名稱,選擇【測試鏈接】,沒有問題。
四、使用:
1、OPENQUERY方式;
SELECT * FROM OPENQUERY(dblink名稱, 'select * from t_table');
2、OPENROWSET方式;
先打開OPENROWSET:
exec sp_configure 'show advanced options',1 reconfigure exec sp_configure 'Ad Hoc Distributed Queries',1 reconfigure; 執行示例: SELECT * FROM OPENROWSET( 'MSDASQL', 'DRIVER={MySQL ODBC 5.3 Unicode Driver}; SERVER=111.222.222.111; PORT=3306;DATABASE=mysqldb; USER=root;PASSWORD=xxxyyyzzz; STMT=set names gb2312; OPTION=2049', 'select * from t_table;' ) go;
第三步可能會報一個錯誤:
[MySQL][ODBC 5.3(w) Driver]Connection using old (pre-4.1.1) authentication protocol refused (client option 'secure_auth' enabled)"。 (Microsoft SQL Server,錯誤: 7303
這是數據庫版本對密碼加密方式不同引起的,解決:
打開mysql數據庫的mysql示例,打開user表,可以看到鏈接使用的用戶名root和密碼,
同為root用戶,加密后的密碼串明顯不同。把長的那串復制出來,替換掉短的,提交修改。
PS:網上有說法執行update `user` t set t.`Password`=PASSWORD(xxxyyyzzz) where t.`User`='root' and t.`Host`='111.222.222.111',我試了不能生效,仍然使用的舊加密方式生成的仍然是短密文。
然后記得執行FLUSH PRIVILEGES語句,刷新權限信息。
再次到SQLServer執行第3步的配置,問題解決。