注册
达梦8 dblink搭建【干货分享】
培训园地/ 文章详情 /

达梦8 dblink搭建【干货分享】

Content つ 2023/07/06 2904 2 0

一.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需要用户手动配置。

三.dm到dm的dblink搭建

3.1准备环境

(1)两台数据库机器A 、B,均安装了达梦数据库。
  (2)两台数据库机器A 、B,均关闭了防火墙和selinux。
 (3)两台数据库机器A 、B的实例名不能一致,两个数据库的字符集必须一致。

数据库版本 IP 主机名 实例名 端口号 机器
DM Database Server 64 V8 192.168.135.1 DM1 DM1 5237 A
DM Database Server 64 V8 192.168.135.2 DM2 DMSERVER 5236 B

3.2 搭建步骤

3.2.1 创建dmmal.ini
两台数据库机器,第一台为目的主机A(被连接的机器),另外一台为测试机B(用来连接的机器),首先我们在两台机器的数据库实例下面创建dmmal.ini 文件
vi /dm8/dmdata/{DB_NAME}/dmmal.ini

[dmlink1]    #自定义
mal_inst_name  = DM1   #A主机的实例名,和dm.ini中的INSTANCE_NAME保持一致
mal_inst_host = 192.168.135.1  #A主机的ip地址
mal_inst_port = 5237        #A主机的实例端口,和dm.ini中的PORT_NUM保持一致
mal_host = 192.168.135.1   #A主机的ip地址
mal_port = 61142       #系统监听TCP连接端口(自定义)
 
[dmlink2]    #自定义
mal_inst_name  = DMSERVER   #B主机的实例名,和dm.ini中的INSTANCE_NAME保持一致
mal_inst_host = 192.168.135.2   #B主机的ip地址
mal_inst_port = 5236        #B主机的实例端口,和dm.ini中的PORT_NUM保持一致
mal_host = 192.168.135.2   #B主机的ip地址
mal_port = 61142      #系统监听TCP连接端口(自定义)

注意:两台机器的dmmal.ini必须一致,A和B的实例名不能一样

3.2.2 修改配置文件

修改两台数据库实例的dm.ini的参数,MAL_INI参数改为1

3.2.3 重启数据库实例

机器A:
image.png

机器B:
image.png

3.2.4 创建测试表

在主机A中创建表后,使用主机B来连接进行操作:
主机A创建test表
Create table test(c1 int,c2 int);

3.2.5 创建dblink

建立外部连接语法如下:
create public link 外部连接名 connect with A主机登录用户 identified by A主机登录用户密码 using 'A主机ip/a主机系统监听TCP连接端口';
主机B创建dblink:

SQL> create public link dmlink1 connect with "SYSDBA" identified by "SYSDBA123" using '192.168.135.1/61142';

3.2.6  结果测试

机器B:
SQL> insert into test@dmlink1 values(1,1);
影响行数 1
已用时间: 7.996(毫秒). 执行号:602.
SQL> commit;
操作已执行
机器A:
SQL> select * from test;
行号 C1 C2


1 1 1
机器B可以操作机器A的表

3.3报错处理

(1)DBLINK本地服务器与远程服务器编码不同
image.png
image.png
原因:两库之间字符级编码不一致,无法搭建DBLINK,需要字符集相同的库建立dblink。
注:unicode [0]代表GB18030,[1]D代表UTF8
(2)dblink连接丢失.
image.png
原因;dm.ini中MAL_INI值为0
解决:修改dm.ini的值为1,并且重启数据库服务。

四.dm到Oracle的dblink搭建

4.1 环境准备

(1)一台数据库机器A安装了oracle数据库并启动监听。
(2)一台机器B安装了DM数据库和oracle数据库客户端。
(3)关闭防火墙和selinux。
数据库版本 IP 主机名 实例名 端口号 机器
DM Database Server 64 V8 192.168.135.1 DM1 DMSERVER 5236 A
Oracle Database 11.2.0.4.0 192.168.135.88 Oracle1 prod 1521 B

4.2 操作步骤

4.2.1 oracle创建用户,测试表及启动监听

Oracle端执行:
(1) 连接数据库创建测试用户user01密码user01,创建测试表test

