CentOS系统升级Oracle数据库完整流程
升级前必须对数据库进行完整备份,推荐使用RMAN(Recovery Manager)进行全量备份,确保数据安全。示例命令:
rman target / RMAN> BACKUP DATABASE FORMAT '/u01/backup/%U.bak'; RMAN> BACKUP CURRENT CONTROLFILE;
同时备份/etc/oratab
、listener.ora
、tnsnames.ora
等配置文件。
bin
目录下,如$ORACLE_HOME/bin/preupgrd.sql
)分析现有数据库,生成兼容性报告,提前解决潜在问题(如不兼容的参数、缺失的权限)。通过yum
安装Oracle要求的系统依赖包,避免升级失败:
yum install -y gcc libaio-devel compat-libstdc++-33 elfutils-libelf-devel glibc-devel glibc-headers gcc-c++ libstdc++-devel unixODBC unixODBC-devel ksh
.zip
或.tar.gz
格式);/u01/app/oracle/product/19.0.0/dbhome_1
),并设置正确的权限(chown -R oracle:oinstall /u01/app/oracle
)。升级前需完全停止数据库实例及监听器,避免数据损坏:
# 切换至oracle用户 su - oracle # 停止监听器 lsnrctl stop # 关闭数据库实例(IMMEDIATE模式确保数据一致性) sqlplus / as sysdba <<EOF SHUTDOWN IMMEDIATE; EXIT; EOF
进入新Oracle Home目录,运行安装脚本(图形界面或静默模式):
# 图形界面安装(需X11转发) ./runInstaller # 静默模式安装(适用于自动化部署) ./runInstaller -silent -responseFile /path/to/response_file.rsp
安装完成后,运行opatch apply
应用最新补丁(如CPU、PSU),确保软件安全性。
DBUA是Oracle提供的图形化升级工具,可自动化完成大部分升级步骤,减少人为错误:
# 切换至oracle用户 su - oracle # 启动DBUA(指定新Oracle Home和数据库SID) dbua -silent -upgradeDatabase -sourceDB /u01/app/oracle/product/12.1.0/dbhome_1/dbs/catalog.cat -gdbName ORCLCDB -sid ORCLCDB -memoryTarget 4G -controlFileReUse
或通过命令行启动:
dbua -sid ORCLCDB -oracleHome /u01/app/oracle/product/19.0.0/dbhome_1
DBUA会自动执行预升级检查、升级脚本运行、后升级验证等步骤,升级过程中可通过日志文件($ORACLE_HOME/cfgtoollogs/dbua/logs/
)监控进度。
若需更灵活的控制,可选择手动升级:
# 设置环境变量 export ORACLE_HOME=/u01/app/oracle/product/19.0.0/dbhome_1 export PATH=$ORACLE_HOME/bin:$PATH export ORACLE_SID=ORCLCDB # 运行升级脚本 sqlplus / as sysdba <<EOF STARTUP UPGRADE; @?/rdbms/admin/catctl.pl ?/rdbms/admin/catupgrd.sql; SHUTDOWN IMMEDIATE; STARTUP; EXIT; EOF
catctl.pl
会并行运行升级脚本,缩短停机时间。
sqlplus / as sysdba <<EOF SELECT * FROM v\$version; EXIT; EOF
输出应显示新版本号(如Oracle Database 19c Enterprise Edition Release 19.0.0.0.0
)。
升级后可能存在无效的对象(如存储过程、视图),需修复:
sqlplus / as sysdba <<EOF SET LINESIZE 500 PAGESIZE 600; COL COMP_NAME FOR A30; SELECT COMP_ID, COMP_NAME, VERSION, STATUS FROM DBA_REGISTRY ORDER BY COMP_ID; COL ACTION_TIME FOR A30; COL COMMENTS FOR A30; SELECT ACTION_TIME, ACTION, VERSION, COMMENTS FROM SYS.DBA_REGISTRY_HISTORY ORDER BY ACTION_TIME DESC; SELECT COUNT(*) FROM DBA_OBJECTS WHERE STATUS != 'VALID'; EXIT; EOF
若存在无效对象,可使用utlrp.sql
重新编译:
sqlplus / as sysdba <<EOF @?/rdbms/admin/utlrp.sql; EXIT; EOF
检查$ORACLE_HOME/network/admin
目录下的listener.ora
、tnsnames.ora
是否指向新Oracle Home,确保网络连接正常。
sga_target
、pga_aggregate_target
等参数(如Oracle 19c默认启用自动内存管理);exec dbms_stats.gather_schema_stats(user);
alert.log
($ORACLE_BASE/diag/rdbms/$ORACLE_SID/trace/alert_$ORACLE_SID.log
)是否有错误信息。