记录一次生产环境 Oracle 11.2.0.4 升级 19c 的完整实施操作, 生产库由 Oracle 11.2.0.4 升级到 19c(打补丁后为 19.13),主备库同步升级,随后部署 ADG 同城灾备(见《Oracle ADG 部署方案》)。本文覆盖环境信息、前提准备、19c 安装、实例创建、数据恢复、上线检查与紧急回退。

一、环境信息

1.1 当前环境(Oracle 11.2.0.4 + OGG)

项目 主库(源端) 备库(目标端)
操作系统 linux linux
数据库版本 11.2.0.4 11.2.0.4
IP 地址 192.168.66.71 192.168.35.71
ORACLE_HOME /database/oracle_11/app/oracle/product/11.2.0/db_1 同左
ORACLE_SID nova nova
安装用户 oracle oracle
OGG 版本 19.1.0.0.4 19.1.0.0.4
OGG 安装路径 /data/ogg/ogg_source 同左
OGG 数据用户 oggadmin oggadmin
表空间路径 /data/database/oracle_11/app/oradata/nova/ 同左
DUMP_DIR 路径 /data/database/data_pump 同左

1.2 19c 目标环境

项目 主库 备库
安装包位置 /data/ora19c/software/ 同左
ORACLE_HOME /data/ora19c/app/oracle/product/19.0.0/dbhome_1 同左
安装位置(Inventory) /data/ora19c/app/oraInventory 同左
ORACLE_SID nova nova
数据/控制文件位置 /data/ora19c/oradata/NOVA/ 同左
归档日志位置 /data/ora19c/oradata/NOVA/archive 同左
安装用户 oracle oracle

升级策略:新旧库共用 SID、分目录部署,通过环境变量切换,保留 11g 环境以便紧急回退(见第七章)。

二、前提准备

升级前先停用依赖该库的业务系统(本文不涉及业务系统的启停操作)。

2.1 备份主数据库(备库不用备份)

使用 oracle 用户登录主库服务器,执行全库导出:

expdp system/<password> directory=DUMP_DIR dumpfile=expdp_orav1_tables_1007%U.dmp \
parallel=4 logfile=expdp_orav1_tables_1007.log full=y

2.2 关闭主备 OGG 同步

主库(192.168.66.71):

cd /data/ogg/ogg_source
./ggsci
GGSCI> stop extorav1
GGSCI> stop porav1
GGSCI> stop mgr

备库(192.168.35.71):

cd /data/ogg/ogg_source
./ggsci
GGSCI> stop rorav1
GGSCI> stop mgr

2.3 关闭主备数据库

lsnrctl stop
sqlplus / as sysdba
SQL> shutdown immediate

2.4 上传软件安装包

mkdir /data/ora19c            # 权限不足时切 root 创建,再改回 oracle 属主
# 使用 ftcp 将 software.zip 上传到 /data/ora19c/ 目录
cd /data/ora19c
md5sum software.zip           # 比对 md5
unzip software.zip

2.5 增加 swap 分区大小

19c 对内存要求更高,增加 16GB swap(root 执行):

dd if=/dev/zero of=/var/swapfile bs=1024 count=16384000
mkswap /var/swapfile
swapon /var/swapfile
chmod 0600 /var/swapfile
# 写入 /etc/fstab 持久化
/var/swapfile swap swap defaults 0 0
mount -a
free -h                       # 查看 swap 分区大小

三、安装 Oracle 19c

主备服务器(192.168.66.71 / 192.168.35.71)均需安装。先以 root 执行系统级操作,再切换 su - oracle 执行安装。

3.1 卸载冲突包

冲突原因是 19c 预安装包与 11g 预安装包冲突:

rpm -e pdksh-5.2.14-36.el5.x86_64

3.2 更新 sysstat、libaio 包

yum update sysstat
yum update libaio

3.3 创建数据库相关目录

mkdir -p /data/ora19c/app/oracle/product/19.0.0/dbhome_1
mkdir -p /data/ora19c/scripts
mkdir -p /data/ora19c/oradata
mkdir -p /data/ora19c/data_pump

3.4 设置环境变量脚本

主库 ORACLE_UNQNAME=nova,备库 ORACLE_UNQNAME=nova_disa:

touch /data/ora19c/scripts/setEnv.sh
cat > /data/ora19c/scripts/setEnv.sh << 'EOF'
#!/bin/bash
export TMP=/tmp
export TMPDIR=$TMP
export ORACLE_HOSTNAME=<按服务器实际配置>
export ORACLE_UNQNAME=<按主备角色配置>
export ORACLE_BASE=/data/ora19c/app/oracle
export ORACLE_HOME=$ORACLE_BASE/product/19.0.0/dbhome_1
export ORA_INVENTORY=/data/ora19c/app/oraInventory
export ORACLE_SID=nova
export DATA_DIR=/data/ora19c/oradata
export PATH=/usr/sbin:/usr/local/bin:$PATH
export PATH=$ORACLE_HOME/bin:$PATH
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib
export CLASSPATH=$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib
EOF

