Oracle通過(guò)DbLink遠(yuǎn)程訪問(wèn)MySQL數(shù)據(jù)庫(kù)BLOB字段的問(wèn)題調(diào)查
昨天幫XW調(diào)查了一個(gè)Oracle通過(guò)DbLink遠(yuǎn)程訪問(wèn)MySQL數(shù)據(jù)庫(kù)的問(wèn)題,記錄一筆
問(wèn)題:
Oracle通過(guò)DbLink遠(yuǎn)程訪問(wèn)MySQL數(shù)據(jù)庫(kù)時(shí),查詢(xún)SELECT一張帶BLOB字段表時(shí),
該BLOB字段值為NULL時(shí)正常,非NULL時(shí)報(bào)ORA-28500錯(cuò)誤。
調(diào)查過(guò)程:
數(shù)據(jù)庫(kù)環(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開(kāi)啟遠(yuǎn)程訪問(wèn)權(quán)限
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'rootpwd' WITH GRANT OPTION;
3. ODBC中系統(tǒng)DSN中創(chuàng)建驅(qū)動(dòng)MySQL ODBC 5.1 Driver的配置:
DataSource:test
Server:192.168.1.9
Port:3306
User:root
Password:rootpwd
Database:test
并測(cè)試成功
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測(cè)試通過(guò),我用網(wǎng)上很多人說(shuō)的
create public database link test
connect to "root"
identified by "rootpwd"
using 'test';
沒(méi)能成功,也沒(méi)去追究為什么。報(bào)的錯(cuò)是:
第 1 行出現(xiàn)錯(cuò)誤:
ORA-28545: 連接代理時(shí) Net8 診斷到錯(cuò)誤
Unable to retrieve text of NETWORK/NCR message 65535
ORA-02063: 緊接著 2 lines (起自 MD35)
調(diào)查過(guò)程:
在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)錯(cuò),說(shuō)是有BLOB字段必須要有一個(gè)唯一屬性字段,
把AA字段刪除,并添加一個(gè)屬性INT(11)的id字段,并設(shè)成主鍵, 查詢(xún)成功。
上傳了一個(gè)文件到MySQL中TEST_BLOB表的BB字段中,
再執(zhí)行select "BB" from "TEST_BLOB"@test;再現(xiàn)了錯(cuò)誤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,接下來(lái)開(kāi)始調(diào)查原因:
開(kāi)始一直以為ORACLE就根本不支持遠(yuǎn)程傳送BLOB字段,因?yàn)榫W(wǎng)上很多人都說(shuō)解決不了這個(gè)問(wèn)題,
但有一篇關(guān)于ORACLE通過(guò)DbLink調(diào)用SQLServer的BLOG字段的貼子,居然可以成功執(zhí)行
insert into foo select blobcolumn from remoteTable@dl_remote where rownum = 1;
而類(lèi)似的insert into...select和create table...as select的語(yǔ)句,我執(zhí)行都報(bào)失敗,
調(diào)查過(guò)程中多次報(bào)諸如 ORA-00997: 非法使用 LONG 數(shù)據(jù)類(lèi)型 等錯(cuò)誤;
很奇怪為什么SQLServer行而MySQL卻不行,
再仔細(xì)看ORA-28500錯(cuò)誤消息里有一句[You have an error in your SQL syntax],明顯是語(yǔ)句錯(cuò)誤,
并且錯(cuò)誤發(fā)生在 '"TEST_BLOB" WHERE "id"=1 ,這個(gè)WHERE "id" = 1我從來(lái)就沒(méi)有寫(xiě)過(guò),怪事,
難道是MySQL中執(zhí)行的SQL文是已經(jīng)修改過(guò)的SQL,有了這個(gè)想法以后,一切都好辦了,
打開(kāi)MySQL的LOG功能以后,再執(zhí)行select "BB" from "TEST_BLOB"@test; 發(fā)現(xiàn)MySQL的LOG中執(zhí)行的SQL語(yǔ)句是
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)該還有一些語(yǔ)句的,不然怎么會(huì)查出有id字段,只不過(guò)是LOG中沒(méi)顯示出來(lái)罷了,不管
出錯(cuò)的是最后一句,原因是表名由雙引號(hào)括起來(lái)在MySQL中執(zhí)行不正確,前面兩句是單引號(hào)括起來(lái)沒(méi)問(wèn)題
而SQLSERVER中雙引號(hào)把表名括起來(lái)是可以正常執(zhí)行的,這應(yīng)該就是DbLink到SQLSERVER正常而MySQL不正常的原因吧
再深究這條帶雙引號(hào)的SQL文是由ORACLE發(fā)出的,還是ODBC發(fā)出的,
通過(guò)使用自己做的TcpMonitor小工具,發(fā)現(xiàn)是由ORACLE發(fā)出的,
沒(méi)轍了,ORACLE的BUG,到止為止。
posted on 2009-10-30 12:00 SunKing's Blog 閱讀(5740) 評(píng)論(0) 編輯 收藏