Create user user01 identified by user01;
grant dba to user01;
conn user01/user01
create table test (id int);
insert into test values(1);
commit;

(2) 确认是否开启监听

[oracle@oracle1 ~]$ lsnrctl status

LSNRCTL for Linux: Version 11.2.0.4.0 - Production on 23-5月 -2023

Copyright (c) 1991, 2013, Oracle. All rights reserved.

正在连接到 (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521))
LISTENER 的 STATUS

别名 LISTENER
版本 TNSLSNR for Linux: Version 11.2.0.4.0 - P
启动日期 23-5月 -2023 16:42:02
正常运行时间 0 天 0 小时 0 分 17 秒
跟踪级别 off
安全性 ON: Local OS Authentication
SNMP OFF
监听程序日志文件 /u01/diag/tnslsnr/oracle1/listener/alert/
监听端点概要...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=oracle1)(PORT=1521)))
服务摘要..
服务 "prod" 包含 1 个实例。
实例 "prod", 状态 READY, 包含此服务的 1 个处理程序...
服务 "prodXDB" 包含 1 个实例。
实例 "prod", 状态 READY, 包含此服务的 1 个处理程序...

4.2.2 配置Oracle客户端

Oracle端:
(1)去下载Oracle客户端:
image.png
(2)下载basic,sqlplus,sdk包,根据oracle的版本号下载如下图所示的压缩包(示范的oracle版本为11.2.0.4),需要oracle账号可以免费注册。
image.png

image.png
image.png
将以上安装包解压后,会存到同一个文件夹中
image.png
(3)DM端:FTP将下载的包传输到达梦数据库安装路径/dmdbms/bin目录下:
并修改dmdba:dinstall属组和 755权限。
image.png

将oracle的lib包cp到达梦数据的/dmdbms/bin下:
cp -r /home/dmdba/dmdbms/bin/instantclient_11_2 ../
Chmod -R 755 *
image.png
4.2.3 配置dm到数据库链接
DM端:
将libclntsh.so.11.1 复制一个名字为:libclntsh.so  
[dmdba@DM1 ~]$ cp /home/dmdba/dmdbms/bin/libclntsh.so.11.1 /home/dmdba/dmdbms/bin/libclntsh.so

检查lib链接是否完整:ldd libclntsh.so
注意:如果链接不完整,就从客户端下载一份链接,或者从oracle同版本的环境copy一份到/dmdbms/bin下即可。

[dmdba@DM1 bin]$ mkdir -p /home/dmdba/dmdbms/bin/network/admin
[dmdba@DM1 bin]$ vi /home/dmdba/dmdbms/bin/network/admin/tnsnames.ora

prod =                                           
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.135.88)(PORT = 1521))             
    )
    (CONNECT_DATA =
      (SERVICE_NAME = prod)                 
    )
  )

配置环境变量:

su - dmdba
vi .bash_profile: 
--添加已下内容:
export ORACLE_HOME=/home/dmdba/dmdbms/bin
export TNS_ADMIN=$ORACLE_HOME/network/admin
export NLS_LANG=AMERICAN_AMERICA.AL32UTF8
export LD_LIBRARY_PATH=$ORACLE_HOME/lib
export PATH=$ORACLE_HOME:$PATH
--保存后使环境变量生效:
source .bash_profile

4.2.3 测试数据库dblink连接

测试远程连接Oracle数据库:
image.png

创建DM-Oracle的dblink:
SQL> create or replace link LL connect 'ORACLE' with user01 identified by "user01" using 'prod’;
操作已执行

4.2.4 结果测试

image.png
测试可以插入成功!

4.3 报错处理

(1)远程连接报错无法找到libsqlplus.so文件
[dmdba@DM1 ~]$ sqlplus user01/user01@prod
sqlplus: error while loading shared libraries: libsqlplus.so: cannot open shared object file: No such file or directory

原因及解决方法:
1.权限问题 文件libsqlplus.so 没有可读权限
没有权限导致的,查找libsqlplus.so文件,输入命令;
find / -name libsqlplus.so
接着修改权限,输入命令;
chmod 755 libsqlplus.so

