达梦数据库-学习-34-DBLINK(Oracle到达梦,达梦到达梦)
目录一、环境信息二、介绍三、语法树1、定义2、参数列表四、Oracle到Dm测试OCI0、动态库下载地址1、解压Oracle客户端库包2、权限赋予3、环境变量配置4、环境变量生效5、库搜索路径配置6、更新库缓存7、重启达梦数据库8、Oracle端生成测试数据9、达梦创建DBLINK10、达梦通过DBLINK访问Oracle五、Dm到Dm测试DPI1、生成测试数据2、达梦创建DBLINK3、达梦通过DBLINK访问达梦六、DBLINK相关视图1、用途2、示例3、字段解释七、DBLINK相关参数八、报错分析1、[-2245]:DBLINK加载库文件失败1检查动态库链接2库搜索路径配置2、[-6033]:DBLINK连接丢失3、ORA-04043:对象不存在一、环境信息名称值CPU12th Gen Intel(R) Core(TM) i7-12700H操作系统CentOS Linux release 7.9.2009 (Core)内存4G逻辑核数4Oracle端IP192.168.139.10Dm端IP192.168.139.11Oracle版本Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - ProductionDM版本1 DM Database Server 64 V82 DB Version: 0x7000d3 03134284336-20250218-260144-201324 Msg Version: 325 Gsu level(5) cnt: 0二、介绍外部链接对象LINK是 DM 中的一种特殊的数据库实体对象它记录了远程数据库的连接和路径信息用于建立与远程数据的联系。通过多台数据库主库间的相互通讯用户可以透明地操作远程数据库的数据使应用程序看起来只有一个大型数据库。用户远程数据库中的数据请求都被自动转换为网络请求并在相应结点上实现相应的操作。用户可以建立一个数据库链接以说明一个对象在远程数据库中的访问路径。这个链接可以是公用的数据库中所有用户使用也可以是私有的只能被某个用户使用。用户可以通过外部链接对远程数据库的表进行查询和增删改操作以及本地调用远程的存储过程。三、语法树1、定义CREATE [OR REPLACE] [PUBLIC] LINK [IF NOT EXISTS] 外部链接名 CONNECT [连接库类型] WITH 登录名 IDENTIFIED BY 登录口令 USING 外部连接串 [OPTION 子句]; 连接库类型:: DPI | ODBC | DAMENG | ORACLE 外部链接串:: DPI 外部链接串 | ODBC 外部链接串 | DAMENG 外部链接串 | ORACLE 外部链接串 DPI 外部链接串:: IP 地址:端口号 | 服务名 ODBC 外部链接串:: ODBC 数据源 DSN DAMENG 外部链接串:: [连接类型;]服务器列表 连接类型:: PRIMARY FIRST | STANDBY FIRST | PRIMARY ONLY | STANDBY ONLY 服务器列表:: 服务器地址 | 服务器地址{,服务器地址} 服务器地址:: 实例 IP 地址/实例端口号 | MAL IP 地址/MAL 端口号 | 实例名 ORACLE 外部链接串:: tsn_name | description | IP 地址/服务名 description::(DESCRIPTION(ADDRESS_LIST(ADDRESS(PROTOCOLTCP)(HOSTIP 地 址)(PORT端口号)))(CONNECT_DATA(SERVICE_NAME服务名))) OPTION 子句:: (option 项{, option 项}) option 项:: LOCAL_CODE选项值 | CONVERT_MODE选项值 | BYTES_IN_CHAR选项值 | DB_TYPE选项值 | DATA_CHARSET选项值 | CASE_OPT选项值2、参数列表参数名描述外部链接名数据库链接的名称连接库类型目前只支持 DPI、ODBC、DAMENG 或 ORACLE默认为 DPI。DPI 和 DAMENG 用于连接达梦数据库ODBC 可以连接所有支持 ODBC 协议的数据库。ORACLE 用于连接 ORACLE 数据库登录名登录用户名称登录口令登录用户口令外部链接串通过 DPI 接口访问远程达梦数据库不需要进行额外配置外部链接串ODBC 数据源 DSN 需要用户手动配置外部链接串通过 MAL 系统访问远程达梦数据库需要配置 DMMAL.INI连接类型用来指定 DBLINK 将采用何种优先级别连接到服务器列表中的机器 共四种连接类型PRIMARY FIRST 为主机优先连接STANDBY FIRST 为备机优先连接PRIMARY ONLY 为只连主机STANDBY ONLY 为只连备机。缺省为 PRIMARY FIRST。连接 类型为可选项一旦指定了连接类型则必须指定服务器地址数大于等于 2服务器地址支持三种格式分别对应目标节点在 DMMAL.INI 中的配置项具体 如下1、实例 IP 地址/实例端口号 对应 mal_inst_host/mal_inst_port。2、MAL IP 地址/MAL 端口号 对应 mal_host/mal_port。3、实例名 对应 mal_inst_name 。ORACLE外部链接串可以使用配置的网络服务名tsn_name(网络服务名需要配置)或者连接描述符 description连接描述符是网络连接目标特殊格式的描述它包括网络协议、主库 IP 地址、端口号和服务名或者IP 地址/服务名option项目前所支持的选项与取值如下1、LOCAL_CODE接口DPI、OCI、JDBC等接口的字符集。若与服务器的字符集不一致则需要进行转换。可取值为UTF-8GBK或GB18030。2、CONVERT_MODE表示字符转换过程中对不完整字符的处理规则0表示截断不完整字符不报错1表示报错处理。3、BYTES_IN_CHAR整型数字表示一个字符由多少个字节组成。4、DB_TYPE设置目标数据库类型目前支持SQLSERVER、MYSQL、PI、ORACLE、DAMENG、OCEANBASE_ORACLE仅对ODBC类型的DBLINK有效。5、DATA_CHARSET设置接口返回给达梦服务器数据的实际字符集。取值为UTF-8GBK或GB18030。6、CASE_OPT字符串类型可取值UPPER、LOWER、MIX、SENSITIVE用于指定本地标识符与远程标识符比较时采取的规则UPPER将本地标识符转成大写再按本地大小写规则比较LOWER将本地标识符转成小写后再按本地大小写规则比较MIX不改变本地标识符大小写但忽略大小写进行比较SENSITIVE是默认选项不改变本地标识符大小写且按本地大小写规则进行比较。本地大小写比较规则由数据库初始化参数CASE_SENSITIVE控制建库后可以通过在视图V$DM_INI中查询INI参数GLOBAL_STR_CASE_SENSITIVE的值获取当前本地大小写比较规则情况该INI参数的取值含义与CASE_SENSITIVE相同。四、Oracle到Dm测试OCI0、动态库下载地址《Oracle Oci下载地址》1、解压Oracle客户端库包[rootlzl Pkg]# unzip instantclient-basic-linux.x64-19.25.0.0.0dbru.zip2、权限赋予[rootlzl Pkg]# chown -R dmdba:dinstall instantclient_19_25/3、环境变量配置[dmdbalzl ~]$ cat /home/dmdba/.bashrc |grep LD_LIBRARY_PATH export LD_LIBRARY_PATH$LD_LIBRARY_PATH:$DM_HOME/bin:/opt/Pkg/instantclient_19_254、环境变量生效[dmdbalzl ~]$ source /home/dmdba/.bashrc5、库搜索路径配置没有此文件需新建。[rootlzl instantclient_19_25]# cat /etc/ld.so.conf.d/oracle-instantclient.conf /opt/Pkg/instantclient_19_256、更新库缓存[rootlzl instantclient_19_25]# ldconfig7、重启达梦数据库[rootlzl ~]# systemctl restart DmServiceSun8、Oracle端生成测试数据SQL CREATE USER LZL IDENTIFIED BY qwer1234S; User created. SQL GRANT DBA TO LZL; Grant succeeded. SQL CREATE TABLE LZL.SUN (A INT); Table created. SQL INSERT INTO LZL.SUN VALUES(1); 1 row created. SQL COMMIT; Commit complete. SQL SELECT * FROM LZL.SUN; A ---------- 19、达梦创建DBLINK建议参考$ORACLE_HOME/network/admin/tnsnames.ora。记得用telnet测试端口和IP。SQL CREATE OR REPLACE LINK DbLinkOra2Dm CONNECT ORACLE WITH LZL IDENTIFIED BY qwer1234S USING (DESCRIPTION (ADDRESS_LIST (ADDRESS (PROTOCOL TCP)(HOST 192.168.139.10)(PORT 1521))) (CONNECT_DATA (SERVICE_NAME orcl) ) ); 操作已执行 已用时间: 12.306(毫秒). 执行号:401.10、达梦通过DBLINK访问OracleSQL SELECT * FROM LZL.SUNDbLinkOra2Dm; 行号 A ---------- - 1 1 已用时间: 376.445(毫秒). 执行号:501.五、Dm到Dm测试DPI1、生成测试数据CREATE USER LZL IDENTIFIED BY qwer1234S; GRANT DBA TO LZL; CREATE TABLE LZL.SUN (A INT); INSERT INTO LZL.SUN VALUES(1); COMMIT; SELECT * FROM LZL.SUN;2、达梦创建DBLINKCREATE OR REPLACE PUBLIC LINK DbLinkDm2Dm CONNECT DPI WITH LZL IDENTIFIED BY qwer1234S USING 192.168.139.11:5236;3、达梦通过DBLINK访问达梦SQL SELECT * FROM LZL.SUNDbLinkDm2Dm; 行号 A ---------- ----------- 1 1 已用时间: 441.852(毫秒). 执行号:603.六、DBLINK相关视图1、用途动态使用到的数据库链接信息视图。2、示例SQL SELECT * FROM V$DBLINK; 行号 LINK_CONN LINK_ID LINK_NAME SCH_ID OWNER_ID IS_PUBLIC LOGIN_NAME ---------- -------------------- ----------- ------------ ----------- ----------- --------- ---------- HOST_NAME PORT_NUM LOGGED_ON --------------------------------------------------------------------------------------------------------------------------------------------- ----------- --------- HETEROGENEOUS PROTOCOL IN_USE ------------- -------- ------ 1 188066144 201326592 DBLINKORA2DM 150994945 50331649 NO LZL (DESCRIPTION (ADDRESS_LIST (ADDRESS (PROTOCOL TCP)(HOST 192.168.139.10)(PORT 1521))) (CONNECT_DATA (SERVICE_NAME orcl) ) ) NULL YES YES TCP/IP NO 行号 LINK_CONN LINK_ID LINK_NAME SCH_ID OWNER_ID IS_PUBLIC LOGIN_NAME ---------- -------------------- ----------- ------------ ----------- ----------- --------- ---------- HOST_NAME PORT_NUM LOGGED_ON --------------------------------------------------------------------------------------------------------------------------------------------- ----------- --------- HETEROGENEOUS PROTOCOL IN_USE ------------- -------- ------ 2 188107576 201326593 DBLINKDM2DM 0 50331649 YES LZL 192.168.139.11:5236 NULL YES YES TCP/IP YES 已用时间: 4.316(毫秒). 执行号:604.3、字段解释字段描述LINK_CONNDBLINK 连接句柄LINK_IDDBLINK 的 IDLINK_NAMEDBLINK 的名称SCH_IDDBLINK 模式 IDOWNER_IDDBLINK 用户 IDIS_PUBLIC是否为 PUBLICLOGIN_NAME登录名HOST_NAMEIPPORT_NUM端口号LOGGED_ONDBLINK 当前是否已链接HETEROGENEOUSDBLINK 同步链接为 YES异步链接为 NOPROTOCOLDBLINK 通信协议IN_USE当前 DBLINK 句柄是否正在被使用七、DBLINK相关参数参数描述SUBQ_CVT_SPL_FLAG控制相关子查询的实现方式0不优化1使用 SPL2 方式实现相关子查询2DBLINK 相关子查询是否转换为函数由参数 ENABLE_DBLINK_TO_INV 取值决定4将多列 IN 转换为 EXISTS8将引用列转换为变量 VAR16用临时函数替代查询项中的相关查询表达式32存储过程、语句块中的多列表达式过滤条件含有非相关子查询时转换为连接支持使用上述有效值的组合值如 5 表示同时进行 1 和 4 的优化ENABLE_DBLINK_TO_INVDBLINK 相关子查询是否转换为函数。0不转换1转换LINK_CONN_KEEP_TIMEDBLINK空闲连接缓存存在时间单位分钟为0时表示不缓存DBLINK连接取值范围0~2147483647。建议在频繁使用有限的几个DBLINK的时候开启该参数并设置较长时间以便重用连接在使用的大部分 是不同的DBLINK时单个DBLINK被重用的几率很小此时可以考虑不设置该参数MAX_LINK_SESSIONS用于设置DBLINK连接会话数的上限值取值范围1~150000。当DBLINK连接会话数达到该上限值时服务器将释放空闲的DBLINK连接再新建连接会话若无空闲连接则拒绝建立新连接DBLINK_OPT_FLAG控制对 DBLINK 的优化。0不进行优化1允许 DBLINK 整体优化采用原始方式2DBLINK 局部优化采用老方式4DBLINK 局部优化采用新方式8异构数据库情况下进行兼容性检查根据表达式类型检查是否可以在异构数据库执行如果不支持则不对此表达式进行进行收集16采用新方式局部优化时考虑视图、派生表、子查询、查询表达式是否可以整体优化32采用新方式局部优化时支持外连接 WHERE 过滤条件的优化64支持 MEMBER_ACCESS 转换为变量的优化方式128增删改支持新方式优化256计划生成阶段增加 DBLINK 优化支持连接条件转换为变量的优化方式并对 DBLINK 存在过滤条件的场景进行优化512支持物化视图明细表是基于 DM 到异构数据库 DBLINK 的远程表1024若查询包含 DBLINK则将 LIKE 表达式的数据类型强制转为 VARCHAR(4000)防止查询发给ORACLE 后字符串超长报错2048DBLINK 根据远端的统计信息进行代价计算。支持使用上述有效值的组合值如 61 表示同时进行 1、4、8、16、32 的优化。取值 16 和 32 只有和取值4 组合才有意义DBLINK_LOB_LEN使用 DBLINK 访问大字段类型时大字段的长度限制。单位 KB取值范围 4~1024DBLINK_USER_AS_SCHEMA是否将当前用户名作为缺省模式名或库名。0否1是。目前仅对 ODBC 类型的 DBLINK 有效DBLINK_HEALTH_CHECK指定重用缓存中的 DBLINK 连接时是否检查连接有效性。0不检查1通过接口进行简单检查2通 过执行查询语句进行严格检查ELOG_REPORT_LINK_SQL是否记录 DBLINK 执行的 SQL 到服务器日志文件中。0不记录1记录CODE_CONVERSE_MODEDBLINK 对不完整字符的处理。0丢弃1报错八、报错分析1、[-2245]:DBLINK加载库文件失败1检查动态库链接[dmdbalzl instantclient_19_25]$ ldd libclntsh.so linux-vdso.so.1 (0x00007ffff2114000) libnnz19.so (0x00007ff992ea7000) libdl.so.2 /lib64/libdl.so.2 (0x00007ff992ca3000) libm.so.6 /lib64/libm.so.6 (0x00007ff9929a1000) libpthread.so.0 /lib64/libpthread.so.0 (0x00007ff992785000) libnsl.so.1 /lib64/libnsl.so.1 (0x00007ff99256b000) librt.so.1 /lib64/librt.so.1 (0x00007ff992363000) libaio.so.1 /lib64/libaio.so.1 (0x00007ff992161000) libresolv.so.2 /lib64/libresolv.so.2 (0x00007ff991f47000) libc.so.6 /lib64/libc.so.6 (0x00007ff991b79000) /lib64/ld-linux-x86-64.so.2 (0x00007ff997763000) libclntshcore.so.19.1 (0x00007ff9915d5000)看一下是否有not found的如果有需配置环境变量LD_LIBRARY_PATH或者使用ln软连接。2库搜索路径配置可以参考上面Oracle到Dm测试步骤。2、[-6033]:DBLINK连接丢失检查用户名和密码、IP和端口、服务名是否配置正确。最近遇到一个连接oracle rac虚ip的telnet也是通的就一直报这个错后续有思路了记录一下。3、ORA-04043:对象不存在Oracle中相同用户和服务名的情况下可以正常查询查询的表名和模式名需要和DBA_TABLES、dba_synonyms中记录的一致或者在结尾加OPTION (CASE_OPTUPPER)选项不一定UPPER根据需求选择。