一、外部链接基础认知
1.1 外部链接概念解析
外部链接(External Link)是达梦数据库DM8提供的跨数据库数据访问机制,通过外部链接可以像访问本地表一样访问远端数据库中的表或视图对象。在分布式数据处理、数据迁移、报表整合等场景中,外部链接承担着关键的桥梁作用。
外部链接的核心思想是建立本地DM8实例与远端数据库之间的会话通道,将SQL请求转发至远端执行并接收返回结果,对应用层透明。
1.2 外部链接典型应用场景
外部链接在企业级数据架构中有广泛应用:
- 异构数据源整合:统一访问Oracle、MySQL、PostgreSQL等不同数据库
- 数据仓库ETL:作为数据抽取的便捷通道
- 跨业务系统查询:实现多业务系统的实时数据关联
- 数据迁移验证:迁移过程中双向数据对比校验
- 报表系统集成:在不复制数据的前提下完成报表查询
1.3 外部链接支持的数据源类型
DM8支持的外部链接目标数据源包括:
| 数据源类型 | 连接库类型标识 | 说明 |
| --- | --- | --- |
| DM | DM | 达梦数据库之间互访 |
| Oracle | ORACLE | 通过OCI或DPI连接Oracle |
| MySQL | MYSQL | 通过MySQL驱动连接 |
| PostgreSQL | POSTGRES | 通过PostgreSQL驱动连接 |
| ODBC | ODBC | 通过ODBC驱动通用连接 |
二、外部链接创建与配置
2.1 外部链接创建语法详解
DM8创建外部链接使用CREATE LINK语句,完整语法如下:
CREATE [OR REPLACE] [PUBLIC] [DB]LINK <外部链接名>
CONNECT ['<连接库类型>']
WITH <登录用户名> IDENTIFIED BY <登录口令>
USING '<连接串>';
参数说明:
- OR REPLACE:若同名外部链接已存在则替换
- PUBLIC:创建公共外部链接,所有用户可使用
- DB:表示数据库链接
- 连接库类型:DM、ORACLE、MYSQL、POSTGRES、ODBC等
- 连接串:远端数据库的连接信息,格式因数据源类型而异
外部链接创建的整体流程如下:
2.2 创建DM到DM外部链接
达梦数据库之间的外部链接是最常用的一种,连接串采用dm://协议格式。
-- 创建外部链接,连接远端DM数据库
CREATE OR REPLACE LINK LINK_DM_REMOTE
CONNECT 'DM'
WITH SYSDBA IDENTIFIED BY "SYSDBA001"
USING 'dm://192.168.1.100:5236';
参数说明:
- LINK_DM_REMOTE:外部链接名称
- 'DM':连接目标为达梦数据库
- SYSDBA / "SYSDBA001":远端登录用户名与口令
- dm://192.168.1.100:5236:远端数据库IP与端口
若需要使用SSL加密连接,可在连接串中追加SSL参数:
CREATE OR REPLACE LINK LINK_DM_SSL
CONNECT 'DM'
WITH SYSDBA IDENTIFIED BY "SYSDBA001"
USING 'dm://192.168.1.100:5236?SSL=true&SSL_AUTH=true';
2.3 创建DM到Oracle外部链接
访问Oracle数据库需要Oracle客户端环境支持,建议配置OCI驱动。
-- 创建到Oracle的外部链接
CREATE OR REPLACE LINK LINK_ORACLE_REMOTE
CONNECT 'ORACLE'
WITH SCOTT IDENTIFIED BY "TIGER123"
USING '192.168.1.200:1521/orcl';
注意事项:
- 需在DM服务器上安装Oracle Instant Client
- 配置LD_LIBRARY_PATH环境变量指向OCI库目录
- 连接串格式为IP:PORT/SERVICE_NAME
- 用户名口令需与Oracle数据库账户匹配
2.4 创建DM到MySQL外部链接
连接MySQL需配置MySQL客户端驱动库:
-- 创建到MySQL的外部链接
CREATE OR REPLACE LINK LINK_MYSQL_REMOTE
CONNECT 'MYSQL'
WITH root IDENTIFIED BY "Root@12345"
USING '192.168.1.300:3306/testdb';
配置要点:
- 确保DM服务器安装MySQL客户端库libmysqlclient
- 连接串格式为IP:PORT/数据库名
- MySQL账户需具备目标表访问权限
三、外部链接使用实践
3.1 通过外部链接查询远端数据
外部链接查询使用@符号引用远端对象,基本语法为:表名@外部链接名。
-- 查询远端DM数据库中的员工表
SELECT EMP_ID, EMP_NAME, DEPT_NO
FROM EMP@LINK_DM_REMOTE
WHERE DEPT_NO = 10;
多表关联查询:
-- 本地表与远端表关联查询
SELECT L.ORD_ID, L.ORD_DATE, R.CUST_NAME, R.CUST_TEL
FROM ORDERS L
INNER JOIN CUSTOMER@LINK_ORACLE_REMOTE R
ON L.CUST_ID = R.CUST_ID
WHERE L.ORD_DATE >= '2024-01-01';
查询执行流程如下:
3.2 通过外部链接执行DML操作
外部链接支持INSERT、UPDATE、DELETE等DML操作,但需远端用户具备相应权限。
-- 通过外部链接插入数据到远端表
INSERT INTO EMP@LINK_DM_REMOTE (EMP_ID, EMP_NAME, DEPT_NO, SALARY)
VALUES (1001, 'ZHANGSAN', 10, 8500);
-- 通过外部链接更新远端数据
UPDATE EMP@LINK_DM_REMOTE
SET SALARY = SALARY * 1.1
WHERE DEPT_NO = 10;
-- 通过外部链接删除远端数据
DELETE FROM EMP@LINK_DM_REMOTE
WHERE EMP_ID = 1001;
事务控制要点:
- 外部链接DML操作默认纳入本地事务管理
- 通过COMMIT或ROLLBACK统一提交或回滚
- 远端数据库的事务隔离级别由本地事务协调
- 跨库事务需开启分布式事务支持
3.3 外部链接在存储过程中的应用
在存储过程中使用外部链接可实现定时数据同步、跨库业务处理等复杂逻辑。
-- 创建数据同步存储过程
CREATE OR REPLACE PROCEDURE SP_SYNC_EMP_DATA AS
V_COUNT INT;
BEGIN
-- 统计远端待同步记录数
SELECT COUNT(*) INTO V_COUNT FROM EMP@LINK_DM_REMOTE;
-- 删除本地历史数据
DELETE FROM EMP_LOCAL WHERE SYNC_FLAG = 1;
-- 从远端同步数据
INSERT INTO EMP_LOCAL
SELECT EMP_ID, EMP_NAME, DEPT_NO, SALARY, 1
FROM EMP@LINK_DM_REMOTE;
-- 输出同步结果
PRINT '同步完成,记录数:' || V_COUNT;
COMMIT;
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
PRINT '同步失败:' || SQLERRM;
END;
/
该存储过程通过外部链接实现员工数据的跨库同步,具备异常回滚保护机制,适合作为定时任务定期执行。
四、外部链接管理与维护
4.1 查看外部链接信息
DM8提供系统视图查看已创建的外部链接:
-- 查询当前用户的外部链接
SELECT * FROM USER_DB_LINKS;
-- 查询所有外部链接(需DBA权限)
SELECT OWNER, DB_LINK, USERNAME, HOST
FROM ALL_DB_LINKS
ORDER BY OWNER, DB_LINK;
字段说明:
| 字段 | 说明 |
| --- | --- |
| OWNER | 外部链接所有者 |
| DB_LINK | 外部链接名称 |
| USERNAME | 远端登录用户名 |
| HOST | 远端连接串 |
| CREATED | 创建时间 |
4.2 修改外部链接
DM8通过CREATE OR REPLACE方式更新外部链接属性:
-- 修改外部链接口令与连接串
CREATE OR REPLACE LINK LINK_DM_REMOTE
CONNECT 'DM'
WITH SYSDBA IDENTIFIED BY "NEWSYSDBA2024"
USING 'dm://192.168.1.100:5236#DMSERVER';
修改流程如下:
4.3 删除外部链接
使用DROP LINK语句删除不再使用的外部链接:
-- 删除指定外部链接
DROP LINK LINK_DM_REMOTE;
-- 删除PUBLIC外部链接
DROP PUBLIC LINK LINK_PUBLIC_REMOTE;
删除注意事项:
- 删除前确认无依赖对象(视图、存储过程、同义词等)
- 删除操作不会影响远端数据库中的数据
- 谨慎删除PUBLIC外部链接,可能影响其他用户
- 建议先备份链接配置再执行删除
五、外部链接性能优化与故障排查
5.1 性能优化策略
外部链接跨网络访问,性能优化至关重要。建议从以下几个维度入手:
- 减少远端数据传输量,将过滤条件尽量下推至远端执行
-- 不推荐:将远端全表拉取到本地过滤
SELECT * FROM BIG_TABLE@LINK_DM_REMOTE WHERE ID = 100;
-- 推荐:只查询必要列,过滤条件下推至远端
SELECT COL1, COL2 FROM BIG_TABLE@LINK_DM_REMOTE WHERE ID = 100;
- 合理使用驱动表与连接方式
-- 使用HINT指定驱动表与连接方式
SELECT /*+ USE_NL(L R) */ L.ID, R.NAME
FROM LOCAL_TBL L, REMOTE_TBL@LINK_DM_REMOTE R
WHERE L.RID = R.ID;
- 批量操作优化
-- 批量插入使用APPEND提示提升性能
INSERT /*+ APPEND */ INTO LOCAL_TBL
SELECT * FROM REMOTE_TBL@LINK_DM_REMOTE;
- 网络层优化建议
- 启用连接池保持长连接,避免频繁建立会话
- 调整TCP缓冲区大小,提升网络传输效率
- 部署DM数据库网关减少网络跳转
5.2 常见故障排查
外部链接使用过程中可能遇到的典型问题:
| 错误码 | 错误信息 | 排查方向 |
| --- | --- | --- |
| ORA-12154 | TNS无法解析服务名 | 检查Oracle客户端配置 |
| -70001 | 网络通信失败 | 检查网络连通性与端口 |
| -70002 | 用户名或口令错误 | 核对远端账户凭据 |
| -70010 | 远端对象不存在 | 确认远端表名与所属用户 |
| -70045 | 驱动库加载失败 | 检查客户端驱动安装 |
故障排查流程如下:
5.3 最佳实践总结
基于实际项目经验,外部链接使用建议如下:
- 命名规范:统一采用LINK_前缀加数据源加用途的命名规则,便于识别管理
- 权限最小化:远端账户仅授予必要查询权限,避免越权风险
- 监控告警:建立外部链接可用性监控,及时发现网络或认证异常
- 版本管理:使用CREATE OR REPLACE保持配置可追溯,便于回滚
- 测试验证:上线前进行压力测试与故障演练,验证容灾能力
- 文档维护:建立外部链接资产清单,记录用途、责任人与变更历史
外部链接作为DM8跨库数据访问的核心能力,掌握其配置、使用、优化方法对构建高效稳定的分布式数据架构至关重要。通过合理的架构设计与性能优化,外部链接能够在异构数据整合场景中发挥最大价值。