2、环境变量设置有问题
输入命令,修改环境变量:
export LD_LIBRARY_PATH=$ORACLE_HOME/lib

3.检查lib库是否缺失动态so文件:
如果缺失,就重新下载完整版客户端,或拷贝一份所需的so文件到/dmdbms/bin目录下
image.png

五.Dm到mysql的dblink搭建

5.1环境准备:

数据库版本 IP 主机名 实例名 端口号 机器
Mysql 5.7.33 192.168.135.77 Mysql Liu 3306 A
DM Database Server 64 V8 192.168.135.1 DM2 DMSERVER 5236 B

5.2 操作步骤:

5.2.1 下载mysql相关的odbc驱动:

去OCBC官网下载mysql对应版本的驱动

上传至达梦服务器并解压:
image.png

5.2.2配置unixodbc:

运行odcinst -j,查看odbc配置文件:
image.png
配置上图红框中两个文件:

vi /etc/odbcinst.ini

[MySQL ODBC 5.3 Unicode Driver]
Driver=/usr/lib64/libmyodbc5w.so
UsageCount=1

vi /etc/odbc.ini

[mysqlodbc]
Driver = MySQL ODBC 5.3 Unicode Driver
SERVER = 192.168.135.77
PORT = 3306 
USER = liu 
PASSWORD =liu123456 
CHARSET= gbk
DATABASE= liu  
OPTION = 3
TRACE = OFF

测试odbc驱动是否连接成功:
[root@DM1 local]# isql -v mysqlodbc
image.png

5.2.3 在达梦创建dblink:

SQL> create or replace public LINK LINK_MYSQLODBC connect 'ODBC' with "liu" identified by "liu123456" using 'mysqlodbc';
操作已执行

5.2.4 结果测试

测试插入成功!
image.png

5.3 报错处理:

(1)利用dblink查询报错连接丢失.
报错:
SQL> create or replace public LINK LINK_MYSQLODBC connect 'ODBC' with "liu" identified by "liu123456" using 'mysqlodbc';
SQL> select * from "liu"."dem01"@LINK_MYSQLODBC;
select * from "liu"."dem01"@LINK_MYSQLODBC;
第1 行附近出现错误[-6010]:连接丢失.

原因:
查看数据库日志:
2023-05-23 21:57:44.414 [ERROR] database P0000007165 T0000000000000008904 ODBC connect error:[08003][0][unixODBC][Driver Manager]Connection not open
2023-05-23 21:57:44.414 [ERROR] database P0000007165 T0000000000000008904 ODBC SQLDISCONNECT FAILURE
查看ODBC配置文件,测试ODBC连接是否正常:
[root@DM1 local]# isql -v mysqlodbc
[S1000][unixODBC][MySQL][ODBC 5.3(w) Driver]Unknown MySQL server host '192.168.135.77 # mysql的ip' (22)
[ISQL]ERROR: Could not SQLConnect

查看配置文件:
cat /etc/odbcinst.ini
[ODBC 5.3 Unicode Driver]
Driver=/usr/lib64/libmyodbc5w.so
UsageCount=1

cat /etc/odbc.ini
[mysqlodbc]
Driver = MySQL ODBC 5.3 Unicode Driver
SERVER = 192.168.135.77 # mysql的ip
PORT = 3306 # mysql的端口
USER = liu # 账号
PASSWORD =liu123456 # 密码
CHARSET= gbk
DATABASE= liu # 库名
OPTION = 3
TRACE = OFF

解决:
修改红框中的ODBC配置文件,将Driver保持一致,将注释去掉,防止报错:
image.png
修改后:
[root@DM1 local]# cat /etc/odbc.ini
[mysqlodbc]
Driver = ODBC 5.3 Unicode Driver
SERVER = 192.168.135.77
PORT = 3306
USER = liu
PASSWORD =liu123456
CHARSET= gbk
DATABASE= liu
OPTION = 3
TRACE = OFF

[root@DM1 local]# cat /etc/odbcinst.ini
[ODBC 5.3 Unicode Driver]
Driver=/usr/lib64/libmyodbc5w.so
UsageCount=1

测试连通性成功:
image.png

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服