先说结论:达梦和Oracle的关系,不是“山寨”和“正版”的关系,而是在特定历史路径下走出的“形似而神不似”的两套数据库系统。这篇文章我想把两件事讲透:一是达梦为什么长得像Oracle,二是它们底层架构到底差在哪。这份内容主要面向正在做国产化迁移的DBA、需要评估达梦的架构师,以及那些被领导安排“把Oracle换成达梦”但还没摸清深浅的开发同学。我会结合自己参与过的迁移项目,把架构对比和踩坑记录都摊开来讲。
1. 达梦与 Oracle 的关系:同源而生,分道而行
1.1 达梦的出身:从高校研究室走出的关系型数据库
搞懂达梦和Oracle的关系,得先花两分钟看看达梦的来路。达梦的源头可以追溯到某高校的数据库研究团队,从上世纪八十年代末开始做关系型数据库原型,后来逐步产品化,形成今天的达梦数据库。这条路子和Oracle有本质区别:Oracle是纯商业公司在市场竞争中打磨出来的,达梦则是从学术研究转向工程化、产品化的国产数据库。
这段历史决定了达梦的一个核心特性:它不是从零另起炉灶、完全自创一套语法体系,而是在早期研发过程中大量参考了主流数据库的设计。当年国内数据库市场,Oracle的占有率极高,大量核心业务系统跑在Oracle上。如果达梦发布出来,SQL语法和操作习惯跟Oracle完全不一样,那几乎没有企业敢用——开发人员要重学一套技能,存量SQL要全部改写,这种迁移成本谁都承受不起。所以达梦很务实地选择了“兼容Oracle语法”的路线。
1.2 兼容不是抄袭,而是工程理性的选择
很多不熟悉数据库行业的人,看到达梦支持dual表、支持ROWNUM、支持CONNECT BY,第一反应是“这不就是抄Oracle吗”。这个判断我不太认同。数据库的SQL语法是有国际标准的,Oracle自己也有很多方言特色。达梦做的是在关系模型和SQL标准的基础上,把Oracle生态里那些高频使用的语法和能力尽量兼容过来,同时保留自己的内核实现。类比来说,这就像一台国产手机兼容了某主流手机的充电接口和数据协议——你可以直接用原来的充电线,但手机内部的芯片设计、电路排布完全是自己的东西。
这个策略的受益者,恰恰是正在做国产化替换的企业。一个跑了十年的Oracle系统,里面可能有上千条存储过程、几百个包、无数条历史SQL,如果数据库换掉之后这些全要重写,项目周期和风险都是灾难级的。达梦把兼容层做好,意味着迁移时大部分SQL不用动,开发人员上手成本极低。但这里也要说句公道话:兼容层能解决大部分常规场景,那些用了Oracle深度特性的代码,比如复杂的层次查询、特定格式的TO_CHAR模板、某些高级分析函数,仍然是迁移的重灾区。这个后文会有详细拆解。
为了更直观地建立对应关系,我习惯用一张表来映射Oracle和达梦之间的概念对应:
| 概念 | Oracle | 达梦 |
|---|---|---|
| 实例/数据库 | 实例(SGA+进程)与数据库(物理文件)分离 | 实例与数据库不分家,一套进程管理一个库 |
| 控制文件 | control file,记录数据库结构信息 | 达梦有类似元数据管理机制,初始化时生成 |
| 表空间 | 逻辑存储单位,下设段、区、块 | 同样使用表空间管理逻辑存储,概念高度相似 |
| 数据文件 | .dbf 文件 | .dbf 文件(扩展名相同,内部格式不同) |
| 重做日志 | redo log,配合归档日志 | 达梦也有redo日志,支持归档模式 |
| 初始化参数 | SPFILE/PFILE(pfile文本,spfile二进制) | dm.ini 文本配置文件 |
| 系统表 | 数据字典(SYS用户下) | 达梦在SYSDBA、SYS等模式维护字典和动态视图 |
| 内存结构 | SGA(共享池、缓冲区等)+ PGA | 缓冲区、日志缓冲区等,各自对应一系列INI参数 |
这张表能帮你少走弯路:迁移时你把Oracle的表空间、数据文件、控制文件这些概念套到达梦上,大部分情况是成立的,但细节层面的实现和参数管控方式有明显差异。接下来进入正题,看看架构层面的真正分水岭在哪里。
2. 核心架构差异:从进程模型到存储引擎的分水岭
2.1 进程与线程模型:Oracle的“多进程军团”对阵达梦的“多线程一体化”
如果你在Oracle环境里ps -ef | grep oracle,会看到一长串进程,比如pmon、smon、dbwr、lgwr、ckpt,还有一堆oracle开头的专用进程。这是Oracle经典的多进程架构:每个后台进程各司其职,某个进程出了问题不会拖垮整个数据库。DBA排查问题时也习惯先看进程状态,比如pmon挂了要重启实例。
达梦走的是另一条路:核心是线程模型,一个进程内部管理着多个线程,分别承担不同的职责。你用操作系统命令去看,达梦相关的进程数量比Oracle少很多,但每个进程内部是“多线程协作”。这种设计的好处是省资源、上下文切换开销小,在同等硬件条件下可以跑出不错的性能;坏处是排障思路不一样——你没法像Oracle那样按进程名去定位问题,更多时候要深入达梦的动态视图和日志去看线程级的状态。
实际迁移时这个差异影响很大。我见过有团队从Oracle转到达梦后,第一周天天纠结“为什么看不到那么多进程,是不是数据库没起来”,其实数据库跑得好好的。反过来,遇到达梦性能问题时,也别指望用Oracle那套“查v$session,杀会话”的流程完全照搬,达梦的会话管理和等待事件视图有自己的逻辑,需要重新适应。
2.2 内存架构:SGA/PGA 与达梦缓冲区的“大同小异”
Oracle的内存管理,核心是SGA(系统全局区)和PGA(程序全局区)。SGA里装着共享池、数据缓冲区、日志缓冲区等组件,PGA则给每个会话分配私有内存,存放排序、哈希等操作的工作区。Oracle的自动内存管理(AMM/ASMM)会根据负载动态调整这些组件的大小,DBA日常调优很大一部分工作就是跟这些内存参数较劲。
达梦的内存结构从大框架上看也是“缓冲区+私有区”的思路,但细分方式和参数命名完全不同。达梦的核心内存参数包括数据缓冲区大小、日志缓冲区大小、排序区大小等,集中配置在一个叫dm.ini的文本配置文件里。跟Oracle一样,达梦也支持很多参数在线修改(ALTER SYSTEM SET ...),但有些核心参数改完必须重启实例才生效,这一点跟Oracle的scope=spfile很相似。
参数差异上,我最想提醒的一点是:不要用Oracle的惯性直接去套达梦。比如在Oracle里你习惯了看SGA_TARGET和PGA_AGGREGATE_TARGET,到达梦后应该去查达梦手册里对应的BUFFER系列参数和SORT_BUF_SIZE等;调优思路依然是“缓冲区命中率低就加大缓冲区,排序频繁就加大排序区”,但具体数值怎么定、参数怎么生效,要按达梦的规则来。我们曾经为了复现一个客户的性能问题,把Oracle的AWR报告参数直接往达梦上对应,结果发现很多参数在达梦里根本没有对应项,只能根据达梦的动态视图重新建模分析。
2.3 存储与表类型:堆表打底,列存出击
Oracle的表默认是堆表,数据按插入顺序存在数据块里,配合B树索引提供访问路径。高级场景下Oracle还有索引组织表、聚簇表、分区表、物化视图等一套复杂玩法。
达梦同样支持堆表、分区表、索引组织表等,但在分析型场景上有一个非常有特点的能力——HUGE表,也就是列存储表。列存表的原理是同一列的数据连续存放,做聚合、统计分析时只需要读取涉及的列,不用像行存表那样整行整行扫描,因此分析类查询性能提升非常明显,同时压缩比也很可观。这对国产化迁移其实是加分项:很多企业的系统是混合负载,既有OLTP交易,又有报表分析,过去在Oracle上可能要搭一套独立的数据仓库或靠物化视图来扛,到达梦之后可以直接用HUGE表把分析类业务接住。
不过列存表不是万能的,它的典型约束是适合大批量导入和只读查询,不适合频繁的细粒度更新。我建议架构师在达梦上做表设计时,把表按负载类型分开:交易型表用普通堆表,分析型大表考虑HUGE表,别一上来把所有表都建成列存,否则后续做高频更新时会踩到性能泥潭。这个是我们在一次业务建模时得到的教训:当时把一张日增数十万行、同时有大量单行更新的流水表设成了列存,结果TPS报表惨不忍睹,后来拆成“热数据行存+冷数据归档到列存表”才解决问题。
2.4 初始化方式与配置管理:dminit 与 dm.ini
Oracle创建数据库要走DBCA或者手动执行一大堆SQL脚本,初始化参数写在PFILE或SPFILE里。达梦这边是用一个叫dminit的工具来初始化实例,核心的库参数——比如页大小(PAGE_SIZE)、字符集(CHARSET)、大小写敏感(CASE_SENSITIVE)——在初始化时就要定死,之后不能轻易修改。
这一条极重要,我在迁移项目里反复强调:达梦的页大小直接决定单行数据的最大长度,初始化时如果选了8K页,后面想存超长字符串就会报错,而页大小本身不允许在线修改。Oracle里你VARCHAR2的长度限制主要在12c之后扩展到32767字节,但达梦的VARCHAR2实际能存多长,跟页大小强相关。所以做达梦部署规划时,必须提前评估业务里有没有大字段、单行数据会不会很长,把页大小、字符集这些地基一次打对,否则上线后只能重建实例,代价非常大。
字符集方面同样要提前定:达梦支持GBK、UTF-8等主流字符集,一旦初始化选错,迁移过来后中文可能出现乱码或者排序异常,这种问题修起来比重建实例还麻烦。我的经验是,新项目直接上UTF-8,老系统迁移则要看源库字符集和数据的实际情况,选一个能无损承载的方案,别贪图省事默认了事。
3. SQL 与兼容性:最熟悉的陌生人
3.1 兼容层做到了什么程度:日常开发“无痛平替”
达梦对Oracle SQL的兼容,覆盖了绝大部分开发日常用到的能力。下面这些都是可以直接搬过去用的:
- 查询辅助:
DUAL表、ROWNUM、ROWID、SYSDATE、NVL、DECODE、TO_CHAR/TO_DATE等常用函数与写法。 - 层次查询:
CONNECT BY PRIOR搭配START WITH的树形查询语法。 - 分析函数:
ROW_NUMBER()、RANK()、LAG()、LEAD()、SUM() OVER(PARTITION BY ...)等窗口函数。 - 外连接写法:Oracle老式的
(+)运算符,以及标准的LEFT/RIGHT/FULL OUTER JOIN,两种写法在达梦里都可用。 - PL/SQL块:声明变量、游标、循环、异常处理、自治事务(部分场景)等结构大体兼容。
如果一个团队平时写SQL比较规矩,没有用到特别冷门的Oracle特性,那迁移时SQL层面基本是无感的。我们在一个大型迁移项目里,几千条存量SQL经过自动化工具扫描后,需要人工改写的比例大约只有7%上下,而且多数是函数格式差异和少量特殊语法,这个比例说明达梦的兼容策略确实做到了位。
3.2 细节里的坑:函数行为、字符串处理和隐式转换
兼容不代表“逐字节一致”。这些细节才是迁移和联调阶段的真正敌人:
**空字符串语义不同。**Oracle里''等同于NULL,WHERE name = ''永远查不到数据,因为NULL比较只能用IS NULL。达梦里空字符串是真实的空串,不是NULL,WHERE name = ''能查出那些值为空串的行。这个差异看起来不起眼,但在存量系统里非常致命。很多老应用依赖“空串与NULL等价”的Oracle语义来判断字段是否有值,迁移后行为直接改变,导致查询结果集不一样、统计报表数据对不上。我们处理过一起对账不平的问题,查到最后就是因为一张表的某个字段在Oracle里存的是NULL,到了达梦被迁移成了空串,对账SQL的过滤条件结果就变了。
TO_CHAR/TO_DATE的格式模板差异。TO_CHAR(hire_date, 'YYYY-MM-DD HH24:MI:SS')这种常见写法两边都支持,但格式元素存在差异,业界常提到的就是RR、MM、MON等格式符的细节行为在不同Oracle版本和达梦之间并非完全一致。更隐蔽的是隐式转换:Oracle里字符串和数字、日期之间的隐式转换比较宽松,达梦在某些场景下更严格,导致同样的SQL在Oracle跑得欢,到达梦直接报“无效的字符值”之类的错误。
**VARCHAR2长度上限受限于页大小。**前面提过,达梦的VARCHAR2能支持的长度和页大小绑定。如果你从Oracle迁移一张表,源库某个VARCHAR2(4000)字段很正常,但达梦初始化选了8K页就有风险,因为行长度估算和页大小的关系会影响能不能创建成功。遇到超长字段,通常要么调页大小(如果还能改)、要么改成TEXT/CLOB。但改类型等于改应用逻辑,涉及代码的改动量不小。
**序列行为差异。**Oracle的序列默认NOCACHE或按参数缓存,达梦的序列也有缓存机制,但默认值和行为模式不同。高并发下如果大量取序列值,达梦的缓存设置会影响性能和值的跳跃情况。更关键的是,有些迁移工具在迁移序列时只搬了当前值,业务跑起来发现主键冲突,或者序列值回退导致数据错乱,这在分布式或分库分表场景里尤其要小心。
3.3 PL/SQL 与过程化逻辑:包、游标、动态SQL的适配要点
开发人员最头疼的往往是存储过程、包和触发器这类过程化代码,因为它们的“方言味”最重。达梦对PL/SQL做了大量兼容,但不是所有写法都能原样跑通。几个高频出问题的点:
- 包结构(PACKAGE):达梦支持包头加包体的写法,但有些包内全局变量、重载函数的行为和Oracle有细微差异。迁移时建议对包内代码做逐行语义核对,特别是包的初始化逻辑和状态保持。
- 隐式游标属性:
SQL%ROWCOUNT、SQL%FOUND这些属性两边都能用,但在某些嵌套DML和异常场景下,取值时机和结果可能不同。 - 动态SQL:
EXECUTE IMMEDIATE支持,但USING子句绑定变量的类型匹配规则不一样,简单场景还好,复杂场景建议先做最小用例验证。 - 异常处理:Oracle的异常体系非常丰富,达梦支持常见的预定义异常,但自定义异常和异常传播链的行为需要测试确认。
我的建议是:迁移前把PL/SQL代码做一次静态扫描,把用了DBMS_*包、UTL_FILE、DBMS_SCHEDULER等Oracle内置包的地方单独标记出来,这些是风险最高的一块。达梦有自己对应的系统包和过程,但名称和参数未必一一对应,基本都需要人工适配。
4. 事务、锁与一致性:高并发场景下的真功夫
4.1 MVCC与一致性读:各做各的账,思路殊途同归
事务与并发控制是数据库的深水区,也是达梦和Oracle差异最根本的地方之一。Oracle的一致性读依赖UNDO(回滚段)和SCN(系统变更号)。一个查询开始后,Oracle会根据SCN去UNDO里构造查询时刻的数据快照,让读操作不被同时发生的写操作阻塞,实现“读不阻塞写,写不阻塞读”。这个机制是整个Oracle并发模型的地基。
达梦同样采用MVCC(多版本并发控制)的思路,目标也是保证读写互不阻塞。但内部实现上,它和Oracle并不一样,版本信息的组织方式、可见性判断逻辑都有自身的设计。对使用者来说,最终呈现出来的行为在绝大多数场景下是近似的:普通查询不会因为别的会话正在更新某行数据而挂起等待。这算是达梦努力追平Oracle的关键能力之一。
不过“近似”不等于“完全一致”。在极端情况下,比如长事务配合大批量更新,Oracle有著名的ORA-01555: snapshot too old错误,达梦在类似场景下也会因为UNDO空间不足或版本信息被覆盖而报错,但报错的信息和触发条件有差异。迁移后出现这类问题,DBA要重新学习达梦的UNDO管理机制和对应的参数调法,不能直接套Oracle那套“加大UNDO表空间、延长UNDO_RETENTION”的惯性操作。
4.2 锁机制与死锁处理:细节差异引发的连锁问题
Oracle的锁机制相当复杂:行级锁、表级锁、意向锁、DDL锁,配合多粒度锁定的规则管理并发访问。死锁检测方面,Oracle依靠锁等待关系图定期检测死锁,检测到后自动选择一个会话回滚,让另一个会话继续。
达梦的锁机制也支持行锁、表锁、意向锁等类型,整体框架上努力对齐Oracle的习惯,但锁定粒度和锁等待的处理逻辑有差异。迁移项目的实测中,最典型的场景是:同样的业务逻辑、同样的SQL,在Oracle上并发跑没问题,到达梦后出现锁等待变多甚至死锁增多。原因往往不在于SQL本身,而是两边对“什么时候加锁、加什么粒度的锁”的判定存在差异。比如某些UPDATE语句的走执行计划不同,导致锁定的行范围或表级别锁的时机不同。
经验教训是:迁移后一定要做专门的并发压力测试,模拟核心业务的高峰负载,观察锁等待事件和死锁日志。别只做功能测试、觉得“能跑通就完事了”,并发场景下的问题往往在上线后才爆发。我们有一次项目就是上线后第三天出现大量锁超时,回查发现是某个批量更新事务在达梦上持有锁的时间明显比Oracle长,跟事务里的一条辅助查询SQL在达梦上的执行计划走了全表扫描有关,最终是改写SQL加索引才解决。
4.3 隔离级别与事务行为:默认值不同带来的隐藏风险
Oracle默认的隔离级别是READ COMMITTED,但Oracle的读一致性机制实际上让这个默认级别在大多数场景下表现接近REPEATABLE READ(查询结果是语句开始时刻的快照)。达梦同样支持READ COMMITTED、REPEATABLE READ、SERIALIZABLE等标准隔离级别,默认配置也遵循标准设置,但它在读一致性上的实现细节跟Oracle并不完全相等。
迁移项目中容易踩到的坑是:某些应用依赖Oracle“查询看到的是语句开始时刻数据”的行为来做业务判断,迁移到达梦后,如果达梦在某个场景下的可见性判断跟Oracle不一致,结果就可能不一样。尤其是长事务中多次查询同一张表,期望每次看到相同快照、实际却看到了新提交数据,这类问题在报表类业务里会直接导致前后统计数字对不上。
遇到这种场景,我的建议是:不要试图在数据库层面强行模拟Oracle的所有行为,而是先定位具体哪些SQL依赖快照语义,再决定是调整事务隔离级别,还是从应用侧改逻辑。简单粗暴地把隔离级别调到SERIALIZABLE能解决一部分问题,但并发性能会大打折扣,一定要评估代价。
5. 迁移实战:从 Oracle 到达梦的真实案例分析
5.1 项目背景与迁移策略:一个典型ERP核心系统的国产化之路
去年配合客户做了一次完整的Oracle到达梦的迁移,这个案例很能说明问题。业务背景是:一家制造业企业的ERP核心模块,数据库长期跑在Oracle上,包含约2000张业务表、500多个存储过程/函数/包、数十个定时任务,数据总量约3TB,高峰期并发会话300多个,属于典型的“中大型OLTP为主、夹杂OLAP报表”的混合负载。
项目启动前,客户最关心两件事:一是SQL改动量有多大,会不会影响业务上线周期;二是迁移后性能能否保持,尤其是几个核心报表查询和批量作业的耗时不能比Oracle差太多。我们定下的策略是“分层评估、分阶段迁移、验证驱动”:先做兼容性体检,再做结构迁移和数据迁移,然后是应用适配,最后是性能调优和上线压测。
这个过程走下来,结论是:达梦完成这次替换是可行的,但“可行”不等于“无痛”,关键是要把前置评估做扎实。
5.2 迁移工具与结构迁移:自动化帮了大忙,也坑了我们一次
达梦官方提供配套的迁移工具,支持从Oracle、MySQL等主流数据库迁移元数据和数据。我们这次就是用这个工具做主体迁移:先把Oracle端的表结构、索引、约束、视图、序列、存储过程等对象批量转换到达梦,然后用工具的数据迁移功能同步数据。
结构迁移阶段第一次跑完,问题比预期多。工具确实能自动把NUMBER转成NUMERIC或DECIMAL、把VARCHAR2转成VARCHAR,但不代表转换结果一定合理。举个例子:Oracle的NUMBER不指定精度时,可以存任意精度的数值,迁移工具默认映射到达梦的NUMERIC(38)可能没问题,但某些计算字段或中间结果如果精度超过38就会报“数字溢出”。我们又花了一轮人工校对,把所有关键表的字段类型和长度逐一核对,才算把结构层面的雷排掉。
另一个坑是分区表。Oracle的分区表语法很成熟,达梦也支持范围、列表、哈希等分区方式,但迁移工具转换过来的分区定义有时候不符合达梦的语法细节,比如分区键类型匹配和默认值处理不一致。这类问题工具不会主动报错,但后续数据导入或查询时才会暴露。我的建议是:迁移后不要急着导数据,先花时间检查所有分区表的定义在达梦里是否有效,分区边界值是否和源库一致。
5.3 数据迁移与一致性校验:3TB数据不只是“拷过去”那么简单
数据迁移阶段,3TB的数据量决定了必须做分批迁移和并行调度。我们按表的数据量分成几档:千万行以上的大表单独跑批、并行度调高;小表批量合并迁移。整个过程不是一次跑完,而是按业务模块分批进行,每批迁移后做行数校验和抽样比对。
这里有个很实在的经验:行数一致不代表数据一致。Oracle和达梦在字符集、数值精度、日期时间格式上的差异,可能导致迁移后某些字段内容发生细微变化。我们当时的校验策略有三层:第一层是行数核对,SELECT COUNT(*)对账;第二层是关键字段的聚合值比对,比如金额字段的SUM、日期字段的MAX/MIN;第三层是抽样数据逐字段做明细比对,按照预先规则抽取若干条记录对比整行内容。三层校验下来,能防住绝大多数因类型映射或字符集转换导致的数据偏差。
还有序列迁移的教训:工具迁移序列时,只把当前值搬过来,但业务系统在高并发下依赖序列分配主键,如果目标库序列缓存设置和源库不一致,可能出现主键空洞甚至冲突。我们后来统一检查了核心表的序列当前值和高水位线,做了适当调整,避免上线后主键撞车。
5.4 应用适配与SQL改写:那7%的改写量都改了什么
存量SQL的改动比例大约7%,集中在这几类:
TO_CHAR/TO_DATE的格式模板需要微调,比如某些Oracle特有的格式符在达梦里不支持,需要换成等价写法。- 空字符串语义导致的SQL改写,
WHERE col = ''改成WHERE col IS NULL这种动作,数量不多但每一处都要理解业务意图后手工处理。 - 使用了Oracle特定的优化器提示(HINT)或分区语法,需要替换成达梦支持的写法。
- PL/SQL包中个别内置函数或系统包名的替换,比如
DBMS_OUTPUT在达梦里对应不同的调用方式(具体映射要看版本手册),部分功能需要重写。
应用侧JDBC驱动的替换和连接串修改反而是最顺利的一环,达梦提供JDBC驱动,基本是改配置就能接上。真正花时间的是对一些“隐性依赖Oracle行为”的代码做适配,比如某个存储过程里用了SQL%ROWCOUNT做循环退出判断,Oracle和达梦的返回结果在某个边界场景下不一样,联调阶段差点没查出来。
5.5 性能调优与上线效果:慢SQL清单和索引重建
上线前的性能调优是重头戏。我们把Oracle端的AWR报告里耗时TOP50的SQL全部列出来,在达梦上逐一跑了一遍,对比执行计划和实际耗时。结果喜忧参半:大部分常规SQL在达梦上的性能与Oracle基本持平,少数甚至更快;问题主要集中在几类复杂查询上。
一个典型案例是某张报表的分页查询,在Oracle里走了一个复合索引,返回很快;到达梦后同样的SQL、同样的索引定义,执行计划却变成了全表扫描。排查后发现,这是因为达梦的优化器对统计信息的敏感度和Oracle不一样,迁移来的表没有及时收集统计信息,优化器判断走索引代价更高。我们重新收集了全库统计信息,这个查询就恢复正常了。另外几个慢SQL则是因为达梦对某些连接顺序的选择不同,通过调整SQL写法(把驱动表换一下、拆掉一个冗余的嵌套子查询)解决了。
批量作业方面,原来在Oracle上跑20分钟的一个数据加工任务,达梦上优化后跑到了18分钟左右,基本持平;另一个用HUGE表改造后的分析报表,查询从原来的4分钟降到了50秒,算是意外之喜。最终上线后系统稳定运行,核心交易响应时间满足业务要求,没有出现严重的性能回退。
写在最后:一个迁移老兵的实用建议
做了这么多次Oracle到达梦的迁移,我最大的体会是:达梦和Oracle的关系像一对“同门师兄弟”——招式套路看着很接近,内功心法各不相同。你用Oracle的思维去做达梦的架构设计和性能调优,前期可能很顺,越往深处走越会发现不对劲。所以不管你是DBA还是开发,接手达梦项目后第一件事不是写代码,而是把达梦的官方文档通读一遍,特别是初始化参数、内存结构、分区和索引这些基础概念,先建立正确的心理模型。
最后再分享一个小技巧:达梦初始化实例前,一定花半天时间把业务表结构摸个底,统计一下单行最大长度、字符集要求、大字段比例,再决定页大小和字符集。我们见过太多“部署完才发现页大小选小了,只能重建实例”的案例,这个决定一旦做错,后面的所有工作都可能白干。数据库迁移没有银弹,把准备工作做足,你就能少熬几个通宵。