Oracle 数据库零停机迁移详解

Oracle 数据库零停机迁移详解

适用版本:Oracle Database 11g / 12c / 19c / 23ai 文档版本:v1.0 / 2026-07


1. 概述

零停机迁移方案汇总[1]:

详细见:Oracle 零停机迁移方案对比


2. 方案对比

2.1 GoldenGate

- 实时复制
- 跨平台
- 零停机
- 复杂

2.2 Data Guard

- 物理/逻辑备库
- 同平台
- 几乎零停机
- Switchover

2.3 ZDM

- Oracle Cloud
- 自动化
- 在线迁移
- 简单

2.4 XStream

- GoldenGate 底层
- 集成
- 零停机

3. GoldenGate 迁移

3.1 流程

1. 初始装载(Data Pump / TTS)
2. 启动 Extract(源端)
3. 启动 Replicat(目标)
4. 追平数据
5. 验证
6. 切换应用
7. 停止源端

3.2 初始装载

# Data Pump
expdp scott/tiger DIRECTORY=dp DUMPFILE=full.dmp FULL=Y
impdp scott/tiger DIRECTORY=dp DUMPFILE=full.dmp FULL=Y

详细见:Oracle Data Pump 全集

3.3 启动复制

# 源端 Extract
> ADD EXTRACT ext1, TRANLOG, BEGIN NOW
> ADD EXTTRAIL ./dirdat/lt, EXTRACT ext1
> START EXTRACT ext1

# 目标 Replicat
> ADD REPLICAT rep1, EXTTRAIL ./dirdat/rt
> START REPLICAT rep1

详细见:Oracle GoldenGate 全集

3.4 切换

1. 停止源应用
2. 等待 Replicat 完成
3. 验证数据
4. 切换应用到目标
5. 启动应用

4. Data Guard 迁移

4.1 物理 Switchover

-- 主库
ALTER DATABASE COMMIT TO SWITCHOVER TO PHYSICAL STANDBY;

-- 备库
ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY;
ALTER DATABASE OPEN;

4.2 跨平台

- 物理:相同平台
- 逻辑:不同平台(限制)
- 转换:RMAN CONVERT

详细见:Oracle Data Guard Switchover 与 Failover 详解

4.3 流程

1. 建立备库
2. 同步
3. Switchover
4. 应用切换
5. 完成迁移

5. ZDM(Zero Downtime Migration)

5.1 概念

- Oracle Cloud 工具
- 自动化迁移到 OCI
- 在线
- 物理 + 增量同步

5.2 流程

1. 准备 ZDM
2. 全量备份
3. 增量同步
4. 切换
5. 完成

5.3 命令

$ZDM_HOME/bin/zdmcli migrate database \
  -sourcedb prod \
  -targethome /u01/app/oracle/product/19c \
  -backupuser user@target \
  -rsp response.rsp

6. 跨平台迁移

6.1 RMAN CONVERT

# 源平台
RMAN> CONVERT DATABASE 
  NEW DATABASE 'prod'
  TRANSPORT SCRIPT '/tmp/transport.sql'
  TO PLATFORM 'Linux x86 64-bit'
  DB_FILE_NAME_CONVERT ('/u01/oradata', '/tmp/conv');

详细见:Oracle 跨平台迁移

6.2 TTS

-- 检查平台
SELECT platform_name FROM v$transportable_platform;

-- 自包含
EXEC DBMS_TTS.TRANSPORT_SET_CHECK('USERS, TOOLS', TRUE);

-- 导出
expdp system/password DUMPFILE=tts.dmp DIRECTORY=dp 
  TRANSPORT_TABLESPACES=users,tools

-- 转换
RMAN> CONVERT TABLESPACE users TO PLATFORM 'Linux x86 64-bit' 
  FORMAT '/tmp/users_%U.dbf';

详细见:Oracle TTS 传输表空间详解


7. 在线重定义

7.1 概念

- 在线修改表结构
- 几乎零停机
- DBMS_REDEFINITION

7.2 流程

-- 检查可重定义
EXEC DBMS_REDEFINITION.CAN_REDEF_TABLE('SCOTT', 'EMP');

-- 开始
EXEC DBMS_REDEFINITION.START_REDEF_TABLE(
  'SCOTT', 'EMP', 'EMP_NEW');

-- 同步
EXEC DBMS_REDEFINITION.SYNC_INTERIM_TABLE('SCOTT', 'EMP');

-- 完成
EXEC DBMS_REDEFINITION.FINISH_REDEF_TABLE('SCOTT', 'EMP', 'EMP_NEW');

详细见:Oracle 在线重定义详解


8. 迁移到云

8.1 方法

- ZDM:自动化
- Data Pump:简单
- GoldenGate:实时
- Backup to Cloud:备份恢复

8.2 OCI

- Autonomous Database
- DB System
- Exadata Cloud

详细见:Oracle 数据库迁移到云


9. 验证

9.1 数据校验

-- 行数
SELECT COUNT(*) FROM employees;

-- 数据
SELECT DBMS_CRYPTO.HASH(...) FROM ...;

-- 表对比
SELECT table_name, num_rows FROM user_tables;

9.2 性能

-- 执行计划
EXPLAIN PLAN FOR ...;

-- 性能对比
SELECT sql_id, elapsed_time FROM v$sql;

9.3 业务

- 应用测试
- 业务流程
- 报表对比

10. 回退

10.1 计划

- 回退方案
- 时间窗口
- 责任人

10.2 GoldenGate

- 反向复制
- 应用回退

10.3 Data Guard

- Switchover 回切
- Flashback

11. 应用切换

11.1 服务名

- TNS 切换
- 连接池
- 应用配置

11.2 DNS

- DNS 切换
- TTL
- 监控

11.3 验证

- 连接测试
- 业务测试
- 监控

12. 常见坑与排错

12.1 数据不一致

- 校验
- 重新同步

12.2 性能差

- 索引
- 统计
- 内存

12.3 切换失败

- 回退
- 修复
- 重试

13. 最佳实践

  1. 测试:演练
  2. 备份:迁移前
  3. 校验:数据
  4. 回退:预案
  5. 监控:迁移过程
  6. 文档:流程
  7. 团队:协同
  8. 时间窗口:合理
  9. 验证:业务
  10. 复盘:总结

14. 参考资料

[1] Oracle Database Migration Guide 19c https://docs.oracle.com/en/database/oracle/oracle-database/19/upgrd/