数据库链接对象 (LINK) 是 DM 中的一种特殊的数据库实体对象,它记录了远程数据库的连接和路径信息,用于建立与远程数据的联系。
本文章介绍同构数据库链接和异构数据库链接两种链接方式。
同构数据库链接
DM 到 DM
可以持跨平台(Linux到Windows)建数据库连接
创建 DM 到 DM 的数据库链接,并使用数据库链接对远程库做增、删、改、查操作。
环境说明
数据库1 | 数据库2 | 数据库3 | |
---|---|---|---|
IP地址 | 192.168.2.6 | 192.168.2.7 | 192.168.2.5 |
实例名(INSTANCE_NAME) | DMSERVER | DMSERVER2 | DMSERVER3 |
MAL_PORT | 5282 | 5283 | 5284 |
数据库软件目录 | /dmdata/dmdbms | /dmdata/dmdbms | D:\dmdata\dmdbms |
数据库实例目录 | /dmdata/DAMENG | /dmdata/DAMENG | D:\dmdata\DAMENG |
操作系统 | CentOS Linux 7 | CentOS Linux 7 | Windows Server 2016 |
数据库版本 | DM8 | DM8 | DM8 |
CPU架构 | x86_64 | x86_64 | x86_64 |
修改配置文件
数据库1、数据库2和数据库3同时修改 dm.ini
文件(文件路径在 数据库实例目录
下)
MAL_INI = 1
数据库1、数据库2和数据库3同时配置 dmmal.ini
文件,同样在数据库实例目录下(如无此文件,新建此文件)
[MAL_INST1]
MAL_INST_NAME = DMSERVER
MAL_HOST = 192.168.2.6
MAL_PORT = 5282
[MAL_INST2]
MAL_INST_NAME = DMSERVER2
MAL_HOST = 192.168.2.7
MAL_PORT = 5283
[MAL_INST3]
MAL_INST_NAME = DMSERVER3
MAL_HOST = 192.168.2.5
MAL_PORT = 5284
注意:数据库1、数据库2和数据库3的实例名不能一样,否则在重启实例时,数据库无法启动;修改实例名需要修改文件dm.ini中的INSTANCE_NAME
后重启DM数据库服务
重启DM数据库服务
只有重启DM数据库服务,才能使修改的参数生效(3个数据库都需要重启)
Linux:
DmServiceDMSERVER restart
Windows:
点击【开始界面】,选择【达梦数据库】菜单,点击【DM 服务查看器】。
创建DBLINK
在数据库1中创建表 TEST
CREATE TABLE TEST(C1 INT,C2 VARCHAR(20));
在数据库3中创建表 TEST3
CREATE TABLE TEST3(C1 INT,C2 VARCHAR(20));
在数据库2中创建数据库链接 LINK01
和 LINK03
来链接数据库1和数据库3。
CREATE OR REPLACE PUBLIC LINK LINK01 CONNECT 'DAMENG' WITH SYSDBA IDENTIFIED BY "Dameng123" USING '192.168.2.6/5282';
CREATE OR REPLACE PUBLIC LINK LINK03 CONNECT 'DAMENG' WITH SYSDBA IDENTIFIED BY "Dameng123" USING '192.168.2.5/5284';
注意:如果出现报错 第1 行附近出现错误[-6033]:DBLINK连接丢失.
请检查数据库日志和系统防火墙
插入数据
在数据库2通过创建的 LINK01
向数据库1的表 TEST
中插入数据:
INSERT INTO TEST@LINK01 VALUES(1,'A');
INSERT INTO TEST@LINK01 VALUES(2,'B');
commit;
在数据库2通过创建的 LINK03
向数据库3的表 TEST3
中插入数据:
INSERT INTO TEST3@LINK03 VALUES(4,'D');
commit;
查看数据
查看表 TEST
数据
select * from test@link01;
查看表 TEST3
数据
select * from test3@link03;
异构数据库链接
DM 到 Oracle
推荐达梦DBLINK使用Oralce OCI的方式去访问Oracle数据库。
环境说明
DM数据库 | Oracle数据库 | |
---|---|---|
IP地址 | 192.168.2.6 | 192.168.2.12 |
数据库端口 | 5236 | 1521 |
实例名 | DMSERVER | ora11g |
数据库版本 | DM8 | 11.2.0.4 |
操作系统版本 | CentOS Linux 7 | CentOS Linux 7 |
CPU架构 | x86_64 | x86_64 |
通过OCI访问
处理Oracle Instance Client驱动包
Oracle Instance Client官网下载
文件名称:instantclient-basic-linux.x64-11.2.0.4.0.zip
(经过测试支持 21.16
版本的Oracle Instance Client驱动包)
上传Oracle Instance Client驱动包到DM数据库的服务器上
解压缩
unzip /soft/instantclient-basic-linux.x64-11.2.0.4.0.zip -d /opt/oracle
注:解压后不需要更改属组,正常使用root用户:root组即可
如果Instance Client安装包是18.3之前的版本,还需要创建几个动态库的软链接。如下:
cd /opt/oracle/instantclient_11_2
ln -s libclntsh.so.11.1 libclntsh.so
ln -s libocci.so.11.1 libocci.so
配置环境变量
修改dmdba用户下的.bash_profile文件,添加如下内容
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/opt/oracle/instantclient_11_2"
使环境变量生效
source .bash_profile
查看环境变量
env |grep LD_LIBRARY_PATH
创建DBLINK
在DM数据库创建数据库链接 LINK1
来链接Oracle数据库
create or replace link "LINK1" connect 'oracle' with "ORADBA" identified by "oracle" using '192.168.2.12:1521/ora11g';
可能没有加载OCI驱动,需要重启DM数据库服务
DmServiceDMSERVER restart
在Oracle数据库中创建表 ORA1
CREATE TABLE ORA1(C1 INT,C2 VARCHAR(20));
插入数据
INSERT INTO ORA1@LINK1 VALUES(1,'A');
INSERT INTO ORA1@LINK1 VALUES(3,'B');
INSERT INTO ORA1@LINK1 VALUES(5,'C');
commit;
查看数据
查看表 ORA1
数据
select * from ora1@link1;
通过ODBC访问
注意,使用 21.16 版本的ODBC可能导致创建的DBLINK无法链接到Oracle库,
处理Oracle Instance Client和ODBC驱动包
下载ODBC驱动包
Oracle ODBC官网下载
文件名称:instantclient-basic-linux.x64-11.2.0.4.0.zip
和 instantclient-odbc-linux.x64-11.2.0.4.0.zip
上传Oracle Instance Client驱动包到DM数据库的服务器上
创建目录用来存放ODBC的所有驱动包
mkdir -p /opt/oracle
解压缩到 /opt/oracle
目录下
unzip /soft/instantclient-basic-linux.x64-11.2.0.4.0.zip -d /opt/oracle
unzip /soft/instantclient-odbc-linux.x64-11.2.0.4.0.zip -d /opt/oracle
安装ODBC
通过本地yum源安装ODBC
yum -y install unixODBC unixODBC-devel
odbcinst -j
配置环境变量
配置环境变量并使之生效
vim /home/dmdba/.bash_profile
export ORACLE_HOME=/opt/oracle/instantclient_11_2
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ORACLE_HOME
export TNS_ADMIN=$ORACLE_HOME/network/admin
source /home/dmdba/.bash_profile
查看Oracle的ODBC动态库有没有缺少依赖库
ldd /opt/oracle/instantclient_11_2/libsqora.so.11.1
linux-vdso.so.1 => (0x00007ffc520e6000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007f1dbf66a000)
libm.so.6 => /lib64/libm.so.6 (0x00007f1dbf368000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f1dbf14c000)
libnsl.so.1 => /lib64/libnsl.so.1 (0x00007f1dbef32000)
libclntsh.so.11.1 => /opt/oracle/instantclient_11_2/libclntsh.so.11.1 (0x00007f1dbc5c3000)
libodbcinst.so.1 => not found
libc.so.6 => /lib64/libc.so.6 (0x00007f1dbc1f5000)
/lib64/ld-linux-x86-64.so.2 (0x00007f1dbf86e000)
libnnz11.so => /opt/oracle/instantclient_11_2/libnnz11.so (0x00007f1dbbe28000)
libaio.so.1 => /lib64/libaio.so.1 (0x00007f1dbbc26000)
此处发现缺失 libodbcinst.so.1
,通过find命令无法找到,需要查找 libodbcinst.so
并创建软链接
find / -name libodbcinst.so
ln -s /usr/lib64/libodbcinst.so /opt/oracle/instantclient_11_2/libodbcinst.so.1
配置文件
配置 tnsnames.ora
创建存放的目录
mkdir -p /opt/oracle/instantclient_11_2/network/admin
vim /opt/oracle/instantclient_11_2/network/admin/tnsnames.ora
ora11g =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.2.12)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = ora11g)
)
)
vim /etc/odbcinst.ini
[Oracle]
Description = Oracle ODBC Driver
Driver = /opt/oracle/instantclient_11_2/libsqora.so.11.1
vim /etc/odbc.ini
[ORA]
DSN = ORA
Driver = Oracle
ServerName = ora11g
测试ODBC
测试连接是否正常
isql -v ORA oradba oracle
出现 Can't open lib '/opt/oracle/instantclient_11_2/libsqora.so.11.1' : file not found
需要查看 libsqora.so.11.1
的依赖情况
创建DBLINK
在DM数据库创建ODBC数据库链接 LINKODBC1
来链接Oracle数据库
create or replace link "LINKODBC1" connect 'ODBC' with "ORADBA" identified by "oracle" using 'ORA';
可能没有加载ODBC驱动,需要重启DM数据库服务
DmServiceDMSERVER restart
插入数据
在DM数据库通过创建的 LINKODBC1
向Oracle数据库的表 ORA1
中插入数据:
INSERT INTO ORA1@LINKODBC1 VALUES(6,'D');
INSERT INTO ORA1@LINKODBC1 VALUES(8,'P');
commit;
查看数据
查看表 ORA1
数据
select * from ORA1@LINKODBC1;
社区地址:https://eco.dameng.com