SunKing's Blog

          留言簿(42)

          Java鏈

          友鏈

          閱讀排行榜

          評論排行榜

          Oracle通過DbLink遠(yuǎn)程訪問MySQL數(shù)據(jù)庫BLOB字段的問題調(diào)查

          昨天幫XW調(diào)查了一個Oracle通過DbLink遠(yuǎn)程訪問MySQL數(shù)據(jù)庫的問題,記錄一筆
          問題:
               Oracle通過DbLink遠(yuǎn)程訪問MySQL數(shù)據(jù)庫時(shí),查詢SELECT一張帶BLOB字段表時(shí),
               該BLOB字段值為NULL時(shí)正常,非NULL時(shí)報(bào)ORA-28500錯誤。

          調(diào)查過程:
          數(shù)據(jù)庫環(huán)境
               本機(jī)ORACLE10.2.0,SID為ORCL
               遠(yuǎn)程MySQL5.0,DB為test
          創(chuàng)建DbLink
          1.下載并安裝 mysql-connector-odbc-5.1.5-win32.msi
          2.MySQL開啟遠(yuǎn)程訪問權(quán)限
               GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'rootpwd' WITH GRANT OPTION;
          3. ODBC中系統(tǒng)DSN中創(chuàng)建驅(qū)動MySQL ODBC 5.1 Driver的配置:
                   DataSource:test
                   Server:192.168.1.9
                   Port:3306
                   User:root
                   Password:rootpwd
                   Database:test
              并測試成功
          4.停止ORACLE的服務(wù),并做如下配置
          D:\oracle\product\10.2.0\db_1\hs\admin目錄下添加文件initmd35.ora,內(nèi)容如下:
                   HS_FDS_CONNECT_INFO = test
                   HS_FDS_TRACE_LEVEL = ON
          修改D:\oracle\product\10.2.0\db_1\NETWORK\ADMIN\listener.ora,修改后內(nèi)容如下:
                   SID_LIST_LISTENER =
                     (SID_LIST =
                       (SID_DESC =
                         (GLOBAL_DBNAME = ORCL)
                         (ORACLE_HOME = D:\oracle\product\10.2.0\db_1)
                         (SID_NAME = ORCL)
                       )
                       (SID_DESC =
                         (SID_NAME = test)
                         (ORACLE_HOME = D:\oracle\product\10.2.0\db_1)
                         (PROGRAM = hsodbc)
                       )
                     )

                   LISTENER =
                     (DESCRIPTION =
                       (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
                     )
          修改D:\oracle\product\10.2.0\db_1\NETWORK\ADMIN\tnsnames.ora,修改后內(nèi)容如下:
                   ORCL =
                     (DESCRIPTION =
                       (ADDRESS_LIST =
                         (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
                       )
                       (CONNECT_DATA =
                         (SERVER = DEDICATED)
                         (SERVICE_NAME = orcl)
                       )
                     )
                   test =
                       (DESCRIPTION =
                           (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521)) 
                               (CONNECT_DATA = (SID = test) )
                              (HS = OK)
                       )
          5.重啟ORACLE的服務(wù)
          6.創(chuàng)建DbLink
                   create public database link test
                       connect to "root" identified by "rootpwd"
                       using '(DESCRIPTION =
                       (ADDRESS = (PROTOCOL = TCP) (HOST = localhost) (PORT =1521) )
                       (CONNECT_DATA = (SID = test) )
                       (HS=OK)
                       )';
          tnsping test測試通過,我用網(wǎng)上很多人說的
                   create public database link test
                       connect to "root"
                       identified by "rootpwd"
                       using 'test';
          沒能成功,也沒去追究為什么。報(bào)的錯是:
                   第 1 行出現(xiàn)錯誤:
                   ORA-28545: 連接代理時(shí) Net8 診斷到錯誤
                   Unable to retrieve text of NETWORK/NCR message 65535
                   ORA-02063: 緊接著 2 lines (起自 MD35)

          調(diào)查過程:
          在MySQL創(chuàng)建了一張帶BLOB字段的表
                   CREATE TABLE `TEST_BLOB` (
                           `AA` VARCHAR( 10 ) DEFAULT '1' NOT NULL ,
                           `BB` BLOB
                   );
             安裝mysql-gui-tools-5.0-r17-win32.msi并用MySQL Query Browser插入了一條BB字段為空的數(shù)據(jù)
             執(zhí)行select "BB" from "TEST_BLOB"@test; 報(bào)錯,說是有BLOB字段必須要有一個唯一屬性字段,
             把AA字段刪除,并添加一個屬性INT(11)的id字段,并設(shè)成主鍵, 查詢成功。
             上傳了一個文件到MySQL中TEST_BLOB表的BB字段中,
             再執(zhí)行select "BB" from "TEST_BLOB"@test;再現(xiàn)了錯誤ORA-28500
                           ORA-28500: 連接 ORACLE 到非 Oracle 系統(tǒng)時(shí)返回此信息:
                            [Generic Connectivity Using ODBC]You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '"TEST_BLOB" WHERE "id"=1' at line 1 (SQL State: 37000; SQL Code: 1064) 
                           ORA-02063: 緊接著2 lines(源于MYSQL)
              OK,接下來開始調(diào)查原因:
              開始一直以為ORACLE就根本不支持遠(yuǎn)程傳送BLOB字段,因?yàn)榫W(wǎng)上很多人都說解決不了這個問題,
              但有一篇關(guān)于ORACLE通過DbLink調(diào)用SQLServer的BLOG字段的貼子,居然可以成功執(zhí)行
                       insert into foo select blobcolumn from remoteTable@dl_remote where rownum = 1;
               而類似的insert into...select和create table...as select的語句,我執(zhí)行都報(bào)失敗,
               調(diào)查過程中多次報(bào)諸如  ORA-00997: 非法使用 LONG 數(shù)據(jù)類型  等錯誤;
               很奇怪為什么SQLServer行而MySQL卻不行,
               再仔細(xì)看ORA-28500錯誤消息里有一句[You have an error in your SQL syntax],明顯是語句錯誤,
               并且錯誤發(fā)生在 '"TEST_BLOB" WHERE "id"=1 ,這個WHERE "id" = 1我從來就沒有寫過,怪事,
               難道是MySQL中執(zhí)行的SQL文是已經(jīng)修改過的SQL,有了這個想法以后,一切都好辦了,
               打開MySQL的LOG功能以后,再執(zhí)行select "BB" from "TEST_BLOB"@test; 發(fā)現(xiàn)MySQL的LOG中執(zhí)行的SQL語句是
                   091029 17:59:35       5 Query       SELECT `A1`.`id` AS c001 FROM  `TEST_BLOB` `A1`
                                                     5 Query       SELECT `A1`.`id` AS c001 FROM  `TEST_BLOB` `A1`
                                                     5 Query       SELECT "BB" FROM "TEST_BLOB" WHERE "id"=1
               想想應(yīng)該還有一些語句的,不然怎么會查出有id字段,只不過是LOG中沒顯示出來罷了,不管
               出錯的是最后一句,原因是表名由雙引號括起來在MySQL中執(zhí)行不正確,前面兩句是單引號括起來沒問題
               而SQLSERVER中雙引號把表名括起來是可以正常執(zhí)行的,這應(yīng)該就是DbLink到SQLSERVER正常而MySQL不正常的原因吧
               再深究這條帶雙引號的SQL文是由ORACLE發(fā)出的,還是ODBC發(fā)出的,
               通過使用自己做的TcpMonitor小工具,發(fā)現(xiàn)是由ORACLE發(fā)出的,
               沒轍了,ORACLE的BUG,到止為止。

          posted on 2009-10-30 12:00 SunKing's Blog 閱讀(5728) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 新昌县| 朔州市| 焉耆| 青阳县| 建水县| 巴青县| 翼城县| 修水县| 文水县| 临夏县| 昌乐县| 时尚| 那曲县| 绥化市| 独山县| 济阳县| 台中市| 海伦市| 德安县| 泸定县| 嘉峪关市| 新晃| 营口市| 象山县| 临颍县| 剑川县| 堆龙德庆县| 星子县| 新昌县| 怀宁县| 平潭县| 台州市| 正镶白旗| 桦甸市| 西和县| 东安县| 延吉市| 历史| 梁平县| 彰武县| 仁寿县|