注册
DBLINK oracle-dm互相访问
专栏/培训园地/ 文章详情 /

DBLINK oracle-dm互相访问

大梦一场 2026/09/13 64 0 0
摘要

目录

  1. DBlink简介 1

  2. Dm - oracle的dblink创建 2

  3. Dm - dm的dblink创建 5

  4. Oracle - dm 的dblink创建 7

  5. 管理DBLINK 13

  6. DBlink简介
    达梦数据库的外部链接是一种数据库的实体对象,记录了远程数据库的连接信息,用于建立与远程数据的联系。用户可以通过数据库的外部链接对象透明地操作远程数据库的数据,对远程数据库的表进行查询和增删改操作,也可以调用远程的存储过程。数据库的外部链接对象可以是公用的(数据库中所有用户使用),也可以是私有的(特定用户使用)。

语法格式:
CREATE [OR REPLACE] [PUBLIC] LINK < 外部链接名> CONNECT ['< 连接库类型>'] WITH < 登录名> IDENTIFIED BY < 登录口令> USING '< 连接串> ';
< 连接库类型> ::= DAMENG | ORACLE | ODBC
< 连接串> ::=< 外部链接串>
< 外部链接串>::=< DAMENG外部链接串>| < ORACLE外部链接串> |
< DAMENG外部链接串>::=< 实例IP地址>/< 实例端口号> |
/ |
< ORACLE外部链接串>::= ||/< 服务名>
::=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=)(PORT=< 端口号>)))(CONNECT_DATA=(SERVICE_NAME=< 服务名>)))
::=

参数
OR REPLACE 使用OR REPLACE选项的好处是,如果系统中已经有同名的数据库链接名,服务器会自动用新的代码覆盖原来的代码。如果不使用OR REPLACE选项,当创建的新外部链接名称与系统中已有的外部链接名称同名时,服务器会报错。
PUBLIC 此链接对象是否能够被创建者之外的用户引用;
< 外部链接名> 数据库链接的名称;
< 连接库类型> 目前只支持DAMENG、ORACLE或ODBC,默认为DAMENG;
< 登录名> 登录用户名称;
< 登录口令> 登录用户口令;
支持三种格式,分别对应目标节点在dmmal.ini中的配置项,具体如下:
l mal_inst_host/mal_inst_port
l mal_host/mal_port
l mal_inst_name
可以使用配置的网络服务名tsn_name(网络服务名需要配置),或者连接描述符description(连接描述符是网络连接目标特殊格式的描述,它包括网络协议、主库IP地址、端口号和服务名),或者/< 服务名>;DSN需要用户手动配置。

  1. Dm - oracle的dblink创建
    实验环境
    服务器版本:centos 7.6
    Oracle 数据库端
    Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
    Version 19.3.0.0.0

达梦数据库端
DM Database Server 64 V8

要实现达梦数据库到oracle端的dblink访问需要先下载oracle 客户端组件包
http://www.oracle.com/technetwork/database/features/instant-client/index-097480.html

根据oracle版本下载对应版本的客户端
(因为我的oracle环境是19c)

下载完成后上传到达梦数据库端
[dmdba@host01 ~]$ ll
total 77556
-rw-r--r--. 1 dmdba dinstall 77537281 May 6 06:01 instantclient-basic-linux.x64-19.30.0.0.0dbru.zip
-rw-r--r--. 1 dmdba dinstall 951655 May 6 06:02 instantclient-sdk-linux.x64-19.30.0.0.0dbru.zip
-rw-r--r--. 1 dmdba dinstall 919944 May 6 06:01 instantclient-sqlplus-linux.x64-19.30.0.0.0dbru.zip

解压缩(这三个压缩包解压缩后会在同一个安装包中)
[dmdba@host01 ~]$ unzip instantclient-basic-linux.x64-19.30.0.0.0dbru.zip
[dmdba@host01 ~]$ unzip instantclient-sdk-linux.x64-19.30.0.0.0dbru.zip
[dmdba@host01 ~]$ unzip instantclient-sqlplus-linux.x64-19.30.0.0.0dbru.zip

授权
[dmdba@host01 ~]$ chmod -R 755 instantclient_19_30

拷贝客户端组件到DM_HOME/bin下
[dmdba@host01 ~]$ cp -r instantclient_19_30 /dm/data/bin/
[dmdba@host01 ~]$ cd /dm/data/bin
复制对应版本的lib库 libclntsh.so.19.1文件到bin下命名为libclntsh.so
[dmdba@host01 instantclient_19_30]$ cp libclntsh.so.19.1 ../libclntsh.so

