1. 外部链接的本质与应用场景第一次接触达梦数据库外部链接时我把它想象成数据库之间的电话线。这条特殊的通道能让本地数据库直接访问远程数据库的表数据就像在本地操作一样自然。在实际项目中这种技术特别适合需要跨数据库联查的业务场景比如总部与分支机构的数据汇总、多系统数据整合等。达梦支持三种常见的外部链接模式DM到DM、DM到Oracle、DM到ODBC。今天我们要重点拆解的是同构数据库DM到DM的配置方案。相比异构数据库连接同构配置更简单稳定也是企业级应用中最常见的需求。记得去年有个金融客户的项目需要实时同步十多个营业网点的交易数据。如果走传统的数据同步方案不仅延迟高还容易丢数据。后来我们采用外部链接方案总部系统能直接查询各网点的实时数据报表生成效率提升了8倍。这个案例让我深刻体会到用好外部链接能大幅简化分布式架构的数据访问复杂度。2. 环境准备的关键细节配置前的环境准备就像盖房子打地基这一步没做好后面全是坑。根据我的踩坑经验需要特别注意以下几点首先准备两个独立的DM数据库实例且实例名必须不同。去年我在某政务云项目中就遇到过坑两个环境的DBA各自安装了DM但都用了默认的DMSERVER实例名结果外部链接死活配不通。后来修改实例名后立即解决所以切记检查dm.ini中的INSTANCE_NAME参数。其次网络连通性是隐形杀手。曾有个生产环境案例两边ping通但链接失败最后发现是防火墙拦截了MAL端口。建议先用telnet测试端口连通性telnet 目标IP MAL端口这是我的测试环境配置供参考节点类型主机OS实例名IP地址数据库端口MAL端口源端CentOS 7DMSERVER1192.168.1.10152365336目的端Kylin V10DMSERVER2192.168.1.10252365337特别提醒Windows用户如果遇到服务重启失败试试用管理员身份运行CMD。我有次在Windows Server 2019上就遇到权限问题折腾了半天才发现是UAC限制。3. 配置文件深度配置3.1 dm.ini关键调整dm.ini是达梦的核心配置文件我们需要修改一个关键参数MAL_INI 1 # 启用MAL通信系统这个参数相当于外部链接的总开关。有次我在客户现场遇到个诡异情况配置完全正确但链接不生效最后发现是修改dm.ini后忘记保存。建议用vim的:wq!强制保存Windows用户注意关闭文件只读属性。3.2 dmmal.ini配置详解dmmal.ini需要双端同步配置内容保持一致。这个文件通常不存在需要手动创建。分享一个我常用的模板[MAL_INST1] MAL_INST_NAME DMSERVER1 MAL_HOST 192.168.1.101 MAL_PORT 5336 MAL_INST_HOST 192.168.1.101 MAL_INST_PORT 5236 [MAL_INST2] MAL_INST_NAME DMSERVER2 MAL_HOST 192.168.1.102 MAL_PORT 5337 MAL_INST_HOST 192.168.1.102 MAL_INST_PORT 5236这里有几个血泪教训MAL_PORT不要用默认的5336容易和数据库端口冲突MAL_INST_NAME必须与dm.ini中的INSTANCE_NAME完全一致生产环境建议配置MAL_INST_HOST和MAL_INST_PORT去年某证券系统升级时就因为没有配置MAL_INST_PORT导致业务高峰期链接频繁断开。后来补充配置后稳定性大幅提升。4. 服务重启与链接创建4.1 服务重启操作配置生效需要重启数据库服务不同平台的命令差异很大Linux系统systemctl stop DmServiceDMSERVER1 systemctl start DmServiceDMSERVER1Windows系统net stop DmServiceDMSERVER net start DmServiceDMSERVER重启后务必检查日志我习惯用这个命令监控启动状态tail -f /dm8/data/DAMENG/dm_DMSERVER1_202306.log4.2 创建外部链接重启成功后就可以在源端创建链接了。达梦提供两种创建语法我推荐第一种IP端口方式CREATE PUBLIC LINK LINK_DM_DM1 CONNECT dameng WITH SYSDBA IDENTIFIED BY SYSDBA USING 192.168.1.102/5337;第二种实例名方式需要确保dmmal.ini配置正确CREATE PUBLIC LINK LINK_DM_DM2 CONNECT WITH SYSDBA IDENTIFIED BY SYSDBA USING DMSERVER2;重要提示创建链接后如果没有开启自动提交记得手动执行COMMIT我在培训时发现这是新手最常犯的错误。5. 全链路测试方案5.1 基础功能测试先来个简单的链路测试-- 在目的端创建测试表 CREATE TABLE TEST_LINK(ID INT, NAME VARCHAR(20)); INSERT INTO TEST_LINK VALUES(1,测试数据); -- 在源端查询 SELECT * FROM TEST_LINKLINK_DM_DM1;5.2 事务一致性测试验证DML操作的事务特性BEGIN INSERT INTO TEST_LINKLINK_DM_DM1 VALUES(2,事务测试); UPDATE TEST_LINKLINK_DM_DM1 SET NAME修改数据 WHERE ID1; DELETE FROM TEST_LINKLINK_DM_DM1 WHERE ID1; COMMIT; END;5.3 性能压力测试模拟高并发场景建议在测试环境执行-- 创建压测表 CREATE TABLE STRESS_TEST(ID INT PRIMARY KEY, VAL VARCHAR(200)); -- 使用存储过程模拟并发 CREATE OR REPLACE PROCEDURE TEST_LINK_STRESS AS BEGIN FOR I IN 1..1000 LOOP EXECUTE IMMEDIATE INSERT INTO STRESS_TESTLINK_DM_DM1 VALUES(||I||,DBMS_RANDOM.STRING(A,200)); IF MOD(I,100)0 THEN COMMIT; END IF; END LOOP; COMMIT; END;6. 常见问题排查指南根据我处理过的数十个案例整理出这些典型问题的解决方法问题1链接创建成功但查询报错网络通信异常检查防火墙firewall-cmd --list-ports验证网络延迟ping -c 5 目标IP测试端口连通性nc -zv 目标IP MAL端口问题2服务启动失败报MAL_INST_NAME重复检查dm.ini和dmmal.ini的实例名一致性确认两个节点的INSTANCE_NAME不同查看日志获取详细错误信息问题3执行DML操作后数据未更新检查是否漏了COMMIT确认目的端用户有写权限查看V$TRANSACTION视图是否有未提交事务问题4高并发时链接不稳定调整dm.ini中的MAL相关参数增加MAL_BUFFER_SIZE考虑使用连接池管理链接最后分享个诊断脚本可以快速检查链接状态SELECT * FROM V$DBLINK; SELECT * FROM DBA_DB_LINKS;7. 性能优化建议经过多个项目的优化实践我总结出这些提升外部链接性能的方案连接池配置对于频繁使用的链接建议配置连接池减少建立连接的开销ALTER LINK LINK_DM_DM1 SET CONNECTION_POOLON;批量操作优化大数据量操作时使用批量提交BEGIN FOR I IN 1..10000 LOOP INSERT INTO REMOTE_TABLELINK1 VALUES(...); IF MOD(I,500)0 THEN COMMIT; END IF; END LOOP; COMMIT; END;网络参数调优根据网络质量调整这些dm.ini参数MAL_BUFFER_SIZE 1024 # 默认256KB MAL_COMPRESS_LEVEL 1 # 启用压缩查询优化技巧避免在WHERE条件中使用函数尽量减少返回的数据量复杂查询可以考虑先在远程执行再返回结果曾经有个物流系统通过优化链接查询将日均500万条数据的处理时间从4小时降到25分钟。关键优化点就是改用批量操作和增加适当的查询条件。