在《DM8_SQL语言使用手册》的16章节,介绍了使用dblink的语法。但是对于dblink的具体搭建过程,手册中没有进行详细说明。本文中详细描述了在Windows系统和linux系统,x86平台以及ARM平台上,搭建达梦到其他主流数据库的dblink链接的完整步骤。根据经验对搭建、使用dblink的过程中遇到的常见问题提供了解决方案。
达梦数据库支持的外部链接可以分为三类:
1. 同构类型的dblink。该链接只能连接达梦数据库,依靠达梦数据库的mal通信实现。
2. 异构类型(odbc)的dblink。该链接通过调用odbc数据源实现连接其他数据库的功能,可以连接支持odbc协议的数据库。
3. 异构类型(oci)的dblink。通过调用ORACLE数据库的oci接口实现连接ORACLE数据库的功能,只能连接ORACLE数据库。
在windows系统上配置同构类型(达梦类型)的dblink
达梦数据库之间建立同构类型的dblink,是通过达梦内部的mal通信实现的,不依赖于其它的外部驱动。
系统规划:
- 配置数据库EP01,EP02的ini参数。找到两个数据库的dm.ini配置文件,将MAL_INI参数的值配置为1,两个数据库的dm.ini文件都需要修改。
- 配置达梦数据库的dmmal.ini文件。在dm.ini的同级目录下,创建dmmal.ini文件(需要自己创建,默认没有这个文件)。在dmmal.ini文件中添加如下内容。两个达梦数据库都需用配置dmmal.ini且需要保证dmmal.ini中的内容必须完全相同。
- 分别启动两个数据库的dmserver服务。
在达梦数据库安装目录的bin目录下执行 以下命令分别启动两个达梦数据库的服务,当命令行工具中出现 SYSTEM IS READY,表示dmserver服务启动成功。
dmserver E:\DBLINK_TEST\DM02\DAMENG\dm.ini
dmserver E:\DBLINK_TEST\DM01\DAMENG\dm.ini
- 创建dblink,在本实验中不妨创建EP01数据库到EP02数据库中的dblink。
使用disql工具登录EP01节点,查看v$dm_mal_ini动态视图,可以看到mal参数的相关信息。
- 检测dblink创建是否成功。
登录EP02数据库
执行:
create table dblinktest(c1 int);
insert into dblinktest values(1);
commit;
- 登录EP01数据库
执行select * from dblinktest@link1;.如果可以成功查询到数据,说明dblink建立成功。通过该外部链接可以在数据库EP01中成功查询到EP02中的对象
小结:
若在步骤5中测试dblink创建是否成功时,执行
select * from dblinktest@link1;时,报错[-2251]:DBLINK远程服务器获取对象失败。可以考虑从以下几个方面进行排查。
1) 两个数据库的dmmal.ini中的内容是否完全相同。
2) 如果两个达梦数据库安装在不同的计算机上,需要保证两台计算机之间通信正常。检查计算机的防火墙是否关闭,建议关闭防火墙。也可以使用ping命令来确定本地主机能否与另一台计算机成功交换数据包。
在linux系统上配置同构类型(达梦类型)的dblink
所有步骤与在windows系统上配置同构类型的dblink相同,此处不做赘述。
在windows系统上配置异构类型(ODBC)的dblink
在windows系统上配置异构类型的dblink的需要使用odbc数据源应用,以及要连接数据库的odbc驱动。
环境准备:
- Windows系统一般预装了odbc数据源应用,不需要再安装。
- 需要安装要连接的数据库的odbc驱动。
- 保证DM数据库和要连接的数据库服务正常运行。
配置到达梦数据库的dblink
系统规划:
配置异构类型的dblink,建立EP01到EP02的外部链接。
- 进入odbc数据源管理程序,点击添加按钮
选中DM8 ODBC DRIVER驱动程序,点击完成按钮
配置odbc数据源信息如下。配置一个名称为dmdblink的odbc数据源用于连接EP02数据库
配置完成后点击测试按钮,测试数据源,出现测试成功字样后说明数据源配置成功。
- 数据源配置成功后,登录EP01数据库。执行:
create or replace public link link2 connect 'ODBC' with "SYSDBA" identified by "SYSDBA" using 'dmdblink';
- 检测dblink是否创建成功
登录EP02数据库(即配置的odbc数据源连接的数据库)。执行:
create table test(c1 int);
insert into test values(1);
commit;
登录EP01数据库,使用dblink查询远程表,查询成功则dblink创建成功
select * from test@link2;
配置到ORACLE的dblink
系统规划:
- 进入odbc数据源管理程序,点击添加按钮
选择Oracle in OraDB12Home1,点击完成
配置ORACLE数据库的odbc数据源的信息如下:数据源名称为oracle11801,tns服务名为192.168.100.118/orcl。
点击Test Connection,出现Connection successful的弹窗,说明odbc数据源配置成功。
- 配置好ORACLE的odbc数据源后,登录EP01达梦数据库,执行
create or replace link link3 connect 'ODBC' with "SYSTEM" identified by "oracle12c" using 'oracle11801';
- 测试dblink是否创建成功,执行select * from dual@link3;成功查询到数据说明到ORACLE的dblink创建成功。
配置到mysql的dblink
系统规划:
创建达梦数据库EP01到mysql数据库的dblink
- 进入odbc数据源管理程序,点击添加按钮
选择mysql驱动 MYSQL ODBC 5.3 ANSI DRIVER,点击完成。
配置名为mysql的odbc数据源。mysql有多个库,默认连接的是mysql数据库。
配置完后点击TEST按钮,出现Connecttion Successfu的弹窗,说明odbc数据源配置成功。
- 配置好mysql的odbc数据源后,登录EP01达梦数据库,执行
create or replace link link4 connect 'ODBC' with "root" identified by "hust4400" using 'mysql';
- 测试dblink是否创建成功.登录EP01,使用刚创建的dblink查询目标mysql数据库中的表,如果能查询成功说明dblink创建成功.
配置到sqlserver的dblink
系统规划
创建达梦数据库EP01到sqlserver数据库中master库的dblink。
- 进入odbc数据源管理程序,点击添加按钮
选择SQL Server ODBC驱动,点击完成
按照提示命名odbc数据源,填入sqlserver数据库的服务器地址后点击下一步
点击下一步,选择要连接的mysql的数据库名,默认为master。
如无特殊要求,无需更改该页面的配置,直接点击完成,然后测试odbc数据源.
当出现测试成功后,说明odbc数据源配置成功
- 配置好sqlserver的odbc数据源后,登录EP01达梦数据库,执行:
create or replace link link5 connect 'ODBC' with "sa" identified by "hust4400" using 'sqlserver'; 测试dblink是否创建成功 登录EP01,使用刚创建的dblink查询目标sqlserver数据库中的表,如果能查询成功说明dblink创建成功
小结
根据经验在配置过程中,可能遇到的问题如下:
- 配置odbc数据源时,测试数据源时报错连接失败。
解决方法:一些数据库库默认不允许localhost以外的ip地址远程访问数据库,需要对应修改数据库的配置。 - odbc数 源测试成功,创建dblink后,查询目标数据库对象失败。
解决方法:检查创建dblink语句中数据源的名称,用户名/密码是否正确。 需要注意创建dblink时,仅检查语法的正确性,执行create dblink语句成功不能说明成功建立了到目的数据库的链接。
在windows系统上配置异构类型(oci)的dblink
除了通过odbc接口创建外部连接,针对ORACLE数据库,达梦还提供了通过ORACLE的oci接口创建外部链接的方式。
环境准备:
需要安装ORACLE的oci模块,可以单独安装,同时如果该机器上已经安装过ORACLE,则oci模块已经默认安装。
系统规划:
- 确认ORACLE的oci模块是否安装成功,在命令行工具中执行以下语句,如果能成功连接上ORACLE,则说明ORACLE的oci模块安装成功。
sqlplus SYSTEM/oracle12c@192.168.100.118/orcl
- 登录EP01数据库,执行以下语句创建dblink
create or replace link link6 connect 'ORACLE' with "SYSTEM" identified by "oracle12c" using
'192.168.100.118/orcl';
- 验证dblink是否创建成功,使用创建的dblink查询目的ORACLE数据库中的表,若能查询成功说明dblink创建成功。
在linux系统上配置异构类型(ODBC)的dblink
环境准备:
在linux系统上配置异构类型的dblink,需要在linux系统上安装unixodbc和对应数据的odbc驱动。
一般linux系统上已经预装了unixodbc,但是推荐自己手动安装unixodbc,这样可以避免一些未知错误。本文中使用编译源码的方式安装unixodbc。
根据反馈,很多用户对于unixodbc的编译安装是不熟悉的,因此本文提供了使用源码在x86以及arm平台上安装unixodbc的命令:
配置到达梦数据的dblink
系统规划:
1.配置unixODBC的odbc.ini文件。本文的unixODBC安装目录为/usr/local/unixODBC,则odbc.ini文件的位置/usr/local/unixODBC/etc/odbc.ini。配置odbc.ini的内容如下:
2.检查odbc数据源是否配置成功。走到/usr/local/unixODBC/bin目录下,执行
./isql dm SYSDBA SYSDBA
其中dm为配置的odbc数据源的名称。如果使用unixodbc的isql工具成功连接目标数据库,并能成功查询到数据库中对象,说明odbc数据源配置成功。
3.以防dm数据库连接目标数据库时找不到对应的odbc驱动。在启动EP01数据库dmserver的终端设置环境变量:
export LD_LIBRARY_PATH=/usr/local/unixODBC/lib
4.重启EP01数据库的dmserver服务,重启的目的是使达梦数据库能够调用到odbc驱动。
5.登录EP01数据库,建立dblink:
create or replace public link link2 connect 'ODBC' with "SYSDBA" identified by "SYSDBA" using 'dm';
6.检测dblink是否创建成功,如果能查到目标数据库中的对象,说明dblink创建成功。
配置到ORACLE的dblink
系统规划:
1.在unixODBC的odbc.ini文件中配置好ORACLE的odbc数据源
2. 检查ORACLE的odbc数据源是否配置成功。到/usr/local/unixODBC/bin目录下,执行以下命令测试能否成功连接到目标ORACLE数据库。
./isql oracle C#QXZ 123456789
3.为了防止dm数据库连接目标数据库时找不到对应的odbc驱动,在EP01启动dmserver的终端设置如下环境变量,其中两个路径分布是unixodbc依赖的静态库路径和Oracle的odbc驱动依赖的静态库路径
export LD_LIBRARY_PATH=/usr/local/unixODBC/lib:/ssd/zsn/oracle/product/12/db_1/lib
4.重启EP01数据库的dmserver服务,重启的目的是使达梦数据库能够调用到相关的odbc驱动。
5.登录EP01数据库执行:
create or replace link link3 connect 'ODBC' with "C#QXZ" identified by "123456789" using 'oracle';
6.测试dblink是否创建成功,执行select * from dual@link3;成功查询到数据说明到ORACLE的dblink创建成功。
配置到mysql的dblink
系统规划:
建立达梦数据库EP01到mysql数据库的dblink连接。
1.在unixODBC中配置好mysql数据库的odbc数据源,配置odbc.ini文件
2.检查odbc数据源是否配置成功。到/usr/local/unixODBC/bin目录下执行 ./isql mysql root hust4400。若连接成功且能查到目标mysql数据库中的对象。说明odbc数据源配置成功。
3.为了防止dm数据库连接目标数据库时找不到对应的odbc驱动,在EP01启动dmserver的终端设置如下环境变量。其中两个路径分布是unixodbc依赖的静态库路径和mysql的odbc驱动依赖的静态库路径。
export LD_LIBRARY_PATH=/usr/local/unixODBC/lib:/usr/local/mysql-connector-odbc-5.3.13-linux-glibc2.12-x86-64bit/mysql-connector-odbc-5.3.13-linux-glibc2.12-x86-64bit/lib/libmyodbc5a.so
4.重启EP01数据库的dmserver服务,重启的目的是使达梦数据库的服务能够调用到相关odbc驱动。
5.登录EP01,创建dblink:
create or replace link link4 connect 'ODBC' with "root" identified by "hust4400" using 'mysql';
6.测试dblink是否创建成功。使用刚创建的dblink查询目标mysql数据库中的表,如果能查询成功说明dblink创建成功。
配置到sqlserver的dblink
系统规划:
创建达梦数据库EP01到sqlserver数据库中master库的dblink。
1.在unixODBC中配置好sqlserver数据库的odbc数据源。odbc.ini文件配置如下:
2.检查odbc数据源是否配置成功。到/usr/local/unixODBC/bin目录下执行 以下语句, 若连接成功且能查到目标sqlserver数据库中的对象。说明odbc数据源配置成功。
./isql master sa hust4400
3.为了防止dm数据库连接目标数据库时找不到对应的odbc驱动,在EP01启动dmserver的终端设置如下环境变量。其中两个路径分布是unixodbc依赖的静态库路径和sqlserver的odbc驱动依赖的静态库路径。
export LD_LIBRARY_PATH=/usr/local/unixODBC/lib:/usr/local/freetds/lib
4.重启EP01数据库的dmserver服务,重启的目的是使达梦数据库的服务能够调用到相关odbc驱动。
5.登录EP01数据库,创建dblink:
create or replace link link5 connect 'ODBC' with "sa" identified by "hust4400" using 'sqlserver';
6.测试dblink是否创建成功。登录EP01,使用刚创建的dblink查询目标sqlserver数据库中的表,如果能查询成功说明dblink创建成功。
小结
在linux系统上配置异构类型的dblink连接各个数据库的步骤基本相同,只有配置odbc数据源时配置文件的写法略有差异。
在实际应用中,可能遇到如下问题:
-
调用dblink查询目的数据库中的对象时,报错库文件加载失败。
报错原因:达梦数据库服务没有找到unixodbc驱动或者目的数据库的odbc驱动。
解决方法:先退出dmserver的服务,在启动dmserver的终端上设置如下环境变量,环境变量中第一个路径是unixodbc的静态库所在路径,第二个路径是目标数据库odbc驱动的静态库所在的路径。
export LD_LIBRARY_PATH=/usr/local/unixODBC/lib:/usr/local/freetds/lib -
在一些国产的操作系统平台上,如银河麒麟v10上,在unixodbc的isql工具中可以成功连接目的数据库,但是使用dblink查询目的数据库对象时报错。例如当目的数据库为sqlserver数据库时,使用dblink查询sqlserver中的表对象时报错:
[[FreeTDS][SQL Server]Could not find stored procedure ‘master’.]
报错原因:系统预装的unixodbc模块兼容问题。
解决方法:不使用系统预装的unixodbc模块,自己编译unixodbc模块并调用。 -
配置DM7数据库到DM8数据库的异构外部链接,使用该外部链接导致DM7数据库服务崩溃。
错误原因:配置DM8数据库的odbc数据源时使用的DM8的odbc驱动,驱动不兼容导致服务崩溃。
解决方法:配置DM7与DM8之间的异构dblink时使用DM7的odbc驱动。 -
在一些国产的操作系统平台上,如银河麒麟v10、UOS操作系统上,使用unixODBC中的isql工具查询目标数据库中的表,中文结果显示正常,但是使用dblink查询目标数据库中的表时,中文结果显示为乱码。
错误原因:字符集配置有问题导致转码出错。
解决方法:配置目标数据库的odbc驱动的本地字符集为gbk。以配置sqlserver的odbc数据源为例子
配置sqlservre的驱动freetds的配置文件freetds.conf内容为
[DSN_ON_FREETDS]
host = 192.168.2.7
port = 1433
tds version = 7.3
client charset = GBK
配置odbcinst.ini文件内容为
[FREETDS]
Description = FREE TDS DRIVER
Driver = /usr/local/freetds/lib/libtdsodbc.so
配置odbc.ini文件内容为:
[mssql]
driver=FREETDS
DESCRIPTION=THE_DSN_OF_ODBC
servername=DSN_ON_FREETDS
database=master
user=sa
password=pwd
在linux系统上配置异构类型(oci)的dblink
环境准备:安装oacle的oci模块。本实验使用安装dblink11g.tar.gz的方式来安装ORACLE的oci模块。安装成功后,在oci模块的安装目录下执行以下命令。若连接成功,则说明oci模块安装成功。
./sqlplus SYSTEM/oracle12c@192.168.100.118/orcl
系统规划:
- 配置环境变量以防达梦服务器调用不到相关的oci驱动。环境变量中的路径是ORACLE的oci接口依赖的静态库。
export LD_LIBRARY_PATH=/usr/local/oraclelib
- 配置好环境变量后启动dmserver服务。
- 登录达梦数据库,执行
create or replace link link6 connect 'ORACLE' with "SYSTEM" identified by "oracle12c" using '192.168.100.118/orcl';
- 验证dblink是否创建成功,使用创建的dblink查询目的ORACLE数据库中的表,若能查询成功说明dblink创建成功。
总结:在实际生产环境中,进行第四步操作时,可能报错加载库文件失败,这是因为没有进行步骤1、2,导致达梦服务器找不到ORACLE的oci驱动。