暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

达梦数据库外部链接搭建指南

原创 小泽又沐风 2021-08-27
6329
在《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通信实现的,不依赖于其它的外部驱动。

系统规划:
image.png

  1. 配置数据库EP01,EP02的ini参数。找到两个数据库的dm.ini配置文件,将MAL_INI参数的值配置为1,两个数据库的dm.ini文件都需要修改。
    image.png
  2. 配置达梦数据库的dmmal.ini文件。在dm.ini的同级目录下,创建dmmal.ini文件(需要自己创建,默认没有这个文件)。在dmmal.ini文件中添加如下内容。两个达梦数据库都需用配置dmmal.ini且需要保证dmmal.ini中的内容必须完全相同。
    image.png
  3. 分别启动两个数据库的dmserver服务。
    在达梦数据库安装目录的bin目录下执行 以下命令分别启动两个达梦数据库的服务,当命令行工具中出现 SYSTEM IS READY,表示dmserver服务启动成功。
      dmserver E:\DBLINK_TEST\DM02\DAMENG\dm.ini
      dmserver E:\DBLINK_TEST\DM01\DAMENG\dm.ini
  1. 创建dblink,在本实验中不妨创建EP01数据库到EP02数据库中的dblink。
    使用disql工具登录EP01节点,查看v$dm_mal_ini动态视图,可以看到mal参数的相关信息。
    image.png
  2. 检测dblink创建是否成功。
    登录EP02数据库
    执行:
      create table dblinktest(c1 int);
      insert into dblinktest values(1);
      commit;
  1. 登录EP01数据库
    执行select * from dblinktest@link1;.如果可以成功查询到数据,说明dblink建立成功。通过该外部链接可以在数据库EP01中成功查询到EP02中的对象
    image.png
    小结:
    若在步骤5中测试dblink创建是否成功时,执行
    select * from dblinktest@link1;时,报错[-2251]:DBLINK远程服务器获取对象失败。可以考虑从以下几个方面进行排查。
    1) 两个数据库的dmmal.ini中的内容是否完全相同。
    2) 如果两个达梦数据库安装在不同的计算机上,需要保证两台计算机之间通信正常。检查计算机的防火墙是否关闭,建议关闭防火墙。也可以使用ping命令来确定本地主机能否与另一台计算机成功交换数据包。

在linux系统上配置同构类型(达梦类型)的dblink

所有步骤与在windows系统上配置同构类型的dblink相同,此处不做赘述。

在windows系统上配置异构类型(ODBC)的dblink

在windows系统上配置异构类型的dblink的需要使用odbc数据源应用,以及要连接数据库的odbc驱动。
环境准备:

  1. Windows系统一般预装了odbc数据源应用,不需要再安装。
  2. 需要安装要连接的数据库的odbc驱动。
  3. 保证DM数据库和要连接的数据库服务正常运行。

配置到达梦数据库的dblink

系统规划:
image.png
配置异构类型的dblink,建立EP01到EP02的外部链接。

  1. 进入odbc数据源管理程序,点击添加按钮
    image.png
    选中DM8 ODBC DRIVER驱动程序,点击完成按钮
    image.png
    配置odbc数据源信息如下。配置一个名称为dmdblink的odbc数据源用于连接EP02数据库
    image.png
    配置完成后点击测试按钮,测试数据源,出现测试成功字样后说明数据源配置成功。
    image.png
  2. 数据源配置成功后,登录EP01数据库。执行:
	create or replace public link link2 connect 'ODBC' with "SYSDBA" identified by "SYSDBA" using 'dmdblink';
  1. 检测dblink是否创建成功
    登录EP02数据库(即配置的odbc数据源连接的数据库)。执行:
       create table test(c1 int);
       insert into test values(1);
       commit;

登录EP01数据库,使用dblink查询远程表,查询成功则dblink创建成功

       select * from test@link2; 

配置到ORACLE的dblink

系统规划:
image.png

  1. 进入odbc数据源管理程序,点击添加按钮
    image.png
    选择Oracle in OraDB12Home1,点击完成
    image.png
    配置ORACLE数据库的odbc数据源的信息如下:数据源名称为oracle11801,tns服务名为192.168.100.118/orcl。
    image.png
    点击Test Connection,出现Connection successful的弹窗,说明odbc数据源配置成功。
    image.png
  2. 配置好ORACLE的odbc数据源后,登录EP01达梦数据库,执行
      create  or replace link link3 connect 'ODBC' with "SYSTEM" identified by "oracle12c" using 'oracle11801';
  1. 测试dblink是否创建成功,执行select * from dual@link3;成功查询到数据说明到ORACLE的dblink创建成功。
    image.png

