<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Oracle on 文艺技术笔记</title>
        <link>https://wenyiblog.top/tags/oracle/</link>
        <description>Recent content in Oracle on 文艺技术笔记</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>zh-cn</language>
        <copyright>文艺技术笔记 | 软件工程师文艺</copyright>
        <lastBuildDate>Sat, 05 Sep 2026 00:00:00 +0800</lastBuildDate><atom:link href="https://wenyiblog.top/tags/oracle/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>国产数据库在政务系统的迁移实战：从Oracle到达梦的零停机迁移方案</title>
        <link>https://wenyiblog.top/2026/09/oracle-to-dameng-zero-downtime-migration/</link>
        <pubDate>Sat, 05 Sep 2026 00:00:00 +0800</pubDate>
        
        <guid>https://wenyiblog.top/2026/09/oracle-to-dameng-zero-downtime-migration/</guid>
        <description>&lt;p&gt;政务系统的数据库国产化，大概是这两年最「催人」的一类项目。催的不是技术有多难，而是政策红线摆在那里，时间表摆在那里，Oracle 的授权账单也摆在那里。&lt;/p&gt;
&lt;p&gt;但真正动手做过的人都知道，Oracle 迁移到达梦，跟很多人想象的「导个数据、换个驱动」完全是两码事。难的不是把数据搬过去，而是&lt;strong&gt;搬过去之后业务得照常跑，跑的过程中还不能停&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;这篇文章不聊政策，聊一条我在政务系统上反复验证过的零停机迁移路径。没有具体单位和名字，只有能落地的步骤、能避开的坑。&lt;/p&gt;
&lt;h2 id=&#34;为什么-oracle-迁移比-mysql-迁移难一个量级&#34;&gt;&lt;a href=&#34;#%e4%b8%ba%e4%bb%80%e4%b9%88-oracle-%e8%bf%81%e7%a7%bb%e6%af%94-mysql-%e8%bf%81%e7%a7%bb%e9%9a%be%e4%b8%80%e4%b8%aa%e9%87%8f%e7%ba%a7&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;为什么 Oracle 迁移比 MySQL 迁移难一个量级
&lt;/h2&gt;&lt;p&gt;先纠正一个常见误区：国产数据库迁移里，&lt;strong&gt;MySQL 迁移到达梦是「小学题」，Oracle 迁移到达梦是「大学题」&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;MySQL 应用层的复杂度，大部分在数据之外——分库分表、缓存、消息队列。数据库本身相对「单纯」，存储过程写得少，语法也简单。&lt;/p&gt;
&lt;p&gt;Oracle 则完全相反。跑了十几年的政务系统，逻辑有相当一部分是「长在数据库里」的：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Oracle 对象&lt;/th&gt;
					&lt;th&gt;典型用途&lt;/th&gt;
					&lt;th&gt;迁移难点&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;存储过程 / 函数&lt;/td&gt;
					&lt;td&gt;批量计算、审批流转、数据清洗&lt;/td&gt;
					&lt;td&gt;PL/SQL 语法兼容，包结构改写&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Package 包&lt;/td&gt;
					&lt;td&gt;模块化封装业务逻辑&lt;/td&gt;
					&lt;td&gt;达梦的包机制有差异，需逐个验证&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;序列 Sequence&lt;/td&gt;
					&lt;td&gt;主键自增、流水号生成&lt;/td&gt;
					&lt;td&gt;语法差异小，但边界行为要测&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;物化视图&lt;/td&gt;
					&lt;td&gt;报表预聚合、跨库汇总&lt;/td&gt;
					&lt;td&gt;刷新机制、增量刷新的语义差异&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;DBLink&lt;/td&gt;
					&lt;td&gt;跨库访问、数据同步&lt;/td&gt;
					&lt;td&gt;达梦的 LINK 语法与 Oracle 不完全一致&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;触发器&lt;/td&gt;
					&lt;td&gt;审计、日志、级联更新&lt;/td&gt;
					&lt;td&gt;时序、&lt;code&gt;:NEW&lt;/code&gt;/&lt;code&gt;:OLD&lt;/code&gt; 引用方式不同&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;CONNECT BY 递归&lt;/td&gt;
					&lt;td&gt;组织架构、权限树、行政区划&lt;/td&gt;
					&lt;td&gt;达梦兼容但性能与写法需调&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;换句话说，MySQL 迁移主要是「搬数据」，Oracle 迁移是「搬数据 + 搬逻辑」。后者才是真正的硬仗。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;所以，Oracle 迁移的核心工作量，其实花在&lt;strong&gt;对象兼容性评估&lt;/strong&gt;和&lt;strong&gt;存储过程改写&lt;/strong&gt;上，而不是数据同步本身。很多人一上来就研究同步工具，方向就偏了。&lt;/p&gt;
