本文档风哥主要介绍Oracle手动升级相关知识,包括手动升级的概念、手动升级组成、手动升级使用、手动升级配置、手动升级监控、手动升级故障处理等内容,由风哥教程参考Oracle官方文档Install and Upgrade内容编写,适合DBA人员在学习和测试中使用,如果要应用于生产环境则需要自行确认。
Part01-基础概念与理论知识
1.1 手动升级的概念
Oracle手动升级是指使用SQL脚本和命令行工具手动执行数据库升级过程。手动升级相比DBUA更加灵活,可以更好地控制升级过程,适合有经验的DBA使用。手动升级需要执行预升级检查、升级脚本、升级后验证等步骤。更多视频教程www.fgedu.net.cn
- 灵活控制:可以精确控制升级过程
- 脚本执行:使用SQL脚本执行升级
- 详细日志:生成详细的升级日志
- 问题排查:便于问题排查和调试
- 适合自动化:适合集成到自动化流程
1.2 手动升级组成
Oracle手动升级组成:
- 预升级检查:使用preupgrd.sql检查升级前提条件
- 预升级修复:使用preupgrade_fixups.sql修复问题
- 升级脚本:使用catupgrd.sql执行升级
- 升级后检查:使用utlu122s.sql检查升级结果
- 升级后修复:使用postupgrade_fixups.sql修复问题
1. 预升级检查
– 使用preupgrd.sql
– 检查升级前提条件
– 生成检查报告
– 提供修复建议
– 位于$ORACLE_HOME/rdbms/admin
2. 预升级修复
– 使用preupgrade_fixups.sql
– 自动修复部分问题
– 减少手动操作
– 提高升级效率
– 位于$ORACLE_HOME/rdbms/admin
3. 升级脚本
– 使用catupgrd.sql
– 执行数据库升级
– 升级数据字典
– 升级数据库组件
– 位于$ORACLE_HOME/rdbms/admin
4. 升级后检查
– 使用utlu122s.sql
– 检查升级结果
– 验证组件状态
– 提供修复建议
– 位于$ORACLE_HOME/rdbms/admin
5. 升级后修复
– 使用postupgrade_fixups.sql
– 自动修复升级后问题
– 减少手动操作
– 提高升级效率
– 位于$ORACLE_HOME/rdbms/admin
1.3 手动升级使用
Oracle手动升级使用:
- 标准升级:执行标准的手动升级流程
- 并行升级:使用并行方式加速升级
- 容器数据库升级:升级容器数据库
- 脚本自动化:使用脚本自动化升级
- 问题排查:排查升级过程中的问题
Part02-生产环境规划与建议
2.1 手动升级规划
Oracle手动升级规划要点:
– 升级评估:评估升级的必要性和可行性
– 升级准备:准备升级所需资源
– 升级测试:在测试环境中测试
– 升级执行:执行升级过程
# 升级评估规划
– 版本评估:评估当前版本和目标版本
– 功能评估:评估功能需求
– 性能评估:评估性能需求
– 风险评估:评估升级风险
# 升级准备规划
– 硬件准备:准备硬件资源
– 软件准备:准备软件资源
– 备份准备:准备备份策略
– 时间准备:准备升级时间
# 升级测试规划
– 测试环境:在测试环境中测试
– 测试数据:使用测试数据
– 测试用例:制定测试用例
– 测试验证:验证升级结果
# 升级执行规划
– 升级时间:选择合适的升级时间
– 升级方式:选择合适的升级方式
– 升级监控:监控升级过程
– 升级验证:验证升级结果
2.2 手动升级场景
Oracle手动升级场景:
- 标准升级:执行标准的手动升级流程
- 并行升级:使用并行方式加速升级
- 容器数据库升级:升级容器数据库
- 脚本自动化:使用脚本自动化升级
- 问题排查:排查升级过程中的问题
1. 标准升级
– 执行标准的手动升级流程
– 最常见的升级场景
– 操作规范
– 时间适中
– 风险可控
2. 并行升级
– 使用并行方式加速升级
– 适合大型数据库
– 升级时间短
– 资源消耗大
– 风险适中
3. 容器数据库升级
– 升级容器数据库
– 支持多租户架构
– 同时升级所有PDB
– 操作复杂
– 风险适中
4. 脚本自动化
– 使用脚本自动化升级
– 适合批量升级
– 操作简单
– 效率高
– 风险较低
5. 问题排查
– 排查升级过程中的问题
– 适合故障处理
– 操作复杂
– 需要经验
– 风险较高
2.3 手动升级最佳实践
Oracle手动升级最佳实践:
- 充分测试:在测试环境中充分测试
- 备份数据:升级前备份数据
- 文档记录:记录升级过程
- 回滚方案:制定回滚方案
- 经验总结:总结升级经验
Part03-生产环境项目实施方案
3.1 手动升级配置
3.1.1 执行手动升级
$ export ORACLE_HOME=/oracle/app/oracle/product/19c/dbhome_1
export ORACLE_SID=FGEDUDB
export PATH=$ORACLE_HOME/bin:$PATH
# 2. 运行预升级检查
$ cd $ORACLE_HOME/rdbms/admin
$ sqlplus / as sysdba @preupgrd.sql
Loading Pre-Upgrade Package…
***************************************************************************
Executing Pre-Upgrade Checks in FGEDUDB…
***************************************************************************
**********************************************************************
[Pre-Upgrade Checks]
**********************************************************************
** WARNING: TBD/INVALID OBJECTS FOUND **
The database contains TBD/INVALID objects.
Number of Invalid Objects: 5
** WARNING: OLD TIME ZONE FILE VERSION **
Database is using time zone file version 26
Target database will use time zone file version 32
**********************************************************************
[Pre-Upgrade Recommendations]
**********************************************************************
1. Purge DBA_RECYCLEBIN before upgrade.
The database has 100 objects in DBA_RECYCLEBIN.
Execute: PURGE DBA_RECYCLEBIN;
2. Gather dictionary statistics before upgrade.
Execute: EXEC DBMS_STATS.GATHER_DICTIONARY_STATS;
SQL> exit
# 3. 执行预升级修复
$ sqlplus / as sysdba @preupgrade_fixups.sql
Executing Pre-Upgrade Fixup Scripts…
***************************************************************************
**********************************************************************
[Pre-Upgrade Fixup Scripts]
**********************************************************************
Fixup 1: Purge DBA_RECYCLEBIN
Executing: PURGE DBA_RECYCLEBIN;
Result: SUCCESS
Fixup 2: Gather Dictionary Statistics
Executing: EXEC DBMS_STATS.GATHER_DICTIONARY_STATS;
Result: SUCCESS
SQL> exit
# 4. 备份数据库
$ rman target /
RMAN> backup database plus archivelog;
Starting backup at 2026-03-31 10:00:00
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=150 device type=DISK
channel ORA_DISK_1: starting full datafile backup set
channel ORA_DISK_1: specifying datafile(s) in backup set
input datafile file number=00001 name=/oracle/app/oracle/oradata/FGEDUDB/system01.dbf
input datafile file number=00002 name=/oracle/app/oracle/oradata/FGEDUDB/sysaux01.dbf
input datafile file number=00003 name=/oracle/app/oracle/oradata/FGEDUDB/undotbs01.dbf
input datafile file number=00004 name=/oracle/app/oracle/oradata/FGEDUDB/users01.dbf
channel ORA_DISK_1: starting piece 1 at 2026-03-31 10:00:00
channel ORA_DISK_1: finished piece 1 at 2026-03-31 10:05:00
piece handle=/backup/FGEDUDB_full_20260331_100000 tag=TAG20260331T100000 comment=NONE
channel ORA_DISK_1: backup set complete, elapsed time: 00:05:00
Finished backup at 2026-03-31 10:05:00
RMAN> exit
# 5. 关闭数据库
$ sqlplus / as sysdba
SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
# 6. 启动数据库到升级模式
SQL> startup upgrade
ORACLE instance started.
Total System Global Area 5368709120 bytes
Fixed Size 8710176 bytes
Variable Size 1090519040 bytes
Database Buffers 4261412864 bytes
Redo Buffers 8069120 bytes
Database mounted.
Database opened.
# 7. 执行升级脚本
SQL> @?/rdbms/admin/catupgrd.sql
SQL> SET ECHO OFF
.
.
.
Oracle Database 19c Post-Upgrade Status Tool 03-31-2026 10:30:00
.
Component Current Version Elapsed Time
Name Status Number HH:MM:SS
.
Oracle Server UPGRADED 19.3.0.0.0 00:15:00
JServer JAVA Virtual Machine UPGRADED 19.3.0.0.0 00:02:00
Oracle XDK UPGRADED 19.3.0.0.0 00:01:00
Oracle Database Java Packages UPGRADED 19.3.0.0.0 00:01:00
.
Total Upgrade Time: 00:19:00
.
PL/SQL procedure successfully completed.
SQL> exit
# 8. 重启数据库
$ sqlplus / as sysdba
SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup
ORACLE instance started.
Total System Global Area 5368709120 bytes
Fixed Size 8710176 bytes
Variable Size 1090519040 bytes
Database Buffers 4261412864 bytes
Redo Buffers 8069120 bytes
Database mounted.
Database opened.
# 9. 执行升级后检查
SQL> @?/rdbms/admin/utlu122s.sql
Oracle Database 19c Post-Upgrade Status Tool 03-31-2026 10:35:00
.
Component Current Version Elapsed Time
Name Status Number HH:MM:SS
.
Oracle Server VALID 19.3.0.0.0 00:15:00
JServer JAVA Virtual Machine VALID 19.3.0.0.0 00:02:00
Oracle XDK VALID 19.3.0.0.0 00:01:00
Oracle Database Java Packages VALID 19.3.0.0.0 00:01:00
.
Total Upgrade Time: 00:19:00
.
PL/SQL procedure successfully completed.
# 10. 执行升级后修复
SQL> @?/rdbms/admin/postupgrade_fixups.sql
Executing Post-Upgrade Fixup Scripts…
***************************************************************************
**********************************************************************
[Post-Upgrade Fixup Scripts]
**********************************************************************
Fixup 1: Recompile Invalid Objects
Executing: @?/rdbms/admin/utlrp.sql;
Result: SUCCESS
Fixup 2: Update COMPATIBLE Parameter
Current COMPATIBLE: 12.2.0
Recommended COMPATIBLE: 19.0.0
Action: Update COMPATIBLE parameter manually
SQL> exit
# 11. 编译无效对象
$ sqlplus / as sysdba @?/rdbms/admin/utlrp.sql
TIMESTAMP
——————————————————————————–
COMP_TIMESTAMP UTLRP_BGN 2026-03-31 10:40:00
PL/SQL procedure successfully completed.
TIMESTAMP
——————————————————————————–
COMP_TIMESTAMP UTLRP_END 2026-03-31 10:45:00
PL/SQL procedure successfully completed.
# 12. 验证升级结果
SQL> select * from v$version;
BANNER
——————————————————————————–
Oracle Database 19c Enterprise Edition Release 19.3.0.0.0 – Production
SQL> select comp_name, version, status from dba_registry;
COMP_NAME VERSION STATUS
—————————————- —————————— ————
Oracle Server 19.3.0.0.0 VALID
JServer JAVA Virtual Machine 19.3.0.0.0 VALID
Oracle XDK 19.3.0.0.0 VALID
Oracle Database Java Packages 19.3.0.0.0 VALID
SQL> select count(*) from dba_objects where status = ‘INVALID’;
COUNT(*)
———-
0
3.1.2 使用并行升级
SQL> alter system set cpu_count = 8 scope=spfile;
System altered.
SQL> alter system set parallel_max_servers = 16 scope=spfile;
System altered.
# 2. 重启数据库到升级模式
SQL> shutdown immediate;
SQL> startup upgrade;
# 3. 执行并行升级
SQL> @?/rdbms/admin/catupgrd.sql parallel=8
SQL> SET ECHO OFF
.
.
.
Oracle Database 19c Post-Upgrade Status Tool 03-31-2026 10:30:00
.
Component Current Version Elapsed Time
Name Status Number HH:MM:SS
.
Oracle Server UPGRADED 19.3.0.0.0 00:10:00
JServer JAVA Virtual Machine UPGRADED 19.3.0.0.0 00:01:00
Oracle XDK UPGRADED 19.3.0.0.0 00:00:30
Oracle Database Java Packages UPGRADED 19.3.0.0.0 00:00:30
.
Total Upgrade Time: 00:12:00
.
PL/SQL procedure successfully completed.
# 4. 验证并行升级效果
— 升级时间从19分钟减少到12分钟
— 并行度越高,升级时间越短
— 但资源消耗也越大
3.2 手动升级监控
3.2.1 配置手动升级监控脚本
$ vi /home/oracle/scripts/monitor_manual_upgrade.sh
#!/bin/bash
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn
# 手动升级监控脚本
export ORACLE_HOME=/oracle/app/oracle/product/19c/dbhome_1
export ORACLE_SID=FGEDUDB
export PATH=$ORACLE_HOME/bin:$PATH
LOG_DIR=”/home/oracle/manual_upgrade_monitor”
mkdir -p $LOG_DIR
DATE=$(date +%Y%m%d)
LOG_FILE=”$LOG_DIR/manual_upgrade_monitor_$DATE.log”
echo “$(date): Starting manual upgrade monitor…” > $LOG_FILE
# 检查升级状态
sqlplus -s / as sysdba <
set linesize 200
set pagesize 100
— 检查数据库版本
select * from v\$version;
— 检查组件状态
select comp_name, version, status from dba_registry;
— 检查无效对象
select count(*) from dba_objects where status = ‘INVALID’;
— 检查升级进度
select * from dba_registry_log order by timestamp desc fetch first 10 rows only;
exit
EOF
echo “$(date): Manual upgrade monitor completed.” >> $LOG_FILE
# 发送报告
mail -s “Manual Upgrade Monitor Report – $DATE” admin@fgedu.net.cn < $LOG_FILE
# 2. 设置脚本权限
$ chmod +x /home/oracle/scripts/monitor_manual_upgrade.sh
# 3. 测试脚本
$ /home/oracle/scripts/monitor_manual_upgrade.sh
# 4. 设置定期监控
$ crontab -e
# 每小时监控升级状态
0 * * * * /home/oracle/scripts/monitor_manual_upgrade.sh >> /home/oracle/manual_upgrade_monitor/cron.log 2>&1
3.3 手动升级故障处理
3.3.1 手动升级常见问题
# 错误信息
ORA-04063: package body “SYS.DBMS_REGISTRY” has errors
# 解决方案
# 1. 查看错误详情
SQL> select * from dba_errors where owner = ‘SYS’ and name = ‘DBMS_REGISTRY’;
# 2. 重新编译
SQL> alter package SYS.DBMS_REGISTRY compile body;
# 3. 重新运行升级脚本
SQL> @?/rdbms/admin/catupgrd.sql;
# 问题2:组件升级失败
# 错误信息
Component Current Version Elapsed Time
Name Status Number HH:MM:SS
.
Oracle Server INVALID 19.3.0.0.0 00:15:00
# 解决方案
# 1. 查看组件日志
$ cat /oracle/app/oracle/cfgtoollogs/FGEDUDB/upgrade/catupgrd*.log
# 2. 手动修复组件
SQL> @?/rdbms/admin/prvtrcat.plb;
# 3. 重新编译
SQL> @?/rdbms/admin/utlrp.sql;
# 问题3:数据库无法启动
# 错误信息
ORA-01092: ORACLE instance terminated. Disconnection forced
# 解决方案
# 1. 查看告警日志
$ cat /oracle/app/oracle/diag/rdbms/fgedudb/FGEDUDB/trace/alert_FGEDUDB.log
# 2. 恢复备份
RMAN> startup nomount;
RMAN> restore controlfile from ‘/backup/control_file_backup’;
RMAN> alter database mount;
RMAN> restore database;
RMAN> recover database;
RMAN> alter database open resetlogs;
Part04-生产案例与实战讲解
4.1 手动升级案例
在生产环境中执行手动升级的完整案例:
4.1.1 场景描述
某企业需要将Oracle数据库从12.2升级到19c,使用手动升级方式。
4.1.2 分析步骤
$ vi /home/oracle/scripts/auto_manual_upgrade.sh
#!/bin/bash
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn
# 手动升级自动化脚本
export ORACLE_HOME=/oracle/app/oracle/product/19c/dbhome_1
export ORACLE_SID=FGEDUDB
export PATH=$ORACLE_HOME/bin:$PATH
LOG_DIR=”/home/oracle/manual_upgrade”
mkdir -p $LOG_DIR
DATE=$(date +%Y%m%d_%H%M%S)
LOG_FILE=”$LOG_DIR/manual_upgrade_$DATE.log”
echo “========================================” > $LOG_FILE
echo “Manual Upgrade Report” >> $LOG_FILE
echo “Date: $(date)” >> $LOG_FILE
echo “========================================” >> $LOG_FILE
# 运行预升级检查
echo “” >> $LOG_FILE
echo “Running pre-upgrade checks…” >> $LOG_FILE
sqlplus -s / as sysdba @?/rdbms/admin/preupgrd.sql >> $LOG_FILE
# 运行预升级修复
echo “” >> $LOG_FILE
echo “Running pre-upgrade fixups…” >> $LOG_FILE
sqlplus -s / as sysdba @?/rdbms/admin/preupgrade_fixups.sql >> $LOG_FILE
# 备份数据库
echo “” >> $LOG_FILE
echo “Backing up database…” >> $LOG_FILE
rman target / <
backup database plus archivelog;
EOF
# 执行升级
echo “” >> $LOG_FILE
echo “Running upgrade…” >> $LOG_FILE
sqlplus -s / as sysdba <
shutdown immediate;
startup upgrade;
@?/rdbms/admin/catupgrd.sql;
shutdown immediate;
startup;
@?/rdbms/admin/utlu122s.sql;
@?/rdbms/admin/postupgrade_fixups.sql;
@?/rdbms/admin/utlrp.sql;
EOF
# 验证升级结果
echo “” >> $LOG_FILE
echo “Verifying upgrade…” >> $LOG_FILE
sqlplus -s / as sysdba <
set linesize 200
set pagesize 100
select * from v\$version;
select comp_name, version, status from dba_registry;
select count(*) from dba_objects where status = ‘INVALID’;
EOF
echo “” >> $LOG_FILE
echo “Manual upgrade completed at $(date)” >> $LOG_FILE
# 发送报告
mail -s “Manual Upgrade Report – $DATE” admin@fgedu.net.cn < $LOG_FILE
# 2. 设置脚本权限
$ chmod +x /home/oracle/scripts/auto_manual_upgrade.sh
# 3. 测试脚本
$ /home/oracle/scripts/auto_manual_upgrade.sh
4.2 手动升级故障处理
在手动升级故障处理过程中的方法和技巧:
4.2.1 故障处理流程
# 1. 识别问题
# – 查看升级日志
# – 查看错误信息
# – 检查数据库状态
# 2. 收集信息
# – 收集错误信息
# – 收集诊断数据
# – 收集系统信息
# 3. 分析原因
# – 分析错误原因
# – 分析升级过程
# – 分析配置问题
# 4. 制定方案
# – 制定修复方案
# – 制定回滚方案
# – 制定预防措施
# 5. 执行修复
# – 执行修复操作
# – 验证修复结果
# – 记录修复过程
# 示例:处理升级脚本执行失败
# 1. 识别问题
$ cat /oracle/app/oracle/cfgtoollogs/FGEDUDB/upgrade/catupgrd*.log
# 2. 收集信息
SQL> select * from dba_errors;
# 3. 分析原因
— 包体编译失败
# 4. 制定方案
— 重新编译包体
# 5. 执行修复
SQL> alter package SYS.DBMS_REGISTRY compile body;
SQL> @?/rdbms/admin/catupgrd.sql;
4.3 手动升级优化
优化手动升级配置的最佳实践:
4.3.1 优化手动升级管理
SQL> create or replace procedure manage_manual_upgrade_results(
p_upgrade_date in date,
p_source_version in varchar2,
p_target_version in varchar2,
p_upgrade_status in varchar2
) as
begin
dbms_output.put_line(‘— Manual Upgrade Results Management —‘);
dbms_output.put_line(‘Upgrade Date: ‘ || to_char(p_upgrade_date, ‘YYYY-MM-DD HH24:MI:SS’));
dbms_output.put_line(‘Source Version: ‘ || p_source_version);
dbms_output.put_line(‘Target Version: ‘ || p_target_version);
dbms_output.put_line(‘Upgrade Status: ‘ || p_upgrade_status);
— 可以扩展为记录到表中
end manage_manual_upgrade_results;
/
Procedure created.
# 2. 执行管理存储过程
SQL> set serveroutput on
SQL> exec manage_manual_upgrade_results(sysdate, ‘12.2.0.1’, ‘19.3.0.0’, ‘SUCCESS’);
— Manual Upgrade Results Management —
Upgrade Date: 2026-03-31 10:00:00
Source Version: 12.2.0.1
Target Version: 19.3.0.0
Upgrade Status: SUCCESS
PL/SQL procedure successfully completed.
# 3. 创建手动升级历史表
SQL> create table manual_upgrade_history (
id number primary key,
upgrade_date date,
source_version varchar2(50),
target_version varchar2(50),
upgrade_status varchar2(50),
upgrade_duration number,
notes varchar2(4000)
);
Table created.
SQL> create sequence manual_upgrade_history_seq;
Sequence created.
# 4. 记录升级历史
SQL> insert into manual_upgrade_history values (
manual_upgrade_history_seq.nextval,
sysdate,
‘12.2.0.1’,
‘19.3.0.0’,
‘SUCCESS’,
120,
‘Manual upgrade from 12.2 to 19c’
);
1 row created.
SQL> commit;
Commit complete.
# 5. 查看升级历史趋势
SQL> column upgrade_date format a20
SQL> select upgrade_date, source_version, target_version, upgrade_status
from manual_upgrade_history
order by upgrade_date desc
fetch first 12 rows only;
UPGRADE_DATE SOURCE_VERSION TARGET_VERSION UPGRADE_STATUS
——————– ————– ————– —————
2026-03-31 10:00:00 12.2.0.1 19.3.0.0 SUCCESS
2026-03-30 10:00:00 12.1.0.2 19.3.0.0 SUCCESS
2026-03-29 10:00:00 11.2.0.4 19.3.0.0 SUCCESS
Part05-风哥经验总结与分享
5.1 手动升级总结
Oracle手动升级适合有经验的DBA,具有以下特点:
- 灵活控制:可以精确控制升级过程
- 脚本执行:使用SQL脚本执行升级
- 详细日志:生成详细的升级日志
- 问题排查:便于问题排查和调试
- 适合自动化:适合集成到自动化流程
5.2 手动升级检查清单
Oracle手动升级检查清单:
- 充分测试:在测试环境中充分测试
- 备份数据:升级前备份数据
- 文档记录:记录升级过程
- 回滚方案:制定回滚方案
- 经验总结:总结升级经验
- 定期检查:定期检查升级状态
5.3 手动升级工具推荐
Oracle手动升级工具推荐:
- catupgrd.sql:手动升级脚本
- preupgrd.sql:预升级检查工具
- utlrp.sql:对象编译脚本
- RMAN:备份恢复工具
- Shell脚本:自动化升级过程
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
