在工作中,有时需要在达梦和oracle数据库之间建立dblink连接,来进行一些查询操作,下面介绍创建dblink的过程和查询中遇到乱码的处理方法。
达梦库和oracle库的字符集均为utf8,分别创建测试用户test/test12345和测试表test.testtab (a varchar2(100))。
分别解压basic、odbc、sqlplus包,解压后配置环境变量.bash_profile
[dmdba@localhost ~]$ vi /home/dm/.bash_profile
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/dm/dmdbms/bin"
export DM_HOME="/dm/dmdbms"
export PATH=$DM_HOME/bin:$DM_HOME/tool:$PATH
export MALLOC_ARENA_MAX=4
export ORACLE_HOME=/dm/instantclient_11_2
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ORACLE_HOME
export PATH=$ORACLE_HOME:$PATH
将$ORACLE_HOME目录下的.so文件拷贝到$DM_HOME/bin下,并在$DM_HOME/bin下创建两个链接
[dmdba@localhost ~]$ cd $ORACLE_HOME
[dmdba@localhost ~]$ cp *.so /dm/dmdbms/bin
[dmdba@localhost bin]$ cd $DM_HOME/bin
[dmdba@localhost bin]$ ln -s libclntsh.so.11.1 libclntsh.so
[dmdba@localhost bin]$ ln -s libocci.so.11.1 libocci.so
重启dm库后创建dblink
SQL> create or replace public link dm_ora connect 'ORACLE' with TEST identified by test12345 using '192.168.227.143:1521/ORAUTF';
解压odbc包并安装
[root@localhost ~]$ tar -xvzf unixODBC.tar.gz
[root@localhost ~]$ cd unixODBC-2.3.1
[root@localhost unixODBC-2.3.1]$ ./configure
[root@localhost unixODBC-2.3.1]$ make && make install
配置odbc配置文件
[root@localhost ~]# odbcinst -j
unixODBC 2.3.1
DRIVERS............: /etc/odbcinst.ini
SYSTEM DATA SOURCES: /etc/odbc.ini
FILE DATA SOURCES..: /etc/ODBCDataSources
USER DATA SOURCES..: /root/.odbc.ini
SQLULEN Size.......: 8
SQLLEN Size........: 8
SQLSETPOSIROW Size.: 8
[root@localhost ~]$ vi /etc/odbcinst.ini
[DM8 ODBC DRIVER]
Description=ODBC DRIVER FOR DM8
Driver=/home/oracle/dmdbms/bin/libdodbc.so
[root@localhost ~]$ vi /etc/odbc.ini
[DM]
Description=DM
Driver=DM8 ODBC DRIVER
SERVER=192.168.227.140
UID=SYSDBA
PWD=SYSDBA
TCP_PORT=5236
测试odbc
[oracle@localhost ~]$ isql -v DM
注:DM为/etc/odbc.ini配置中中括号[]内的别名
[oracle@localhost ~]$ vi $ORACLE_HOME/hs/admin/initDM.ora
HS_FDS_CONNECT_INFO = DM
HS_FDS_TRACE_LEVEL = 255
HS_FDS_SHAREABLE_NAME = /usr/lib64/libodbc.so
set ODBCINI=/etc/odbc.ini
HS_NLS_NCHAR=UCS2
[oracle@localhost ~]$ vi $ORACLE_HOME/network/admin/listener.ora
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(PROGRAM = dg4odbc)
(SID_NAME = DM)
(ORACLE_HOME = /u01/oracle/product/11.2.0)
)
)
[oracle@localhost ~]$ vi $ORACLE_HOME/network/admin/tnsname.ora
DM =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = DM)
)
(HS = OK)
)
注:odbc别名(/etc/odbc.ini配置中中括号[]里的内容)、透明网关配置文件名(initXX.ora名中XX部分)、透明网关名(initXX.ora配置中的HS_FDS_CONNECT_INFO)、静态监听名(listener.ora配置中的SID_NAME)、tns名(tnsname.ora配置中的开头配置和SERVICE_NAME),均要保持一致。
[oracle@localhost ~]$ lsnrctl reload
SQL> create public database link ora_dm connect to test identified by test12345 using 'DM';
如果通过dblink查询时报错ORA-28500,检查透明网关配置中是否缺少了HS_NLS_NCHAR=UCS2,修改配置后重启监听再检查dblink。
Oracle端的环境变量NLS_LANG为AMERICAN_AMERICA.AL32UTF8,写入数据后在dm端进行查询
Oracle端:
Dm端:
当查询显示乱码时,查询oracle源端字符集为utf8
可通过修改dm端的客户端工具的字符集为utf8(xshell工具修改:编码-Unicode(UTF-8)),再进行查询
即可查询正常。
除了修改客户端工具字符集,如果是通过disql进行查询可以检查操作系统LANG参数,修改为utf8(export LANG=zh_CN.utf8)也可以解决乱码问题。
在dm端写入数据后在oracle端进行查询,Oracle端的环境变量NLS_LANG为AMERICAN_AMERICA.AL32UTF8
Oracle端:
和上一节的处理方法一样,当oracle端查询乱码时,可检查oracle端客户端工具的字符集,将其修改为utf8
或通过sqlplus连接数据库查询,可以检查操作系统LANG参数,修改为utf8(export LANG=zh_CN.utf8)也可以解决乱码问题。
通过dblink在dm和oracle数据库间查询时,数据库字符集、客户端工具字符集、或者在服务器上通过disql或sqlplus查询时的操作系统字符集应保持一致,能最大限度避免查询乱码的问题。
文章
阅读量
获赞