&lt;h2 id=&#34;迁移前的第一步把家底摸清楚&#34;&gt;&lt;a href=&#34;#%e8%bf%81%e7%a7%bb%e5%89%8d%e7%9a%84%e7%ac%ac%e4%b8%80%e6%ad%a5%e6%8a%8a%e5%ae%b6%e5%ba%95%e6%91%b8%e6%b8%85%e6%a5%9a&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;迁移前的第一步：把「家底」摸清楚
&lt;/h2&gt;&lt;p&gt;零停机迁移的第一原则是：&lt;strong&gt;评估在前，动手在后&lt;/strong&gt;。宁可花两周摸清家底，也别边迁边发现问题边返工。&lt;/p&gt;
&lt;h3 id=&#34;对象盘点清单&#34;&gt;&lt;a href=&#34;#%e5%af%b9%e8%b1%a1%e7%9b%98%e7%82%b9%e6%b8%85%e5%8d%95&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;对象盘点清单
&lt;/h3&gt;&lt;p&gt;先对整个库做一次全面体检，输出一份「迁移对象清单」：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;对象类型&lt;/th&gt;
					&lt;th&gt;数量示例&lt;/th&gt;
					&lt;th&gt;风险等级&lt;/th&gt;
					&lt;th&gt;处理策略&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;普通表&lt;/td&gt;
					&lt;td&gt;320 张&lt;/td&gt;
					&lt;td&gt;低&lt;/td&gt;
					&lt;td&gt;直接迁移，关注数据类型映射&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;存储过程&lt;/td&gt;
					&lt;td&gt;148 个&lt;/td&gt;
					&lt;td&gt;高&lt;/td&gt;
					&lt;td&gt;逐个做语法兼容性扫描，重点改写&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;函数&lt;/td&gt;
					&lt;td&gt;76 个&lt;/td&gt;
					&lt;td&gt;高&lt;/td&gt;
					&lt;td&gt;同上，注意返回值类型&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Package 包&lt;/td&gt;
					&lt;td&gt;23 个&lt;/td&gt;
					&lt;td&gt;高&lt;/td&gt;
					&lt;td&gt;拆解后改写，验证调用关系&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;触发器&lt;/td&gt;
					&lt;td&gt;41 个&lt;/td&gt;
					&lt;td&gt;中&lt;/td&gt;
					&lt;td&gt;关注 &lt;code&gt;:NEW&lt;/code&gt;/&lt;code&gt;:OLD&lt;/code&gt; 与时序&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;序列&lt;/td&gt;
					&lt;td&gt;55 个&lt;/td&gt;
					&lt;td&gt;低&lt;/td&gt;
					&lt;td&gt;迁移后核对当前值和步长&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;物化视图&lt;/td&gt;
					&lt;td&gt;12 个&lt;/td&gt;
					&lt;td&gt;中&lt;/td&gt;
					&lt;td&gt;评估刷新策略，改用达梦机制&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;DBLink&lt;/td&gt;
					&lt;td&gt;6 个&lt;/td&gt;
					&lt;td&gt;中&lt;/td&gt;
					&lt;td&gt;确认对端数据库类型与权限&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;这份清单不是一次查出来的，而是用 &lt;code&gt;dba_objects&lt;/code&gt;、&lt;code&gt;dba_source&lt;/code&gt; 等系统视图汇总生成的。&lt;strong&gt;清单的价值在于：让你在动手前就知道改写的工程量有多大&lt;/strong&gt;，从而合理排期，而不是迁到一半才发现有 148 个存储过程要一个个改。&lt;/p&gt;