检查路径是否完成
[dmdba@host01 bin]$ ldd libclntsh.so
linux-vdso.so.1 => (0x00007ffdefb7a000)
libnnz19.so (0x00007f5149590000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007f514938c000)
libm.so.6 => /lib64/libm.so.6 (0x00007f514908a000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f5148e6e000)
libnsl.so.1 => /lib64/libnsl.so.1 (0x00007f5148c54000)
librt.so.1 => /lib64/librt.so.1 (0x00007f5148a4c000)
libaio.so.1 => /lib64/libaio.so.1 (0x00007f514884a000)
libresolv.so.2 => /lib64/libresolv.so.2 (0x00007f5148631000)
libc.so.6 => /lib64/libc.so.6 (0x00007f5148264000)
/lib64/ld-linux-x86-64.so.2 (0x00007f514df04000)
libclntshcore.so.19.1 (0x00007f5147cd0000)

编辑tnsnames.ora文件(格式和oracle的tnsnames.ora文件格式一致)
[dmdba@host01 bin]$ cd network/admin/
[dmdba@host01 admin]$
[dmdba@host01 admin]$
[dmdba@host01 admin]$ vim tnsnames.ora

ORCL =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.1)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
)

配置dmdba用户环境变量(添加以下内容)
export ORACLE_HOME=/dm/data/bin
export TNS_ADMIN=$ORACLE_HOME/network/admin
export NLS_LANG=AMERICAN_AMERICA.AL32UTF8
export LD_LIBRARY_PATH=$ORACLE_HOME
export PATH=$ORACLE_HOME:$PATH

source .bash_profile

创建dblink
create public link  to_oracle connect 'ORACLE' with hr identified by hr using '192.168.1.1:1521/orcl';

访问测试

至此配置完毕

  1. Dm - dm的dblink创建
    准备环境两台DM数据库
    服务器版本:centos 7.6
    Dm数据库A : 192.168.1.111:5236 实例名:DMSERVER
    DM 数据库B: 192.168.1.1:5236 实例名:DAMENG01

两端数据库dm.ini文件分别启用 mal_ini参数
[dmdba@host01 DAMENG]$ vim dm.ini
MAL_INI = 1 #dmmal.ini

两台数据库实例名称要设置不同
数据库A
[dmdba@host01 DAMENG]$ cat dm.ini | grep INSTANCE_NAME
INSTANCE_NAME = DMSERVER #Instance name

数据库B
[dmdba@host01 DAMENG]$ cat dm.ini | grep INSTANCE_NAME
INSTANCE_NAME = DAMENG01 #Instance name
创建dmmal.ini文件(两台数据库的dmmal.ini配置一致)
[dmdba@host01 DAMENG]$ cat dmmal.ini
[mal_inst1]
mal_inst_name = DMSERVER
mal_host = 192.168.1.111
mal_port = 5237
[mal_inst2]
mal_inst_name = DAMENG01
mal_host = 192.168.1.1
mal_port = 5237

配置完成后后把dmmal.ini文件拷贝到数据库B
[dmdba@host01 DAMENG]$ scp dmmal.ini dmdba@192.168.1.1:/dm/data/DAMENG/

创建dblink
CREATE PUBLIC LINK to_dm CONNECT WITH SYSDBA IDENTIFIED BY "Dam@1234" USING '192.168.1.1/5236';

访问验证:
select count(*) from dba_tables@to_dm;
select * from dba_tables@to_dm;

  1. Oracle - dm 的dblink创建
    服务器版本:centos 7.6

安装unixODBC
su - root
unzip unixODBC-2.3.0.zip
chmod -R 775 unixODBC-2.3.0
cd unixODBC-2.3.0
./configure --prefix=/etc/odbc/unixODBC-2.3.0 --includedir=/usr/include --libdir=/usr/lib -bindir=/usr/bin --sysconfdir=/etc
make
make install

/*#./configure --prefix=/etc/odbc/unixODBC-2.3.0 --includedir=/usr/include --libdir=/usr/lib -bindir=/usr/bin --sysconfdir=/etc --build=i686-pc-linux
如果是arm架构要加上 --build=i686-pc-linux#make#make install
*/

[root@vastdata ~]# ldconfig
[root@vastdata ~]# 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
#odbcinst -j
odbcinst: error while loading shared libraries: libodbcinst.so.2: cannot open shared object file: No such file or directory

