Oracle 数据库升级与迁移

Oracle 数据库升级与迁移

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


1. 概述

Oracle 数据库升级路径[1]:

升级方式说明停机时间
DBUA图形化升级
Manual Upgrade手动执行脚本
Data Pump导出导入
GoldenGate实时同步
PDB Plug/Unplug多租户迁移

2. 升级前准备

2.1 升级路径

11.2.0.4 → 19c (直接升级)
12.1.0.2 → 19c (直接升级)
12.2.0.1 → 19c (直接升级)
18c → 19c (直接升级)

11.2.0.3 → 11.2.0.4 → 19c
11.2.0.1/2 → 11.2.0.4 → 19c

2.2 预检查

# 1. 下载 preupgrade.jar
# 2. 运行预检查
sqlplus / as sysdba
@?/rdbms/admin/utlumppv.sql

# 或使用 AutoUpgrade
java -jar autoupgrade.jar -mode analyze -s /tmp

2.3 备份

-- 1. RMAN 全备份
RMAN> BACKUP DATABASE PLUS ARCHIVELOG;

-- 2. 备份控制文件
RMAN> BACKUP CURRENT CONTROLFILE;

-- 3. 备份 SPFILE
RMAN> BACKUP SPFILE;

2.4 收集统计信息

EXEC DBMS_STATS.GATHER_DICTIONARY_STATS;
EXEC DBMS_STATS.GATHER_FIXED_OBJECTS_STATS;

3. DBUA 升级

3.1 启动 DBUA

# 新版本 Oracle Home
$ORACLE_HOME/bin/dbua

3.2 DBUA 步骤

  1. 选择数据库
  2. 升级前检查
  3. 选择升级选项
  4. 恢复选项
  5. 执行升级
  6. 升级后检查

3.3 静默 DBUA

dbua -silent -dbName ORCL -oracleHome /u01/app/oracle/product/11.2.0/dbhome_1 \
  -oracleHomeList /u01/app/oracle/product/19.3.0/dbhome_1 \
  -upgradeTimezone -recompile_invalid_objects -degree_of_parallelism 4 \
  -gatheringStatistics -emConfiguration NONE

4. 手动升级

4.1 关闭数据库

SHUTDOWN IMMEDIATE;

4.2 启动到新版本

# 1. 修改 ORACLE_HOME
export ORACLE_HOME=/u01/app/oracle/product/19.3.0/dbhome_1
export PATH=$ORACLE_HOME/bin:$PATH

# 2. 启动到 mount
sqlplus / as sysdba
STARTUP UPGRADE;

4.3 执行升级脚本

-- 19c 升级
@?/rdbms/admin/catupgrd.sql

-- 或并行升级
@?/rdbms/admin/catctl.pl catupgrd.sql

4.4 编译无效对象

@?/rdbms/admin/utlrp.sql

4.5 升级后检查

-- 1. 查看组件状态
SELECT comp_id, comp_name, version, status 
FROM dba_registry;

-- 2. 查看无效对象
SELECT count(*) FROM dba_objects WHERE status='INVALID';

-- 3. 时区检查
SELECT * FROM v$timezone_file;

5. AutoUpgrade(19c+)

5.1 配置文件

# autoupgrade.cfg
global.autoupg_log_dir=/u01/upgrade/logs
upg1.dbname=ORCL
upg1.source_home=/u01/app/oracle/product/11.2.0/dbhome_1
upg1.target_home=/u01/app/oracle/product/19.3.0/dbhome_1
upg1.sid=ORCL
upg1.log_dir=/u01/upgrade/logs/orcl
upg1.upgrade_node=localhost
upg1.target_version=19.3
upg1.run_utlrp=yes
upg1.timezone_upg=yes

5.2 执行

# 分析
java -jar autoupgrade.jar -config autoupgrade.cfg -mode analyze

# 部署
java -jar autoupgrade.jar -config autoupgrade.cfg -mode deploy

6. Data Pump 升级

6.1 适用场景

  • 跨平台升级
  • 跨字节序升级
  • 清理数据库碎片
  • 整理结构

6.2 流程

# 1. 源库导出
expdp system/pwd DIRECTORY=dpump_dir DUMPFILE=full.dmp FULL=Y

# 2. 目标库安装新版本

# 3. 目标库创建数据库

# 4. 导入
impdp system/pwd DIRECTORY=dpump_dir DUMPFILE=full.dmp FULL=Y

7. PDB 升级

7.1 Unplug/Plug 升级

-- 1. 源 CDB 拔出 PDB
ALTER PLUGGABLE DATABASE hrpdb UNPLUG INTO '/tmp/hrpdb.xml';