&lt;h3 id=&#34;兼容性评估的三层漏斗&#34;&gt;&lt;a href=&#34;#%e5%85%bc%e5%ae%b9%e6%80%a7%e8%af%84%e4%bc%b0%e7%9a%84%e4%b8%89%e5%b1%82%e6%bc%8f%e6%96%97&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;兼容性评估的三层漏斗
&lt;/h3&gt;&lt;p&gt;有了清单，接下来做兼容性评估。我习惯用「三层漏斗」来收敛风险：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;语法层&lt;/strong&gt;：扫描所有 PL/SQL 源码，标记达梦不直接支持的语法（如 &lt;code&gt;CONNECT BY&lt;/code&gt;、&lt;code&gt;MODEL&lt;/code&gt;、&lt;code&gt;PIVOT&lt;/code&gt;、Oracle 专有 hint、&lt;code&gt;DBMS_*&lt;/code&gt; 系统包）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;语义层&lt;/strong&gt;：语法能过，但运行结果可能不同。典型如空字符串的处理、&lt;code&gt;NULL&lt;/code&gt; 的排序位置、隐式类型转换、事务隔离级别的默认差异。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;性能层&lt;/strong&gt;：改写后能跑，但执行计划可能退化。尤其是有 Oracle 专有索引（位图索引、函数索引、分区表）和复杂 SQL 的场景。&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;三层漏斗的精华在于：&lt;strong&gt;先解决「能不能跑」，再解决「跑得对不对」，最后解决「跑得快不快」&lt;/strong&gt;。顺序不能乱，否则你会陷在性能调优里，而语法错误还在源源不断地冒出来。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;零停机的核心全量--增量实时同步&#34;&gt;&lt;a href=&#34;#%e9%9b%b6%e5%81%9c%e6%9c%ba%e7%9a%84%e6%a0%b8%e5%bf%83%e5%85%a8%e9%87%8f--%e5%a2%9e%e9%87%8f%e5%ae%9e%e6%97%b6%e5%90%8c%e6%ad%a5&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;零停机的核心：全量 + 增量实时同步
&lt;/h2&gt;&lt;p&gt;摸清家底之后，才是真正的技术选型。政务系统最要命的一个要求是&lt;strong&gt;业务连续性&lt;/strong&gt;——办事窗口是实时的，审批是实时的，很多系统是 7×24 小时对外服务，停机窗口几乎不存在。&lt;/p&gt;
&lt;p&gt;传统的停服迁移（导库 → 停源库 → 导入目标库 → 切应用）在政务场景基本不可行。原因很简单：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;数据量大（动辄 TB 级），全量导入就要几个小时；&lt;/li&gt;
&lt;li&gt;停机期间业务全停，影响面太大；&lt;/li&gt;
&lt;li&gt;一旦迁移失败，回退又是一轮折腾。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;所以零停机的本质，是&lt;strong&gt;把「一次性大迁移」拆成「全量 + 增量」两个阶段&lt;/strong&gt;：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;阶段一（全量同步）       阶段二（增量追平）       阶段三（割接）
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;┌──────────┐           ┌──────────┐           ┌──────────┐
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│  源 Oracle │ ───────► │  redo 日志 │ ───────► │  达梦     │
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│  持续提供  │   全量     │  实时解析   │   增量    │  逐渐追平  │
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│  业务服务  │           │  事务同步   │           │  数据延迟  │
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;└──────────┘           └──────────┘           └─────┬────┘
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                                                     │ 延迟趋近 0
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                                                     ▼
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                                            ┌──────────────────┐
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                                            │  短暂停写 → 切换应用  │
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                                            │  秒级/分钟级割接完成   │
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                                            └──────────────────┘
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;关键在于&lt;strong&gt;增量同步&lt;/strong&gt;这一环。它不是靠应用层双写，而是靠解析 Oracle 的 redo log（重做日志），把源库的每一条变更事务实时同步到达梦。&lt;/p&gt;
&lt;h3 id=&#34;为什么基于-redo-log而不是应用双写&#34;&gt;&lt;a href=&#34;#%e4%b8%ba%e4%bb%80%e4%b9%88%e5%9f%ba%e4%ba%8e-redo-log%e8%80%8c%e4%b8%8d%e6%98%af%e5%ba%94%e7%94%a8%e5%8f%8c%e5%86%99&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;为什么基于 redo log，而不是应用双写
&lt;/h3&gt;&lt;p&gt;很多人会问：为什么不直接在应用层做「双写」，两边同时写，然后切换？&lt;/p&gt;
&lt;p&gt;应用双写有几个致命的坑：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;改造侵入大&lt;/strong&gt;：要在业务代码里加双写逻辑，改动面广、回归测试成本高；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;一致性难保证&lt;/strong&gt;：两边的写入不在一个事务里，一旦一边失败，就会产生数据不一致；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;存量数据要补&lt;/strong&gt;：双写只能保证「切换后的数据」两边一致，历史数据还是要单独搬。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;基于 redo log 的同步，走的是数据库底层的变更捕获（CDC），&lt;strong&gt;应用完全无感知&lt;/strong&gt;，不用改一行业务代码。它天然覆盖了「存量 + 增量」，一致性由数据库的事务边界保证。&lt;/p&gt;
&lt;p&gt;在 Oracle 到达梦的迁移中，这类同步一般有两类工具：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;方案&lt;/th&gt;
					&lt;th&gt;适用场景&lt;/th&gt;
					&lt;th&gt;特点&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;达梦 DMHS&lt;/td&gt;
					&lt;td&gt;Oracle → 达梦 官方同步&lt;/td&gt;
					&lt;td&gt;原生支持 Oracle 源，部署相对轻量&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Oracle GoldenGate&lt;/td&gt;
					&lt;td&gt;跨异构库通用同步&lt;/td&gt;
					&lt;td&gt;功能强但授权成本高、部署复杂&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;自研 CDC（LogMiner 等）&lt;/td&gt;
					&lt;td&gt;定制化需求&lt;/td&gt;
					&lt;td&gt;灵活但开发维护成本高&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;政务项目里，绝大多数是走 DMHS 或者它的同类方案——毕竟迁移的目标库就是达梦，用原厂同步工具在兼容性和后续支持上最省心。&lt;/p&gt;