解决办法:
安装共享库后要注意共享库路径设置问题, 如下:
A、如果共享库文件安装到了/lib或/usr/lib目录下, 那么需执行一下ldconfig命令
ldconfig命令的用途, 主要是在默认搜寻目录(/lib和/usr/lib)以及动态库配置文件/etc/ld.so.conf内所列的目录下, 搜索出可共享的动态链接库(格式如lib*.so*), 进而创建出动态装入程序(ld.so)所需的连接和缓存文件.
缓存文件默认为/etc/ld.so.cache, 此文件保存已排好序的动态链接库名字列表.
B、如果共享库文件安装到了/usr/local/lib(很多开源的共享库都会安装到该目录下)或其它"非/lib或/usr/lib"目录下, 那么在执行ldconfig命令前, 还要把新共享库目录加入到共享库配置文件/etc/ld.so.conf中, 如下:

cat /etc/ld.so.conf

include ld.so.conf.d/*.conf

echo "/usr/local/lib" >> /etc/ld.so.conf

cat /etc/ld.so.conf

include ld.so.conf.d/*.conf
/usr/local/lib

ldconfig

C、如果共享库文件安装到了其它"非/lib或/usr/lib" 目录下, 但是又不想在/etc/ld.so.conf中加路径(或者是没有权限加路径). 那可以export一个全局变量LD_LIBRARY_PATH,然后运行程序的时候就会去这个目录中找共享库.
LD_LIBRARY_PATH的意思是告诉loader在哪些目录中可以找到共享库. 可以设置多个搜索目录, 这些目录之间用冒号分隔开. 比如安装了一个mysql到/usr/local/mysql目录下, 其中有一大堆库文件在/usr/local/mysql/lib下面,
则可以在.bashrc或.bash_profile或shell里加入以下语句即可:
su - root
export LD_LIBRARY_PATH=/usr/lib:$LD_LIBRARY_PATH
一般来讲这只是一种临时的解决方案, 在没有权限或临时需要的时候使用??
安装达梦客户端和驱动
客户端是dm方提供的dm8_20230905_x86_rh6_64.iso(该版本适合rh6和rh7),只需要安装软件的话不需要license
##创建dmdba用户
[root@vastdata ~]# useradd -m -d /home/dmdba -s /bin/bash dmdba
[root@vastdata ~]# passwd dmdba
Changing password for user dmdba.
New password: dmdba、Dmdba$123
BAD PASSWORD: The password is shorter than 8 characters
Retype new password: dmdba、Dmdba$123
passwd: all authentication tokens updated successfully.

[root@vastdata ~]# mkdir -p /home/dmdba/dmiso
[root@vastdata ~]# cd /home/dmdba/
[root@vastdata dmdba]# mv /orabak/dm8_20230905_x86_rh6_64.iso .
[root@vastdata dmdba]# ll
total 1070216
-rw-r--r-- 1 root root 1095899136 Dec 27 11:25 dm8_20230905_x86_rh6_64.iso
drwxr-xr-x 2 root root 6 Dec 27 11:28 dmiso

[root@vastdata dmdba]# mount -o loop dm8_20230905_x86_rh6_64.iso dmiso/
mount: /dev/loop0 is write-protected, mounting read-only
[root@vastdata dmdba]# chown dmdba:dmdba -R *
chown: changing ownership of ?.miso/DM8 Install.pdf?. Read-only file system
chown: changing ownership of ?.miso/DMInstall.bin?. Read-only file system
chown: changing ownership of ?.miso?. Read-only file system
[root@vastdata dmdba]# su - dmdba
[dmdba@vastdata ~]$ cd dmiso/
[dmdba@vastdata dmiso]$ ll
total 1070152
-r-xr-xr-x 1 root root 2909114 Sep 5 17:25 DM8 Install.pdf
-r-xr-xr-x 1 root root 1092925743 Sep 5 17:28 DMInstall.
bin
[dmdba@vastdata dmiso]$ ./DMInstall.bin -i
跳过license,选择典型安装
Installation Type:
1 Typical
2 Server
3 Client
4 Custom
Please Input the number of the Installation Type [1 Typical]:1

su - root
/home/dmdba/dmdbms/script/root/root_installer.sh
配置odbc.ini
配置odbcinst.ini
[root]# cat /etc/odbcinst.ini
[DM8 ODBC DRIVER]
Description = ODBC DRIVER FOR DM8
Driver = /home/dmdba/dmdbms/bin/libdodbc.so
threading = 0
配置odbc.ini
[root]# cat /etc/odbc.ini
[dm8]
Driver = DM8 ODBC DRIVER --/etc/odbcinst.ini中的名称
Description = DM ODBC DSND
SERVER = 10.22.160.94 --目标端dm的ip
UID = WX_READER
PWD = wxreader@2023
TCP_PORT = 5236
测试
1.把动态库路径添加到环境变量LD_LIBRARY_PATH中,并且修改.bash_profile持久化:
直接修改LD_LIBRARY_PATH的环境变量,添加上:/home/dmdba/dmdbms/bin/的路径[oracle@]$vim .bash_profile
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/dmdba/dmdbms/bin/
source .bash_profile

2.使用dmdba用户打开bin文件权限#su - dmdba#cd /home#chmod -R 775 dmdba

使用oracle用户测试打开dm8连接
oracle@p4oa15dbtest:/home/oracle>isql -v dm8
提示连上dm库,quit退出

配置透明网关
Oracle服务器11g之后自带透明网关,新建配置文件initdm8.ora:
[oracle]$ cd $ORACLE_HOME/hs/admin[oracle]$ ls
extproc.ora initdg4odbc.ora initdm8.ora listener.ora.sample tnsnames.ora.sample[oracle]$ cat initdm8.ora
HS_FDS_CONNECT_INFO = dm8
HS_FDS_TRACE_LEVEL = off --生产环境设置为off
set ODBCINI=/etc/odbc.ini
HS_FDS_SHAREABLE_NAME=/usr/lib/libodbc.so
HS_LANGUAGE="simplified chinese_china.al32utf8"
--HS_LANGUAGE=AMERICAN_CHINA.ZHS16GBK**
HS_NLS_NCHAR=UCS2
配置Oracle监听
#注SERVICE_NAME与odbc中odbc.ini里配置的连接名保持一致
配置tnsnames.ora
#直接复制现有的格式即可,格式不对会报错#单实例,localhost为本地oracle的主机信息
vi $ORACLE_HOME/network/admin/tnsnames.ora
dm8 =
(DESCRIPTION=
(ADDRESS=(PROTOCOL=TCP) (HOST=localhost_ip) (PORT=1521))
(CONNECT_DATA=
(SERVER=DEDICATED)
(SERVICE_NAME=dm8)
)
(HS=OK)
)
#rac,rac1_vip为本地oracle的vip信息
vi $ORACLE_HOME/network/admin/tnsnames.ora
dm8 =
(DESCRIPTION=
(ADDRESS=(PROTOCOL=TCP) (HOST=rac1_vip) (PORT=1521))
(ADDRESS=(PROTOCOL=TCP) (HOST=rac2_vip) (PORT=1521))
(LOAD_BALANCE=yes)
(CONNECT_DATA=
(SERVER=DEDICATED)
(SERVICE_NAME=dm8)
)
(HS=OK)
)
测试之后tnsping dm8测试检查
[oracle]$ tnsping dm8
显示 OK
配置静态监听:
#这一步一定要等到可以申请重启监听窗口后再操作,内容有误会影响到现有的监听#注 SID_NAME与tnsname.ora、/etc/odbc.ini中一样##单实例
vi $ORACLE_HOME/network/admin/listener.ora
SID_LIST_LISTENER=
(SID_LIST=
(SID_DESC=
(SID_NAME=dm8)
(ORACLE_HOME=/opt/Oracle11g/oracle/product/11.2.0/db_1)
(PROGRAM=dg4odbc)
(ENVS=LD_LIBRARY_PATH=/home/dmdba/dmdbms/bin:/opt/Oracle11g/oracle/product/11.2.0/db_1/lib)
)
)

或者

SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(PROGRAM = dg4odbc)
(ORACLE_HOME = /opt/oracle/products/11.2.0)
(SID_NAME = dm8)
)
(SID_DESC =
(GLOBAL_DBNAME = orcl)
(ORACLE_HOME = /opt/oracle/products/11.2.0)
(SID_NAME = orcl)
)

)

##rac,一般rac下main都是动态的监听服务,所以此时的listener.ora中只有默认的4行命令,这4行命令保留不要改,添加以下命令
su - grid
SID_LIST_LISTENER=
(SID_LIST=
(SID_DESC=
(SID_NAME=dm8)
(ORACLE_HOME=/opt/Oracle11g/oracle/product/11.2.0/db_1)
(PROGRAM=dg4odbc)
(ENVS=LD_LIBRARY_PATH=/home/dmdba/dmdbms/bin:/opt/Oracle11g/oracle/product/11.2.0/db_1/lib)
)
)
配置完成之后重启监听文件
##rac环境下也是以下面的方式轮流启停监听,不能reload
停止监听 lsnrctl stop;

启动监听 lsnrctl start;

查看监听状态 lsnrctl status;

重启之后你会发现有一个DM8的实例被监听,状态为unknown;
创建dblink
create public database link dmlink connect to "WXADER" identified by "wxreader@2023" using 'dm8';
select * from table@dmlink;

  1. 管理DBLINK
    查询dblink视图
    select * from SYS."V$DBLINK";

删除dblink
Drop link link_name;

删除公用dnlink
drop public link to_dm;

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服