3.5 修改 oracle 用户 ~/.bash_profile

cd ~/
cp -a .bash_profile .bash_profile.20230218
vim .bash_profile

注释掉 11g 相关配置(ORACLE_BASE / ORACLE_HOME / ORACLE_SID / PATH / LD_LIBRARY_PATH / LANG 等),添加:

source /data/ora19c/scripts/setEnv.sh

验证是否生效:

source ~/.bash_profile
echo $ORACLE_BASE        # 应为 /data/ora19c/app/oracle

3.6 执行前置条件预安装包

su - root
cd /data/ora19c/software
yum -y localinstall oracle-database-preinstall-19c-1.0-1.el7.x86_64.rpm

3.7 解压 Oracle 安装包到 ORACLE_HOME

su - oracle
cd $ORACLE_HOME
unzip -oq /data/ora19c/software/LINUX.X64_193000_db_home.zip

3.8 静默安装数据库软件

cd $ORACLE_HOME
./runInstaller -ignorePrereq -waitforcompletion -silent \
-responseFile ${ORACLE_HOME}/install/response/db_install.rsp \
oracle.install.option=INSTALL_DB_SWONLY \
ORACLE_HOSTNAME=${ORACLE_HOSTNAME} \
UNIX_GROUP_NAME=oinstall \
INVENTORY_LOCATION=${ORA_INVENTORY} \
SELECTED_LANGUAGES=en,zh_CN \
ORACLE_HOME=${ORACLE_HOME} \
ORACLE_BASE=${ORACLE_BASE} \
oracle.install.db.InstallEdition=EE \
oracle.install.db.OSDBA_GROUP=dba \
oracle.install.db.OSBACKUPDBA_GROUP=dba \
oracle.install.db.OSDGDBA_GROUP=dba \
oracle.install.db.OSKMDBA_GROUP=dba \
oracle.install.db.OSRACDBA_GROUP=dba \
SECURITY_UPDATES_VIA_MYORACLESUPPORT=false \
DECLINE_SECURITY_UPDATES=true

3.9 root 用户执行配置脚本

su - root
sh /data/ora19c/app/oracle/product/19.0.0/dbhome_1/root.sh

3.10 升级 OPatch 并打补丁

su - oracle
cd $ORACLE_HOME
mv OPatch OPatch20230218
unzip -oq /data/ora19c/software/p6880880_210000_Linux-x86-64.zip
export PATH=$PATH:$ORACLE_HOME/OPatch

按补丁目录顺序执行,每个补丁先做冲突检查再应用:

cd /data/ora19c/software/patch
opatch prereq CheckConflictAgainstOHWithDetail -phBaseDir 33192793/
opatch apply 33192793/
opatch prereq CheckConflictAgainstOHWithDetail -phBaseDir 29213893/
opatch apply 29213893/
opatch prereq CheckConflictAgainstOHWithDetail -phBaseDir 33446866/
opatch apply 33446866/
opatch prereq CheckConflictAgainstOHWithDetail -phBaseDir 33430025/
opatch apply 33430025/
opatch prereq CheckConflictAgainstOHWithDetail -phBaseDir 33349744/
opatch apply 33349744/
opatch prereq CheckConflictAgainstOHWithDetail -phBaseDir 33415279/
opatch apply 33415279/
opatch prereq CheckConflictAgainstOHWithDetail -phBaseDir 33457235/
opatch apply 33457235/
opatch prereq CheckConflictAgainstOHWithDetail -phBaseDir 33550827/
opatch apply 33550827/
opatch prereq CheckConflictAgainstOHWithDetail -phBaseDir 33736710/
opatch apply 33736710/
opatch prereq CheckConflictAgainstOHWithDetail -phBaseDir 33830283/
opatch apply 33830283/
opatch prereq CheckConflictAgainstOHWithDetail -phBaseDir 32893951/
opatch apply 32893951/
opatch prereq CheckConflictAgainstOHWithDetail -phBaseDir 33334404/
opatch apply 33334404/
opatch prereq CheckConflictAgainstOHWithDetail -phBaseDir 33163187/
opatch apply 33163187/

四、主库创建实例

只在主库服务器创建实例,备库后续通过 RMAN 复制(见 ADG 方案)。参数说明:

  • memoryMgmtType 使用 auto_sga(物理内存超过 4GB 时);
  • memoryPercentage 设 60%:服务器上还有 importdb 服务与操作系统,需预留内存(当前内存预警阈值为 80%);
  • redoLogFileSize 先设 1024MB,运行一段时间后执行 select optimal_logfile_size from v$instance_recovery; 查看最优大小再调整。
chmod -vR u+x $ORACLE_HOME/jdk/jre/bin/     # 若遇到权限不足,先赋予权限
dbca -silent -createDatabase \
-templateName General_Purpose.dbc \
-gdbname ${ORACLE_SID} -sid ${ORACLE_SID} -responseFile NO_VALUE \
-characterSet AL32UTF8 \
-sysPassword <password> \
-systemPassword <password> \
-memoryMgmtType auto_sga \
-memoryPercentage 60 \
-storageType FS \
-datafileDestination "${DATA_DIR}" \
-redoLogFileSize 1024