&lt;h2 id=&#34;兼容性改造迁移真正的大头&#34;&gt;&lt;a href=&#34;#%e5%85%bc%e5%ae%b9%e6%80%a7%e6%94%b9%e9%80%a0%e8%bf%81%e7%a7%bb%e7%9c%9f%e6%ad%a3%e7%9a%84%e5%a4%a7%e5%a4%b4&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;兼容性改造：迁移真正的大头
&lt;/h2&gt;&lt;p&gt;数据同步跑起来只是「万里长征第一步」。同步能保证数据过去，但&lt;strong&gt;过去之后应用能不能正常用&lt;/strong&gt;，取决于前面那一大批存储过程、函数、触发器改写得到不到位。&lt;/p&gt;
&lt;p&gt;下面挑几个 Oracle 迁移到政务系统里最高频的「坑」来讲。&lt;/p&gt;
&lt;h3 id=&#34;数据类型映射&#34;&gt;&lt;a href=&#34;#%e6%95%b0%e6%8d%ae%e7%b1%bb%e5%9e%8b%e6%98%a0%e5%b0%84&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;数据类型映射
&lt;/h3&gt;&lt;p&gt;Oracle 和达梦的数据类型不是一一对应的，尤其是数字和日期这两类：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Oracle 类型&lt;/th&gt;
					&lt;th&gt;达梦映射&lt;/th&gt;
					&lt;th&gt;注意事项&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;NUMBER&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;NUMBER&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;达梦原生兼容，精度要核对&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;VARCHAR2&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;VARCHAR2&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;基本一致，注意长度单位&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;DATE&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;DATE&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Oracle 的 DATE 含时分秒，语义要确认&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;TIMESTAMP&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;TIMESTAMP&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;精度默认值有差异&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;CLOB&lt;/code&gt; / &lt;code&gt;BLOB&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;CLOB&lt;/code&gt; / &lt;code&gt;BLOB&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;大字段读写 API 有差异&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;ROWID&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;不支持&lt;/td&gt;
					&lt;td&gt;若业务依赖 ROWID，需改设计&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;特别注意 &lt;code&gt;ROWID&lt;/code&gt;。有些老政务系统用 ROWID 做去重、做定位，这在达梦里是行不通的，必须在上线前找出所有依赖 ROWID 的逻辑并改掉，否则上线后就是定时炸弹。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;高频-sql-改写&#34;&gt;&lt;a href=&#34;#%e9%ab%98%e9%a2%91-sql-%e6%94%b9%e5%86%99&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;高频 SQL 改写