-- 2. 目标 CDB(新版本)插入
CREATE PLUGGABLE DATABASE hrpdb USING '/tmp/hrpdb.xml' NOCOPY;

-- 3. 升级模式打开
ALTER PLUGGABLE DATABASE hrpdb OPEN UPGRADE;

-- 4. 升级脚本
ALTER SESSION SET CONTAINER = hrpdb;
@?/rdbms/admin/catctl.pl catupgrd.sql

-- 5. 正常打开
ALTER PLUGGABLE DATABASE hrpdb CLOSE;
ALTER PLUGGABLE DATABASE hrpdb OPEN;

7.2 PDB Relocate 升级(零停机)

-- 19c+ 零停机迁移到新版本
CREATE PLUGGABLE DATABASE hrpdb 
  FROM hrpdb@src_link 
  RELOCATE 
  AVAILABILITY MAX;

8. GoldenGate 零停机升级

8.1 流程

1. 部署 OGG 捕获源库变更
2. 升级目标库(新版本)
3. 初始化数据到新库
4. OGG 同步源库到新库
5. 验证数据一致
6. 切换应用到新库
7. 停止 OGG

详细内容见:Oracle GoldenGate 实时数据复制


9. 升级后操作

9.1 检查组件

SELECT comp_id, comp_name, version, status 
FROM dba_registry
WHERE status != 'VALID';

9.2 编译无效对象

@?/rdbms/admin/utlrp.sql

-- 检查
SELECT count(*) FROM dba_objects WHERE status='INVALID';

9.3 升级时区

@?/rdbms/admin/utltz_upgrade.sql

9.4 升级统计信息

EXEC DBMS_STATS.GATHER_DICTIONARY_STATS;
EXEC DBMS_STATS.GATHER_FIXED_OBJECTS_STATS;

9.5 兼容性参数

-- 检查 compatible
SHOW PARAMETER compatible

-- 升级 compatible(注意:不可回退)
ALTER SYSTEM SET compatible='19.0.0' SCOPE=SPFILE;
SHUTDOWN IMMEDIATE;
STARTUP;

10. 升级回滚

10.1 DBUA 回滚

DBUA 自动创建 Flashback Restore Point,可回滚。

10.2 手动回滚

-- 1. Flashback Database
SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
FLASHBACK DATABASE TO RESTORE POINT BEFORE_UPGRADE;
ALTER DATABASE OPEN RESETLOGS;

10.3 降级(不可逆)

降级到旧版本受限:

-- 仅 compatible 未升级时可降级
-- compatible 已升级则不可降级

11. 常见坑与排错

11.1 升级前检查失败

修复

-- 1. 运行预检查
@?/rdbms/admin/utlumppv.sql

-- 2. 修复警告
-- 3. 清理无效对象
@?/rdbms/admin/utlrp.sql

11.2 ORA-01092: ORACLE 例程终止

修复

# 1. 查看日志
tail -f $ORACLE_BASE/diag/rdbms/$DB_UNIQUE_NAME/$ORACLE_SID/trace/alert_$ORACLE_SID.log

# 2. 启动到 mount
STARTUP MOUNT;

# 3. 检查数据文件
SELECT file_name, status FROM dba_data_files;

11.3 无效对象过多

修复

-- 1. 编译
@?/rdbms/admin/utlrp.sql

-- 2. 检查
SELECT owner, object_name, object_type 
FROM dba_objects WHERE status='INVALID';

-- 3. 手动编译
ALTER PACKAGE pkg_name COMPILE;
ALTER PACKAGE pkg_name COMPILE BODY;

11.4 时区不一致

修复

-- 1. 检查时区
SELECT * FROM v$timezone_file;

-- 2. 升级时区
@?/rdbms/admin/utltz_upgrade.sql

11.5 compatible 升级后无法降级

修复

  • 升级前确保 compatible 未升级
  • 升级后保持旧 compatible 一段时间
  • 测试稳定后再升级 compatible

12. 最佳实践

  1. 升级前备份:RMAN 全备份
  2. 预检查:preupgrade.jar
  3. 生产用 DBUA:简化流程
  4. 19c+ 用 AutoUpgrade:自动化
  5. PDB 升级用 Relocate:零停机
  6. 零停机用 GoldenGate:实时同步
  7. 升级后检查:dba_registry
  8. 编译无效对象:utlrp.sql
  9. 测试完整功能:业务验证
  10. 保留回滚选项:Flashback

13. 参考资料

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

[2] Oracle AutoUpgrade Tool https://docs.oracle.com/en/database/oracle/oracle-database/19/upgrd/using-autoupgrade-oracle-database-upgrades.html