五、恢复主库数据

5.1 创建 dump_dir 目录

mkdir -p /data/ora19c/data_pump
sqlplus / as sysdba
SQL> create directory DUMP_DIR as '/data/ora19c/data_pump';
SQL> grant read, write on directory DUMP_DIR to system;

5.2 创建用户表空间

备份与恢复的数据库目录不同(路径不一致),需先创建好表空间位置,再按 schemas 导入指定用户数据:

cd /data/ora19c/software
sqlplus / as sysdba
SQL> @tbl.sql NOVA3
SQL> @tbl.sql NOVA3_DISA

5.3 导入数据

按 schemas 导入,可过滤掉 oggadmin 等非业务用户的数据:

mv /data/database/data_pump/* /data/ora19c/data_pump
impdp system/<password> directory=DUMP_DIR schemas=nova3,nova3_disa \
dumpfile=expdp_orav1_tables_1007%U.dmp parallel=4 \
logfile=impdp_orav1_tables_1007.log table_exists_action=replace

5.4 验证

使用 pl/sql 工具登录,检查业务数据是否完整恢复。

六、上线流程与检查

序号 时间 内容
1 2023/02/18 按本文方案升级数据库(11g → 19c)
2 2023/02/18 按《Oracle ADG 部署方案》部署 ADG
3 2023/02/18 按 ADG 方案第四章替换 oci 库

6.1 数据库配置表修改流程

一、使用 plsql 备份配置表数据 nova3.cfg_network 表和 nova3_disa.cfg_path;

二、修改 nova3_disa.cfg_path 表数据:

update nova3_disa.cfg_path t set t.point1 = 122 where t.id = 17;
commit;
select * from nova3_disa.cfg_path t where t.id = 17;    -- 检查修改是否生效

三、修改 nova3.cfg_network 配置表,按需求将席位登录 IP 录入。

6.2 重启系统检查项

  1. 查看数据库定时建表和删表任务是否已执行。定时任务设定在每天收市后 16:30 执行,若实施操作恰在此期间,实施完成后需要手动执行定时任务;
  2. oci 库依赖检查。在 bin 目录下使用 ldd 命令查看执行文件动态库依赖路径和信息是否正确;
  3. 检查配置表和数据库连接查询是否正常。

七、紧急回退方案

若生产实施过程中出现意想不到的事情,应尽快评估问题复杂性;短时间内无法处理完成时采取回退策略。部署策略保留了旧库及其数据(新库不同目录、同 SID、环境变量切换),回退无需删除数据。

7.1 停止主备 19c 数据库

lsnrctl stop
sqlplus / as sysdba
SQL> shutdown immediate

7.2 恢复环境变量

su - oracle
cd ~
cp -a .bash_profile.20230218 .bash_profile

7.3 恢复被卸载/更新的包

# 卸载 19c 相关包
su - root
rpm -e oracle-database-preinstall-19c-1.0-1.el7.x86_64
rpm -e ksh-20120801-144.el7_9.x86_64
# 恢复 pdksh
cd /data/ora19c/software
unzip Oracle11gr2_depend.zip
cd Oracle11gr2_depend
rpm -i pdksh-5.2.14-36.el5.x86_64.rpm
# 降级 sysstat / libaio
cd /data/ora19c/software
rpm -Uvh --oldpackage sysstat-7.0.2-3.el5_5.1.x86_64.rpm
rpm -Uvh --oldpackage libaio-0.3.106-5.x86_64.rpm libaio-devel-0.3.106-5.x86_64.rpm
# 检查
rpm -qa | grep sysstat
rpm -qa | grep libaio

7.4 恢复监听并启动 11g 数据库

lsnrctl start
sqlplus / as sysdba
SQL> startup

7.5 恢复 OGG 主备同步

主库:

cd /data/ogg/ogg_source
./ggsci
GGSCI> start mgr
GGSCI> dblogin userid ggadmin, password <password>
GGSCI> start extorav1
GGSCI> start porav1

备库:

cd /data/ogg/ogg_source
./ggsci
GGSCI> start mgr
GGSCI> dblogin userid ggadmin, password <password>
GGSCI> start rorav1

检查同步状态:info all 查看各进程同步状态是否正常。

八、风险与注意事项

  • 备份与停 OGG 的顺序:expdp 备份完成后才停止 OGG 同步,备份点之后的增量变更不在 dump 中(19c 侧会缺失这部分数据,11g 回退侧由 OGG trail 补齐)。严格变更窗口应先停同步再备份,或提前评估增量数据量。
  • 密码管理:原实施文档使用弱口令,生产环境应使用强口令并纳入密码管理,本文一律以 <password> 占位。
  • 回退演练:回退流程未在测试环境完整演练,正式上线前建议演练一次。
  • 升级后运维:上线后需补充 RMAN 备份策略、归档日志清理及 FRA 规划。