注册
DM和Oracle间通过dblink查询
专栏/培训园地/ 文章详情 /

DM和Oracle间通过dblink查询

吉吉 2025/03/27 30 0 0
摘要

在工作中,有时需要在达梦和oracle数据库之间建立dblink连接,来进行一些查询操作,下面介绍创建dblink的过程和查询中遇到乱码的处理方法。
达梦库和oracle库的字符集均为utf8,分别创建测试用户test/test12345和测试表test.testtab (a varchar2(100))。

一、创建dm到oracle的dblink

1、在dm端安装oracle客户端软件

分别解压basic、odbc、sqlplus包,解压后配置环境变量.bash_profile
image.png

[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

2、复制so文件

将$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

3、oci方式配置dblink

重启dm库后创建dblink

SQL> create or replace public link dm_ora connect 'ORACLE' with TEST identified by test12345 using '192.168.227.143:1521/ORAUTF';

image.png

二、创建oracle到dm的dblink

1、在oracle端安装dm客户端

2、安装配置odbc

解压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配置中中括号[]内的别名
image.png

3、配置透明网关

[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

4、配置静态监听

[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)
    )
  )

5、配置tnsname

[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),均要保持一致。

6、重启监听后,使用tns名创建dblink

[oracle@localhost ~]$ lsnrctl reload

SQL> create public database link ora_dm connect to test identified by test12345 using 'DM';

image.png

7、报错ORA-28500处理方法

如果通过dblink查询时报错ORA-28500,检查透明网关配置中是否缺少了HS_NLS_NCHAR=UCS2,修改配置后重启监听再检查dblink。

三、查询测试

1、模拟通过dblink在dm端查询oracle的数据

Oracle端的环境变量NLS_LANG为AMERICAN_AMERICA.AL32UTF8,写入数据后在dm端进行查询
Oracle端:
image.png
Dm端:
image.png
当查询显示乱码时,查询oracle源端字符集为utf8
image.png
可通过修改dm端的客户端工具的字符集为utf8(xshell工具修改:编码-Unicode(UTF-8)),再进行查询
image.png
image.png
即可查询正常。
除了修改客户端工具字符集,如果是通过disql进行查询可以检查操作系统LANG参数,修改为utf8(export LANG=zh_CN.utf8)也可以解决乱码问题。
image.png

2、模拟通过dblink在oracle端查询dm的数据

在dm端写入数据后在oracle端进行查询,Oracle端的环境变量NLS_LANG为AMERICAN_AMERICA.AL32UTF8
image.png
Oracle端:
image.png
和上一节的处理方法一样,当oracle端查询乱码时,可检查oracle端客户端工具的字符集,将其修改为utf8
image.png
image.png
或通过sqlplus连接数据库查询,可以检查操作系统LANG参数,修改为utf8(export LANG=zh_CN.utf8)也可以解决乱码问题。
image.png

四、总结

通过dblink在dm和oracle数据库间查询时,数据库字符集、客户端工具字符集、或者在服务器上通过disql或sqlplus查询时的操作系统字符集应保持一致,能最大限度避免查询乱码的问题。

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服