配置到mysql的dblink

系统规划:
image.png
创建达梦数据库EP01到mysql数据库的dblink

  1. 进入odbc数据源管理程序,点击添加按钮
    image.png
    选择mysql驱动 MYSQL ODBC 5.3 ANSI DRIVER,点击完成。
    image.png
    配置名为mysql的odbc数据源。mysql有多个库,默认连接的是mysql数据库。
    image.png
    配置完后点击TEST按钮,出现Connecttion Successfu的弹窗,说明odbc数据源配置成功。
    image.png
  2. 配置好mysql的odbc数据源后,登录EP01达梦数据库,执行
     create  or replace link link4 connect 'ODBC' with "root" identified by "hust4400" using 'mysql';
  1. 测试dblink是否创建成功.登录EP01,使用刚创建的dblink查询目标mysql数据库中的表,如果能查询成功说明dblink创建成功.
    image.png

配置到sqlserver的dblink

系统规划
image.png
创建达梦数据库EP01到sqlserver数据库中master库的dblink。

  1. 进入odbc数据源管理程序,点击添加按钮
    image.png
    选择SQL Server ODBC驱动,点击完成
    image.png
    按照提示命名odbc数据源,填入sqlserver数据库的服务器地址后点击下一步
    image.png
    点击下一步,选择要连接的mysql的数据库名,默认为master。
    image.png
    如无特殊要求,无需更改该页面的配置,直接点击完成,然后测试odbc数据源.
    image.png
    当出现测试成功后,说明odbc数据源配置成功
    image.png
  2. 配置好sqlserver的odbc数据源后,登录EP01达梦数据库,执行:
    create  or replace link link5 connect 'ODBC' with "sa" identified by "hust4400" using 'sqlserver';
    
    测试dblink是否创建成功
    登录EP01,使用刚创建的dblink查询目标sqlserver数据库中的表,如果能查询成功说明dblink创建成功
    

image.png

小结

根据经验在配置过程中,可能遇到的问题如下:

  1. 配置odbc数据源时,测试数据源时报错连接失败。
    解决方法:一些数据库库默认不允许localhost以外的ip地址远程访问数据库,需要对应修改数据库的配置。
  2. odbc数 源测试成功,创建dblink后,查询目标数据库对象失败。
    解决方法:检查创建dblink语句中数据源的名称,用户名/密码是否正确。 需要注意创建dblink时,仅检查语法的正确性,执行create dblink语句成功不能说明成功建立了到目的数据库的链接。

在windows系统上配置异构类型(oci)的dblink

除了通过odbc接口创建外部连接,针对ORACLE数据库,达梦还提供了通过ORACLE的oci接口创建外部链接的方式。
环境准备:
需要安装ORACLE的oci模块,可以单独安装,同时如果该机器上已经安装过ORACLE,则oci模块已经默认安装。
系统规划:
image.png

  1. 确认ORACLE的oci模块是否安装成功,在命令行工具中执行以下语句,如果能成功连接上ORACLE,则说明ORACLE的oci模块安装成功。
      sqlplus SYSTEM/oracle12c@192.168.100.118/orcl

  1. 登录EP01数据库,执行以下语句创建dblink
     create or replace link link6 connect 'ORACLE' with "SYSTEM" identified by "oracle12c" using 
    '192.168.100.118/orcl';

  1. 验证dblink是否创建成功,使用创建的dblink查询目的ORACLE数据库中的表,若能查询成功说明dblink创建成功。
    image.png

在linux系统上配置异构类型(ODBC)的dblink

环境准备:
在linux系统上配置异构类型的dblink,需要在linux系统上安装unixodbc和对应数据的odbc驱动。
一般linux系统上已经预装了unixodbc,但是推荐自己手动安装unixodbc,这样可以避免一些未知错误。本文中使用编译源码的方式安装unixodbc。

根据反馈,很多用户对于unixodbc的编译安装是不熟悉的,因此本文提供了使用源码在x86以及arm平台上安装unixodbc的命令:
image.png
image.png

配置到达梦数据的dblink

