為多個數據庫之間的整合和遷移做POC,嘗試使用Oracle Gateway和Heterogeneous Service來中轉訪問,測試過好多次,最終發現只有在32位的Oracle當中才能成功配置。 配置環境如下: Windows 2003 32bit 或 Windows 2008 64bit Oracle10G 32bit 或 Oracle11G 32bit Source and Target:Oracle 或 MySQL 或 PostgreSQL 或 GreenPlum ...... 我的配置方式是使用一臺獨立終端來作為類似跳轉的機器,實際的source db和target db均在其他的主機上,這樣至少3臺涉及到的主機。 Linux也是可以的,但是現在沒實際用到,唯一需要注意的unixODBC版本的問題,因此這里主要描述在Windows2008 DC Server當中訪問GreenPlum的配置過程。 0. 安裝Oracle Database 注意是含了一個實例,略。 1. 安裝psqlodbc驅動 略。 2. 配置ODBC for GreenPlum 注意選擇ANSI,使用UNICODE會對char等字符類型的字段無法查詢和顯示,略。 3. 配置hs sid hs\admin\initgp.ora: HS_FDS_CONNECT_INFO = gp HS_FDS_TRACE_LEVEL = debug 4. 配置hs listener listener.ora: (SID_DESC = ? (PROGRAM = dg4odbc)# hsodbc for 10g ? (ORACLE_HOME = C:\oracle\product\11.2.0\dbhome_1) ? (SID_NAME = gp) ? #(ENVS= "LD_LIBRARY_PATH = /usr/lib:/u01/app/oracle/product/10.2.0/db_1/lib") # for linux ) 5. 配置tns tnsnames.ora: gp = ? (DESCRIPTION= ? ? (ADDRESS=(PROTOCOL=tcp)(HOST=localhost)(PORT=1521)) ? ? (CONNECT_DATA=(SID=gp)) ? ? (HS=OK) ? )? 6. 遇到的問題: 6.0. ORA-01017: 用戶名/口令無效; 登錄被拒絕 SQL> CREATE PUBLIC DATABASE LINK postgresql CONNECT TO dba IDENTIFIED BY "isdba" ?USING 'gp'; 數據庫鏈接已創建。 SQL> select * from "a1"@postgresql; select * from "a1"@postgresql ? ? ? ? ? ? ? ? ? ?* 第 1 行出現錯誤: ORA-01017: 用戶名/口令無效; 登錄被拒絕 FATAL: no pg_hba.conf entry for host "10.46.182.233", user "DBA", database "loglapdb", SSL off {28000,NativeErr = 210} ORA-02063: 緊接著 2 lines (起自 POSTGRESQL) 這個錯誤看起來好像非常簡單,就是密碼錯誤,問題是已經確認密碼無誤且可以使用psql登陸,死活不理解什么原因,去查看網關日志如下: Exiting hgoinit, rc=0 at 2013/05/10-13:31:36 Entered hgolgon at 2013/05/10-13:31:36 ?reco:0, name:DBA, tflag:0 Entered hgosuec at 2013/05/10-13:31:36 Exiting hgosuec, rc=0 at 2013/05/10-13:31:36 HOSGIP for "HS_FDS_RECOVERY_ACCOUNT" returned "RECOVER" HOSGIP for "HS_FDS_TRANSACTION_LOG" returned "HS_TRANSACTION_LOG" HOSGIP for "HS_FDS_TIMESTAMP_MAPPING" returned "DATE" HOSGIP for "HS_FDS_DATE_MAPPING" returned "DATE" HOSGIP for "HS_FDS_CHARACTER_SEMANTICS" returned "FALSE" HOSGIP for "HS_FDS_MAP_NCHAR" returned "TRUE" HOSGIP for "HS_FDS_RESULTSET_SUPPORT" returned "FALSE" HOSGIP for "HS_FDS_RSET_RETURN_ROWCOUNT" returned "FALSE" HOSGIP for "HS_FDS_PROC_IS_FUNC" returned "FALSE" HOSGIP for "HS_FDS_REPORT_REAL_AS_DOUBLE" returned "FALSE" ?using DBA as default value for "HS_FDS_DEFAULT_OWNER" HOSGIP for "HS_SQL_HANDLE_STMT_REUSE" returned "FALSE" Entered hgocont at 2013/05/10-13:31:36 ?HS_FDS_CONNECT_INFO = "gp" ?RC=-1 from HOSGIP for "HS_FDS_CONNECT_STRING" Entered hgogenconstr at 2013/05/10-13:31:36 ?dsn:gp, name:DBA ?optn: Entered hgocip at 2013/05/10-13:31:36 ?dsn:gp Exiting hgocip, rc=0 at 2013/05/10-13:31:36 Exiting hgogenconstr, rc=0 at 2013/05/10-13:31:36 Entered hgopoer at 2013/05/10-13:31:36 后來看到網友也出現了類似的問題,原來是用戶名也要用雙引號括起來,我們從這里也可以看到傳輸的用戶名是大寫的"DBA": ?reco:0, name:DBA, tflag:0 但實際上在greenplum當中的確實小寫的"dba",包括在定義dblink中的密碼也要用雙引號,當然還有sourcename。 SQL> drop public database link postgresql; 數據庫鏈接已刪除。 SQL> CREATE PUBLIC DATABASE LINK postgresql CONNECT TO "dba" IDENTIFIED BY "isdb a" USING 'gp'; 數據庫鏈接已創建。 SQL> select * from "a1"@postgresql; 未選定行 6.1. 查詢指定字段 SQL> Select Name From "t1"@postgresql; Select Name From "t1"@postgresql ? ? ? ?* 第 1 行出現錯誤: ORA-00904: "NAME": 標識符無效 也必須用雙引號: SQL> Select Name From "t1"@postgresql; Select Name From "t1"@postgresql ? ? ? ?* 第 1 行出現錯誤: ORA-00904: "NAME": 標識符無效 另外需要注意的在greenplum中都是小寫的表名和字段名稱。 6.2. ORA-00600: Internal errorcode, arguments:[HO define: Long fetch], [], [], [], [], [], [], [] 查詢的時候報錯,確認是個hs dg4odbc bug,不過這個bug只是在使用PLD的時候出現,使用SQL*PLUS沒有觸發,目前我使用的版本是11.2.0.1.0,具體見Bug 4391058,看描述說在11.2已經修復了,怎么我還會遇到呢?有人反饋說使用具體字段列舉替代”*“,可是我這邊還是無效。 -EOF-