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 步骤
- 选择数据库
- 升级前检查
- 选择升级选项
- 恢复选项
- 执行升级
- 升级后检查
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. 最佳实践
- 升级前备份:RMAN 全备份
- 预检查:preupgrade.jar
- 生产用 DBUA:简化流程
- 19c+ 用 AutoUpgrade:自动化
- PDB 升级用 Relocate:零停机
- 零停机用 GoldenGate:实时同步
- 升级后检查:dba_registry
- 编译无效对象:utlrp.sql
- 测试完整功能:业务验证
- 保留回滚选项: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