📌 背景
某业务系统使用 Oracle 12c 标准版数据库(12.2.0.1.0),随着业务发展,需要启用企业版的高级特性(如分区表、高级压缩等)。标准版无法直接通过打补丁升级到企业版,需要通过软件替换的方式实现。
本文记录了完整的迁移过程和踩坑经验。
🔍 环境信息
🗺️ 迁移方案选择
方案对比
| 方案 | 优点 | 风险 |
|---|---|---|
| 原地替换(同一 ORACLE_HOME) | 路径不变,配置简单 | 卸载工具会删除整个目录,数据文件若在目录内则危险 |
| 新目录安装(推荐) | 新旧隔离,可快速回退 | 需要修改环境变量 |
结论 :选择「新目录安装」方案,将新软件安装到独立的 dbhome_2 目录。
| 项目 | 信息 |
|---|---|
| 操作系统 | Linux x86_64 |
| 原数据库版本 | Oracle 12c Standard Edition 12.2.0.1.0 |
| 目标版本 | Oracle 12c Enterprise Edition 12.2.0.1.0 |
| 数据库 SID | PIDB |
| 数据量 | 约 8GB(含 1700 万+ 行大表) |
| 停机窗口 | 约 30 分钟 |
📋 实施步骤
第一阶段:数据备份(安全底线)
# 1. 创建备份目录
mkdir -p /u01/app/oracle/backup
# 2. 创建 Oracle 目录对象
sqlplus / as sysdba
CREATE DIRECTORY backup_dir AS '/u01/app/oracle/backup';
GRANT READ, WRITE ON DIRECTORY backup_dir TO system;
# 3. 执行全库导出
expdp system/******@PIDB \
directory=backup_dir \
dumpfile=full_backup_%u.dmp \
logfile=full_backup.log \
full=y \
parallel=4
第二阶段:检查字符集(避免导入乱码)
SELECT * FROM NLS_DATABASE_PARAMETERS
WHERE PARAMETER IN ('NLS_CHARACTERSET', 'NLS_NCHAR_CHARACTERSET');
结果:
-
NLS_CHARACTERSET=AL32UTF8 -
NLS_NCHAR_CHARACTERSET=AL16UTF16
✅ 目标库采用相同字符集,导入无兼容风险。
第三阶段:安装企业版软件
# 1. 解压安装包
unzip linuxx64_12201_database.zip
# 2. 设置图形界面转发(使用 Xmanager)
export DISPLAY=<客户端IP>:1.0
# 3. 运行安装程序
cd database
./runInstaller
安装选项:
-
安装类型:仅安装数据库软件
-
数据库版本:Enterprise Edition
-
软件位置:
/u01/app/oracle/product/12.2.0/dbhome_2(新目录!)
第四阶段:切换数据库到新软件
# 1. 用旧软件关闭数据库
export ORACLE_HOME=/u01/app/oracle/product/12.2.0/dbhome_1
sqlplus / as sysdba
SQL> SHUTDOWN IMMEDIATE;
# 2. 创建参数文件链接
cd /u01/app/oracle/product/12.2.0/dbhome_2/dbs
ln -s /u01/app/oracle/product/12.2.0/dbhome_1/dbs/spfilePIDB.ora spfilePIDB.ora
# 3. 切换到新软件启动
export ORACLE_HOME=/u01/app/oracle/product/12.2.0/dbhome_2
sqlplus / as sysdba
SQL> STARTUP;
SQL> SELECT * FROM v$version;
第五阶段:切换监听器
# 1. 复制监听器配置
cp /u01/app/oracle/product/12.2.0/dbhome_1/network/admin/listener.ora \
/u01/app/oracle/product/12.2.0/dbhome_2/network/admin/
# 2. 重启监听器
lsnrctl stop
lsnrctl start
第六阶段:验证数据完整性
# 1. 确认版本
sqlplus / as sysdba
SQL> SELECT * FROM v$version;
# 2. 确认数据完整
SQL> SELECT COUNT(*) FROM pdmtobom.INT_OBJECT_RELATION;
-- 应返回 17203240,与导出前一致
第七阶段:配置环境变量
# /home/oracle/.bash_profile
export ORACLE_HOME=/u01/app/oracle/product/12.2.0/dbhome_2
export ORACLE_SID=PIDB
export PATH=$ORACLE_HOME/bin:$PATH
🐛 踩坑记录
坑1:数据泵导出报错 UDE-01017
现象 :expdp 报 ORA-01017: invalid username/password
解决 :system 用户密码错误,用 sys 用户执行:
expdp \'sys/@PIDB as sysdba\' ...
坑2:静默安装图形界面配置
现象 :runInstaller 报 DISPLAY not set
解决:使用 Xmanager 配置 X11 转发:
bash
export DISPLAY=10.4.103.222:1.0
xdpyinfo | grep name # 验证图形通道
坑3:新版本找不到参数文件
现象 :ORA-01078: LRM-00109: could not open parameter file
原因 :参数文件在 dbhome_1/dbs/,新 dbhome_2/dbs/ 目录为空
解决:创建软链接
cd /u01/app/oracle/product/12.2.0/dbhome_2/dbs
ln -s /u01/app/oracle/product/12.2.0/dbhome_1/dbs/spfilePIDB.ora spfilePIDB.ora
坑4:swap 空间不足
现象 :安装检查报 Swap Size: Failed
解决:增加 swap 文件
dd if=/dev/zero of=/swapfile2 bs=1M count=11264
chmod 600 /swapfile2
mkswap /swapfile2
swapon /swapfile2
✅ 最终验证结果
| 检查项 | 结果 |
|---|---|
| 数据库版本 | Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 ✅ |
| 数据库状态 | OPEN / READ WRITE ✅ |
| 数据完整性 | 所有表和数据完好 ✅ |
| 监听器状态 | 正常监听 1521 端口 ✅ |
| 业务连接 | 正常访问 ✅ |