&lt;/h3&gt;&lt;p&gt;存储过程里的 SQL，最常遇到这几类改写：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Oracle 写法&lt;/th&gt;
					&lt;th&gt;达梦改写&lt;/th&gt;
					&lt;th&gt;场景&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;ROWNUM &amp;lt;= N&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;LIMIT N&lt;/code&gt; 或 &lt;code&gt;TOP N&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;分页、取前 N 条&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;CONNECT BY ... START WITH&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;达梦兼容，或改递归 CTE&lt;/td&gt;
					&lt;td&gt;组织树、权限树&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;SEQUENCE.NEXTVAL&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;SEQUENCE.NEXTVAL&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;基本一致，注意缓存&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;SYSDATE&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;SYSDATE&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;基本一致&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;DECODE()&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;DECODE()&lt;/code&gt; 或 &lt;code&gt;CASE WHEN&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;达梦兼容 DECODE&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;NVL()&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;NVL()&lt;/code&gt; 或 &lt;code&gt;COALESCE()&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;基本一致&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;(+)&lt;/code&gt; 外连接&lt;/td&gt;
					&lt;td&gt;标准 &lt;code&gt;LEFT/RIGHT JOIN&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;老系统大量存在&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;DBMS_OUTPUT&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;达梦对应包&lt;/td&gt;
					&lt;td&gt;调试输出&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;其中&lt;strong&gt;老式 &lt;code&gt;(+)&lt;/code&gt; 外连接&lt;/strong&gt;是重灾区。十几年前的政务系统 SQL，几乎全是 &lt;code&gt;WHERE a.id = b.id(+)&lt;/code&gt; 这种写法，迁移时必须全部改成标准的 &lt;code&gt;LEFT JOIN&lt;/code&gt;/&lt;code&gt;RIGHT JOIN&lt;/code&gt;，量大且容易漏改，建议用脚本批量扫描 &lt;code&gt;(+)&lt;/code&gt; 关键字。&lt;/p&gt;
