Oracle 升级 19c 实施方案
记录一次生产环境 Oracle 11.2.0.4 升级 19c 的完整实施操作:环境准备、19c 静默安装与补丁、实例创建、数据恢复及紧急回退流程,附上线检查项与风险注意事项。
记录一次生产环境 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 重启系统检查项
- 查看数据库定时建表和删表任务是否已执行。定时任务设定在每天收市后 16:30 执行,若实施操作恰在此期间,实施完成后需要手动执行定时任务;
- oci 库依赖检查。在 bin 目录下使用
ldd命令查看执行文件动态库依赖路径和信息是否正确; - 检查配置表和数据库连接查询是否正常。
七、紧急回退方案
若生产实施过程中出现意想不到的事情,应尽快评估问题复杂性;短时间内无法处理完成时采取回退策略。部署策略保留了旧库及其数据(新库不同目录、同 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 规划。