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)是否有错误信息。