&lt;h3 id=&#34;存储过程改写的八二法则&#34;&gt;&lt;a href=&#34;#%e5%ad%98%e5%82%a8%e8%bf%87%e7%a8%8b%e6%94%b9%e5%86%99%e7%9a%84%e5%85%ab%e4%ba%8c%e6%b3%95%e5%88%99&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;存储过程改写的「八二法则」
&lt;/h3&gt;&lt;p&gt;148 个存储过程，不是每一个都要精雕细琢。按业务调用频率排序后，往往&lt;strong&gt;前 20% 的存储过程承担了 80% 的调用量&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;改写的策略应该是：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;核心高频存储过程&lt;/strong&gt;：逐行精读、逐条测试，甚至重写成达梦更优的写法；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;中频存储过程&lt;/strong&gt;：跑通 + 结果比对即可，语法兼容优先；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;低频存储过程&lt;/strong&gt;：批量处理，能编译通过、关键场景验证过就放行。&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;别平均用力。把精力集中在那 20% 高频对象上，迁移的性价比最高。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;割接零停机的最后一公里&#34;&gt;&lt;a href=&#34;#%e5%89%b2%e6%8e%a5%e9%9b%b6%e5%81%9c%e6%9c%ba%e7%9a%84%e6%9c%80%e5%90%8e%e4%b8%80%e5%85%ac%e9%87%8c&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;割接：零停机的「最后一公里」
&lt;/h2&gt;&lt;p&gt;同步追平之后，真正的考验是&lt;strong&gt;割接&lt;/strong&gt;——把应用的读写从 Oracle 切到达梦，而业务几乎不中断。&lt;/p&gt;
&lt;h3 id=&#34;割接前的三个前置条件&#34;&gt;&lt;a href=&#34;#%e5%89%b2%e6%8e%a5%e5%89%8d%e7%9a%84%e4%b8%89%e4%b8%aa%e5%89%8d%e7%bd%ae%e6%9d%a1%e4%bb%b6&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;割接前的三个前置条件
&lt;/h3&gt;&lt;p&gt;割接不是拍脑袋就切的，必须满足三个硬性条件：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;延迟趋近于零&lt;/strong&gt;：增量同步的延迟稳定在秒级以内，且持续一段时间没有波动；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;数据校验通过&lt;/strong&gt;：源库和目标库的关键表做过了行数和抽样内容比对，一致率 100%；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;回退方案就绪&lt;/strong&gt;：源库保持可用，回退路径经过演练，能在分钟级切回。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;割接的经典流程&#34;&gt;&lt;a href=&#34;#%e5%89%b2%e6%8e%a5%e7%9a%84%e7%bb%8f%e5%85%b8%e6%b5%81%e7%a8%8b&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;割接的经典流程
&lt;/h3&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;T-2h   冻结 DDL 变更，暂停定时任务，进入「静默期」
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;T-1h   做最后一次全量校验，确认无新增不一致
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;T-10min 停止源库写入（进入只读），等待增量追平
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;T-0    追平确认 → 切换应用数据源到达梦
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;T+5min 业务验证（核心功能走查、流水核对）
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;T+30min 监控观察，确认无告警、无性能退化
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;T+2h   确认稳定后，源 Oracle 转为冷备份保留
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;整个过程里，真正「停」的只有 T-10min 到 T-0 这段&lt;strong&gt;极短的写入冻结窗口&lt;/strong&gt;，通常控制在分钟级甚至秒级。对政务系统来说，这已经是事实上的「零停机」了。&lt;/p&gt;
&lt;h3 id=&#34;回退永远要留的后手&#34;&gt;&lt;a href=&#34;#%e5%9b%9e%e9%80%80%e6%b0%b8%e8%bf%9c%e8%a6%81%e7%95%99%e7%9a%84%e5%90%8e%e6%89%8b&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;回退：永远要留的后手
&lt;/h3&gt;&lt;p&gt;再充分的准备，也挡不住「万一」。回退策略的核心是&lt;strong&gt;一键、快速、可验证&lt;/strong&gt;：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;回退场景&lt;/th&gt;
					&lt;th&gt;触发条件&lt;/th&gt;
					&lt;th&gt;回退动作&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;割接后报错&lt;/td&gt;
					&lt;td&gt;核心功能异常&lt;/td&gt;
					&lt;td&gt;数据源配置切回 Oracle，分钟级&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;性能退化&lt;/td&gt;
					&lt;td&gt;响应时间超阈值&lt;/td&gt;
					&lt;td&gt;视严重程度评估切回或调优&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;数据不一致&lt;/td&gt;
					&lt;td&gt;发现漏同步&lt;/td&gt;
					&lt;td&gt;暂停切换，重新追平增量&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;回退的底气来自「割接期间源库保持只读可服务」。只要源 Oracle 还在、数据还在、配置能一键切回，再大的问题都有退路。&lt;/p&gt;
&lt;h2 id=&#34;上线后的验证与收尾&#34;&gt;&lt;a href=&#34;#%e4%b8%8a%e7%ba%bf%e5%90%8e%e7%9a%84%e9%aa%8c%e8%af%81%e4%b8%8e%e6%94%b6%e5%b0%be&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;上线后的验证与收尾
&lt;/h2&gt;&lt;p&gt;割接成功不是终点，反而是最需要盯紧的时候。上线后两周内，重点做三件事：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;业务核对&lt;/strong&gt;：财务对账、报表产出、审批流转等关键业务，跑一个完整的周期，确认结果与迁移前一致；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;性能基线&lt;/strong&gt;：对比迁移前后的关键 SQL 执行时间，建立达梦环境下的性能基线，为后续调优留参考；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;监控告警&lt;/strong&gt;：把慢查询、锁等待、表空间增长接入监控，尤其关注那些「改写过」的存储过程的运行情况。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;政务系统的 Oracle 迁移到达梦，本质上是一场「风险工程」，而不是「技术炫技」。&lt;/p&gt;
&lt;p&gt;技术选型、同步工具、语法改写，这些都只是手段。真正的难点在于&lt;strong&gt;对业务连续性的敬畏&lt;/strong&gt;——能不能在迁移的每一个环节都留好后手，能不能把风险拆小、把验证做实、把回退准备好。&lt;/p&gt;
&lt;p&gt;有句话说得好：迁移项目里，最值钱的从来不是那个切库的动作，而是切库之前，你把多少「没想到」变成了「已经验证过」。&lt;/p&gt;
&lt;p&gt;那些跑通了、对上了账、稳稳切过去的项目，靠的都是笨功夫——一份摸清的清单，一轮轮做实的校验，和一个随时能退的底气。&lt;/p&gt;
</description>
        </item>
        
    </channel>
</rss>
