达梦数据库的外部链接是一种数据库的实体对象,记录了远程数据库的连接信息,用于建立与远程数据的联系。用户可以通过数据库的外部链接对象透明地操作远程数据库的数据,对远程数据库的表进行查询和增删改操作,也可以调用远程的存储过程。数据库的外部链接对象可以是公用的(数据库中所有用户使用),也可以是私有的(特定用户使用)。
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)两台数据库机器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.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的实例名不能一样
修改两台数据库实例的dm.ini的参数,MAL_INI参数改为1
机器A:
机器B:
在主机A中创建表后,使用主机B来连接进行操作:
主机A创建test表
Create table test(c1 int,c2 int);
建立外部连接语法如下:
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';
机器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的表
(1)DBLINK本地服务器与远程服务器编码不同
原因:两库之间字符级编码不一致,无法搭建DBLINK,需要字符集相同的库建立dblink。
注:unicode [0]代表GB18030,[1]D代表UTF8
(2)dblink连接丢失.
原因;dm.ini中MAL_INI值为0
解决:修改dm.ini的值为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
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.
别名 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 个处理程序...
Oracle端:
(1)去下载Oracle客户端:
(2)下载basic,sqlplus,sdk包,根据oracle的版本号下载如下图所示的压缩包(示范的oracle版本为11.2.0.4),需要oracle账号可以免费注册。
将以上安装包解压后,会存到同一个文件夹中
(3)DM端:FTP将下载的包传输到达梦数据库安装路径/dmdbms/bin目录下:
并修改dmdba:dinstall属组和 755权限。
将oracle的lib包cp到达梦数据的/dmdbms/bin下:
cp -r /home/dmdba/dmdbms/bin/instantclient_11_2 ../
Chmod -R 755 *
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
测试远程连接Oracle数据库:
创建DM-Oracle的dblink:
SQL> create or replace link LL connect 'ORACLE' with user01 identified by "user01" using 'prod’;
操作已执行
测试可以插入成功!
(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目录下
数据库版本 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
去OCBC官网下载mysql对应版本的驱动
上传至达梦服务器并解压:
运行odcinst -j,查看odbc配置文件:
配置上图红框中两个文件:
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
SQL> create or replace public LINK LINK_MYSQLODBC connect 'ODBC' with "liu" identified by "liu123456" using 'mysqlodbc';
操作已执行
测试插入成功!
(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保持一致,将注释去掉,防止报错:
修改后:
[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
测试连通性成功:
文章
阅读量
获赞