系统规划:
image.png
1.配置unixODBC的odbc.ini文件。本文的unixODBC安装目录为/usr/local/unixODBC,则odbc.ini文件的位置/usr/local/unixODBC/etc/odbc.ini。配置odbc.ini的内容如下:
image.png

2.检查odbc数据源是否配置成功。走到/usr/local/unixODBC/bin目录下,执行

 ./isql  dm SYSDBA SYSDBA 

其中dm为配置的odbc数据源的名称。如果使用unixodbc的isql工具成功连接目标数据库,并能成功查询到数据库中对象,说明odbc数据源配置成功。
image.png
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创建成功。
image.png

配置到ORACLE的dblink

系统规划:
image.png
1.在unixODBC的odbc.ini文件中配置好ORACLE的odbc数据源
image.png
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创建成功。
image.png

配置到mysql的dblink

系统规划:
image.png
建立达梦数据库EP01到mysql数据库的dblink连接。
1.在unixODBC中配置好mysql数据库的odbc数据源,配置odbc.ini文件
image.png
2.检查odbc数据源是否配置成功。到/usr/local/unixODBC/bin目录下执行 ./isql mysql root hust4400。若连接成功且能查到目标mysql数据库中的对象。说明odbc数据源配置成功。
image.png
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创建成功。
image.png

配置到sqlserver的dblink

系统规划:
image.png
创建达梦数据库EP01到sqlserver数据库中master库的dblink。
1.在unixODBC中配置好sqlserver数据库的odbc数据源。odbc.ini文件配置如下:
image.png

2.检查odbc数据源是否配置成功。到/usr/local/unixODBC/bin目录下执行 以下语句, 若连接成功且能查到目标sqlserver数据库中的对象。说明odbc数据源配置成功。

  ./isql  master sa hust4400

image.png

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创建成功。
image.png

小结

在linux系统上配置异构类型的dblink连接各个数据库的步骤基本相同,只有配置odbc数据源时配置文件的写法略有差异。
在实际应用中,可能遇到如下问题:

  1. 调用dblink查询目的数据库中的对象时,报错库文件加载失败。
    报错原因:达梦数据库服务没有找到unixodbc驱动或者目的数据库的odbc驱动。
    解决方法:先退出dmserver的服务,在启动dmserver的终端上设置如下环境变量,环境变量中第一个路径是unixodbc的静态库所在路径,第二个路径是目标数据库odbc驱动的静态库所在的路径。
    export LD_LIBRARY_PATH=/usr/local/unixODBC/lib:/usr/local/freetds/lib

  2. 在一些国产的操作系统平台上,如银河麒麟v10上,在unixodbc的isql工具中可以成功连接目的数据库,但是使用dblink查询目的数据库对象时报错。例如当目的数据库为sqlserver数据库时,使用dblink查询sqlserver中的表对象时报错:
    [[FreeTDS][SQL Server]Could not find stored procedure ‘master’.]
    报错原因:系统预装的unixodbc模块兼容问题。
    解决方法:不使用系统预装的unixodbc模块,自己编译unixodbc模块并调用。

  3. 配置DM7数据库到DM8数据库的异构外部链接,使用该外部链接导致DM7数据库服务崩溃。
    错误原因:配置DM8数据库的odbc数据源时使用的DM8的odbc驱动,驱动不兼容导致服务崩溃。
    解决方法:配置DM7与DM8之间的异构dblink时使用DM7的odbc驱动。

  4. 在一些国产的操作系统平台上,如银河麒麟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

系统规划:
image.png

  1. 配置环境变量以防达梦服务器调用不到相关的oci驱动。环境变量中的路径是ORACLE的oci接口依赖的静态库。
     export LD_LIBRARY_PATH=/usr/local/oraclelib
  1. 配置好环境变量后启动dmserver服务。
  2. 登录达梦数据库,执行
    create or replace link link6 connect 'ORACLE' with "SYSTEM" identified by "oracle12c" using '192.168.100.118/orcl';

  1. 验证dblink是否创建成功,使用创建的dblink查询目的ORACLE数据库中的表,若能查询成功说明dblink创建成功。

总结:在实际生产环境中,进行第四步操作时,可能报错加载库文件失败,这是因为没有进行步骤1、2,导致达梦服务器找不到ORACLE的oci驱动。

最后修改时间:2021-08-28 12:34:02
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
1人已赞赏
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论