<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    SunKing's Blog

    留言簿(42)

    Java鏈

    友鏈

    閱讀排行榜

    評論排行榜

    Oracle通過DbLink遠程訪問MySQL數據庫BLOB字段的問題調查

    昨天幫XW調查了一個Oracle通過DbLink遠程訪問MySQL數據庫的問題,記錄一筆
    問題:
         Oracle通過DbLink遠程訪問MySQL數據庫時,查詢SELECT一張帶BLOB字段表時,
         該BLOB字段值為NULL時正常,非NULL時報ORA-28500錯誤。

    調查過程:
    數據庫環境
         本機ORACLE10.2.0,SID為ORCL
         遠程MySQL5.0,DB為test
    創建DbLink
    1.下載并安裝 mysql-connector-odbc-5.1.5-win32.msi
    2.MySQL開啟遠程訪問權限
         GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'rootpwd' WITH GRANT OPTION;
    3. ODBC中系統DSN中創建驅動MySQL ODBC 5.1 Driver的配置:
             DataSource:test
             Server:192.168.1.9
             Port:3306
             User:root
             Password:rootpwd
             Database:test
        并測試成功
    4.停止ORACLE的服務,并做如下配置
    D:\oracle\product\10.2.0\db_1\hs\admin目錄下添加文件initmd35.ora,內容如下:
             HS_FDS_CONNECT_INFO = test
             HS_FDS_TRACE_LEVEL = ON
    修改D:\oracle\product\10.2.0\db_1\NETWORK\ADMIN\listener.ora,修改后內容如下:
             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,修改后內容如下:
             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的服務
    6.創建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測試通過,我用網上很多人說的
             create public database link test
                 connect to "root"
                 identified by "rootpwd"
                 using 'test';
    沒能成功,也沒去追究為什么。報的錯是:
             第 1 行出現錯誤:
             ORA-28545: 連接代理時 Net8 診斷到錯誤
             Unable to retrieve text of NETWORK/NCR message 65535
             ORA-02063: 緊接著 2 lines (起自 MD35)

    調查過程:
    在MySQL創建了一張帶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字段為空的數據
       執行select "BB" from "TEST_BLOB"@test; 報錯,說是有BLOB字段必須要有一個唯一屬性字段,
       把AA字段刪除,并添加一個屬性INT(11)的id字段,并設成主鍵, 查詢成功。
       上傳了一個文件到MySQL中TEST_BLOB表的BB字段中,
       再執行select "BB" from "TEST_BLOB"@test;再現了錯誤ORA-28500
                     ORA-28500: 連接 ORACLE 到非 Oracle 系統時返回此信息:
                      [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,接下來開始調查原因:
        開始一直以為ORACLE就根本不支持遠程傳送BLOB字段,因為網上很多人都說解決不了這個問題,
        但有一篇關于ORACLE通過DbLink調用SQLServer的BLOG字段的貼子,居然可以成功執行
                 insert into foo select blobcolumn from remoteTable@dl_remote where rownum = 1;
         而類似的insert into...select和create table...as select的語句,我執行都報失敗,
         調查過程中多次報諸如  ORA-00997: 非法使用 LONG 數據類型  等錯誤;
         很奇怪為什么SQLServer行而MySQL卻不行,
         再仔細看ORA-28500錯誤消息里有一句[You have an error in your SQL syntax],明顯是語句錯誤,
         并且錯誤發生在 '"TEST_BLOB" WHERE "id"=1 ,這個WHERE "id" = 1我從來就沒有寫過,怪事,
         難道是MySQL中執行的SQL文是已經修改過的SQL,有了這個想法以后,一切都好辦了,
         打開MySQL的LOG功能以后,再執行select "BB" from "TEST_BLOB"@test; 發現MySQL的LOG中執行的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
         想想應該還有一些語句的,不然怎么會查出有id字段,只不過是LOG中沒顯示出來罷了,不管
         出錯的是最后一句,原因是表名由雙引號括起來在MySQL中執行不正確,前面兩句是單引號括起來沒問題
         而SQLSERVER中雙引號把表名括起來是可以正常執行的,這應該就是DbLink到SQLSERVER正常而MySQL不正常的原因吧
         再深究這條帶雙引號的SQL文是由ORACLE發出的,還是ODBC發出的,
         通過使用自己做的TcpMonitor小工具,發現是由ORACLE發出的,
         沒轍了,ORACLE的BUG,到止為止。

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


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


    網站導航:
     
    主站蜘蛛池模板: 久久亚洲国产视频| 国产区图片区小说区亚洲区| 国产一卡二卡3卡四卡免费| 亚洲AV永久无码精品放毛片| 亚洲区小说区图片区| 最近中文字幕完整版免费高清| 亚洲综合激情五月丁香六月| 亚洲精品国产高清不卡在线| 1000部啪啪毛片免费看| 美女18一级毛片免费看| 亚洲一区二区三区夜色| 日韩精品视频免费在线观看| 暖暖免费日本在线中文| 在线看亚洲十八禁网站| 久久亚洲AV成人出白浆无码国产 | 亚洲日韩精品无码AV海量| 久久亚洲欧洲国产综合| 在线观看特色大片免费视频| 国产日韩AV免费无码一区二区三区| 亚洲国产成a人v在线| 久久久久亚洲爆乳少妇无| 欧美男同gv免费网站观看 | 一级毛片视频免费| 亚洲人成高清在线播放| 青青青国产色视频在线观看国产亚洲欧洲国产综合 | 国产亚洲一区二区在线观看| 成年美女黄网站18禁免费| 久久99精品国产免费观看| 一级中文字幕免费乱码专区| 亚洲综合国产成人丁香五月激情| 亚洲av最新在线网址| 亚洲美女在线国产| 精品久久久久久久免费人妻| 真实国产乱子伦精品免费| 花蝴蝶免费视频在线观看高清版| 国产成人亚洲综合无| 亚洲最大的成人网| 亚洲人成高清在线播放| 亚洲成AV人片久久| 久久久无码精品亚洲日韩蜜臀浪潮| 国产亚洲AV夜间福利香蕉149|