Skip to content

Oracle 多版本共存

Oracle 多版本共存概述

在企业生产环境中,由于业务系统升级、测试需求或兼容性考虑,常常需要在同一台服务器上部署多个不同版本的Oracle数据库。Oracle多版本共存可以帮助企业:

  • 平滑过渡:在升级到新版本前,先在同一服务器上部署并测试新版本
  • 兼容性测试:验证应用程序在不同Oracle版本下的兼容性
  • 资源共享:充分利用服务器资源,减少硬件成本
  • 快速回滚:在新版本出现问题时,可以快速切换回旧版本

多版本共存的挑战

  • 环境变量冲突:不同版本的Oracle使用不同的环境变量
  • 监听配置冲突:默认监听端口都是1521
  • 资源竞争:多个数据库实例共享服务器CPU、内存和磁盘资源
  • 版本间兼容性:不同版本的Oracle在SQL语法、数据类型和特性上存在差异
  • 维护复杂度:需要同时维护多个版本的Oracle实例

多版本共存架构设计

物理架构

在Linux环境中,Oracle多版本共存通常采用以下物理架构:

  1. 独立的ORACLE_HOME:每个版本的Oracle安装在不同的目录下
  2. 独立的Oracle用户:每个版本使用不同的Oracle用户(推荐)
  3. 独立的监听端口:每个版本使用不同的监听端口
  4. 独立的实例名:每个实例使用唯一的实例名
  5. 独立的表空间文件:每个实例的表空间文件存储在不同的目录下

逻辑架构

  • 环境变量隔离:通过不同的profile文件管理每个版本的环境变量
  • 监听隔离:每个版本使用独立的listener.ora文件
  • 服务隔离:每个版本的Oracle服务独立管理

安装准备和注意事项

硬件要求

  • 确保服务器有足够的CPU、内存和磁盘空间
  • 建议为每个Oracle版本预留至少4GB内存
  • 建议使用SSD存储以提高性能

软件要求

  • 确保操作系统版本支持所有要安装的Oracle版本
  • 安装必要的操作系统依赖包
  • 关闭不必要的系统服务,释放资源

注意事项

  • 安装顺序:建议先安装旧版本,再安装新版本
  • 补丁管理:每个版本需要单独应用补丁
  • 备份策略:为每个版本制定独立的备份策略
  • 监控策略:为每个版本配置独立的监控

详细安装步骤(Linux环境)

1. 创建Oracle用户和组

bash
# 创建Oracle用户组
groupadd -g 54321 oinstall
groupadd -g 54322 dba
groupadd -g 54323 oper

# 创建Oracle 19c用户
useradd -u 54321 -g oinstall -G dba,oper oracle19c
passwd oracle19c

# 创建Oracle 21c用户
useradd -u 54322 -g oinstall -G dba,oper oracle21c
passwd oracle21c

2. 创建安装目录

bash
# 创建Oracle 19c安装目录
mkdir -p /u01/app/oracle19c/product/19.3.0/dbhome_1
mkdir -p /u01/app/oracle19c/oradata
mkdir -p /u01/app/oracle19c/fast_recovery_area
mkdir -p /u01/app/oraInventory

# 创建Oracle 21c安装目录
mkdir -p /u02/app/oracle21c/product/21.3.0/dbhome_1
mkdir -p /u02/app/oracle21c/oradata
mkdir -p /u02/app/oracle21c/fast_recovery_area

# 设置目录权限
chown -R oracle19c:oinstall /u01/app/oracle19c
chown -R oracle21c:oinstall /u02/app/oracle21c
chown -R oracle19c:oinstall /u01/app/oraInventory
chmod -R 775 /u01/app/oracle19c
chmod -R 775 /u02/app/oracle21c
chmod -R 775 /u01/app/oraInventory

3. 配置环境变量

Oracle 19c环境变量配置

编辑/home/oracle19c/.bash_profile文件:

bash
# Oracle 19c Environment Variables
ORACLE_BASE=/u01/app/oracle19c
ORACLE_HOME=$ORACLE_BASE/product/19.3.0/dbhome_1
ORACLE_SID=orcl19c
ORACLE_TERM=xterm
PATH=$ORACLE_HOME/bin:$PATH
LD_LIBRARY_PATH=$ORACLE_HOME/lib:$LD_LIBRARY_PATH
CLASSPATH=$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib

# 导出环境变量
export ORACLE_BASE ORACLE_HOME ORACLE_SID ORACLE_TERM PATH LD_LIBRARY_PATH CLASSPATH

# 设置命令提示符
export PS1="[\u@\h \W]\$ "

Oracle 21c环境变量配置

编辑/home/oracle21c/.bash_profile文件:

bash
# Oracle 21c Environment Variables
ORACLE_BASE=/u02/app/oracle21c
ORACLE_HOME=$ORACLE_BASE/product/21.3.0/dbhome_1
ORACLE_SID=orcl21c
ORACLE_TERM=xterm
PATH=$ORACLE_HOME/bin:$PATH
LD_LIBRARY_PATH=$ORACLE_HOME/lib:$LD_LIBRARY_PATH
CLASSPATH=$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib

# 导出环境变量
export ORACLE_BASE ORACLE_HOME ORACLE_SID ORACLE_TERM PATH LD_LIBRARY_PATH CLASSPATH

# 设置命令提示符
export PS1="[\u@\h \W]\$ "

4. 安装Oracle软件

以Oracle 19c为例,安装步骤如下:

bash
# 切换到oracle19c用户
su - oracle19c

# 解压安装文件
unzip LINUX.X64_193000_db_home.zip -d $ORACLE_HOME

# 进入安装目录
cd $ORACLE_HOME

# 启动图形化安装(或使用静默安装)
./runInstaller

Oracle 21c的安装步骤类似,使用oracle21c用户执行安装命令。

5. 创建数据库实例

Oracle 19c实例创建

bash
# 切换到oracle19c用户
su - oracle19c

# 启动DBCA
$ORACLE_HOME/bin/dbca

Oracle 21c实例创建

bash
# 切换到oracle21c用户
su - oracle21c

# 启动DBCA
$ORACLE_HOME/bin/dbca

监听配置

独立监听配置

每个Oracle版本使用独立的监听配置文件:

Oracle 19c监听配置(listener.ora)

bash
# 切换到oracle19c用户
su - oracle19c

# 编辑监听配置文件
vi $ORACLE_HOME/network/admin/listener.ora

配置内容:

text
LISTENER19C =  
  (DESCRIPTION_LIST =  
    (DESCRIPTION =  
      (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))  
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))  
    )  
  )

SID_LIST_LISTENER19C =  
  (SID_LIST =  
    (SID_DESC =  
      (GLOBAL_DBNAME = orcl19c)  
      (ORACLE_HOME = /u01/app/oracle19c/product/19.3.0/dbhome_1)  
      (SID_NAME = orcl19c)  
    )  
  )

ADR_BASE_LISTENER19C = /u01/app/oracle19c

Oracle 21c监听配置(listener.ora)

bash
# 切换到oracle21c用户
su - oracle21c

# 编辑监听配置文件
vi $ORACLE_HOME/network/admin/listener.ora

配置内容:

text
LISTENER21C =  
  (DESCRIPTION_LIST =  
    (DESCRIPTION =  
      (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1522))  
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1522))  
    )  
  )

SID_LIST_LISTENER21C =  
  (SID_LIST =  
    (SID_DESC =  
      (GLOBAL_DBNAME = orcl21c)  
      (ORACLE_HOME = /u02/app/oracle21c/product/21.3.0/dbhome_1)  
      (SID_NAME = orcl21c)  
    )  
  )

ADR_BASE_LISTENER21C = /u02/app/oracle21c

启动监听

Oracle 19c监听启动

bash
# 切换到oracle19c用户
su - oracle19c

# 启动监听
lsnrctl start LISTENER19C

# 查看监听状态
lsnrctl status LISTENER19C

Oracle 21c监听启动

bash
# 切换到oracle21c用户
su - oracle21c

# 启动监听
lsnrctl start LISTENER21C

# 查看监听状态
lsnrctl status LISTENER21C

服务管理

自动启动配置

在Linux环境中,可以通过systemd配置Oracle服务自动启动:

Oracle 19c服务配置

创建/etc/systemd/system/oracle19c.service文件:

text
[Unit]
Description=Oracle 19c Database Service
After=network.target

[Service]
Type=forking
User=oracle19c
Group=oinstall
Environment=ORACLE_HOME=/u01/app/oracle19c/product/19.3.0/dbhome_1
Environment=ORACLE_SID=orcl19c

ExecStart=/u01/app/oracle19c/product/19.3.0/dbhome_1/bin/dbstart $ORACLE_HOME
ExecStop=/u01/app/oracle19c/product/19.3.0/dbhome_1/bin/dbshut $ORACLE_HOME

Restart=on-failure

[Install]
WantedBy=multi-user.target

Oracle 21c服务配置

创建/etc/systemd/system/oracle21c.service文件:

text
[Unit]
Description=Oracle 21c Database Service
After=network.target

[Service]
Type=forking
User=oracle21c
Group=oinstall
Environment=ORACLE_HOME=/u02/app/oracle21c/product/21.3.0/dbhome_1
Environment=ORACLE_SID=orcl21c

ExecStart=/u02/app/oracle21c/product/21.3.0/dbhome_1/bin/dbstart $ORACLE_HOME
ExecStop=/u02/app/oracle21c/product/21.3.0/dbhome_1/bin/dbshut $ORACLE_HOME

Restart=on-failure

[Install]
WantedBy=multi-user.target

启用服务

bash
# 重新加载systemd配置
systemctl daemon-reload

# 启用Oracle 19c服务
systemctl enable oracle19c.service

# 启用Oracle 21c服务
systemctl enable oracle21c.service

# 启动Oracle 19c服务
systemctl start oracle19c.service

# 启动Oracle 21c服务
systemctl start oracle21c.service

版本间数据迁移和兼容

数据迁移方法

  1. 数据泵(Data Pump):适用于不同版本间的数据迁移
  2. 物化视图:适用于实时数据同步
  3. GoldenGate:适用于大规模数据同步和高可用性场景
  4. SQL*Loader:适用于从外部文件导入数据

数据泵迁移示例

从Oracle 19c导出数据到Oracle 21c:

1. 在Oracle 19c中创建目录和用户

sql
-- 登录到Oracle 19c
sqlplus / as sysdba

-- 创建目录
CREATE DIRECTORY dump_dir AS '/u01/app/oracle19c/dump';

-- 授权
GRANT READ, WRITE ON DIRECTORY dump_dir TO system;

2. 导出数据

bash
# 切换到oracle19c用户
su - oracle19c

# 导出数据
expdp system/password@orcl19c directory=dump_dir dumpfile=orcl19c.dmp full=y logfile=expdp_orcl19c.log

3. 在Oracle 21c中创建目录和用户

sql
-- 登录到Oracle 21c
sqlplus / as sysdba

-- 创建目录
CREATE DIRECTORY dump_dir AS '/u02/app/oracle21c/dump';

-- 授权
GRANT READ, WRITE ON DIRECTORY dump_dir TO system;

4. 导入数据

bash
# 切换到oracle21c用户
su - oracle21c

# 复制导出文件到Oracle 21c目录
cp /u01/app/oracle19c/dump/orcl19c.dmp /u02/app/oracle21c/dump/

# 导入数据
impdp system/password@orcl21c directory=dump_dir dumpfile=orcl19c.dmp full=y logfile=impdp_orcl21c.log

性能优化和资源隔离

内存隔离

为每个Oracle版本配置独立的内存参数:

  • SGA_TARGET:根据服务器内存大小和版本需求设置
  • PGA_AGGREGATE_TARGET:建议设置为SGA_TARGET的50%
  • MEMORY_TARGET:如果使用自动内存管理,设置合理的内存目标

CPU隔离

使用Linux cgroups或Oracle Resource Manager进行CPU资源隔离:

bash
# 创建cgroup
mkdir /sys/fs/cgroup/cpu/oracle19c
mkdir /sys/fs/cgroup/cpu/oracle21c

# 配置CPU配额(每个版本分配50% CPU)
echo 50000 > /sys/fs/cgroup/cpu/oracle19c/cpu.cfs_quota_us
echo 50000 > /sys/fs/cgroup/cpu/oracle21c/cpu.cfs_quota_us

echo 100000 > /sys/fs/cgroup/cpu/oracle19c/cpu.cfs_period_us
echo 100000 > /sys/fs/cgroup/cpu/oracle21c/cpu.cfs_period_us

# 将Oracle进程添加到cgroup
for pid in $(pgrep -u oracle19c); do echo $pid > /sys/fs/cgroup/cpu/oracle19c/cgroup.procs; done
for pid in $(pgrep -u oracle21c); do echo $pid > /sys/fs/cgroup/cpu/oracle21c/cgroup.procs; done

磁盘I/O隔离

  • 为每个Oracle版本使用独立的磁盘或分区
  • 使用ASM或LVM进行存储管理
  • 配置合理的I/O调度器

监控和维护

监控指标

  • 实例状态:使用sqlplus / as sysdba查看实例状态
  • 性能指标:使用AWR、ASH报告分析性能
  • 资源使用:使用topvmstatiostat等命令监控系统资源
  • 日志监控:监控alert日志和监听日志

维护任务

  • 定期备份:为每个版本制定独立的备份策略
  • 统计信息收集:定期收集每个版本的统计信息
  • 索引重建:根据需要重建索引
  • 表空间管理:监控和管理每个版本的表空间
  • 补丁应用:为每个版本单独应用补丁

常见问题(FAQ)

Q1: 安装过程中遇到"ORA-00821: Specified value of sga_target is too small"错误怎么办?

A: 这个错误表示SGA_TARGET设置太小。请根据服务器内存大小和Oracle版本需求,调整SGA_TARGET参数。例如,对于19c,建议SGA_TARGET至少设置为4GB。

Q2: 如何在同一台服务器上同时使用sqlplus连接不同版本的Oracle?

A: 可以通过以下方法:

  1. 使用不同的用户:每个用户有自己的环境变量
  2. 临时设置环境变量:
    bash
    export ORACLE_HOME=/u01/app/oracle19c/product/19.3.0/dbhome_1
    export PATH=$ORACLE_HOME/bin:$PATH
    sqlplus / as sysdba
  3. 使用完整路径调用sqlplus:
    bash
    /u01/app/oracle19c/product/19.3.0/dbhome_1/bin/sqlplus / as sysdba
    /u02/app/oracle21c/product/21.3.0/dbhome_1/bin/sqlplus / as sysdba

Q3: 监听启动时遇到"TNS-01150: The address of the specified listener name is incorrect"错误怎么办?

A: 这个错误通常是由于listener.ora文件配置错误导致的。请检查:

  1. 监听名称是否正确
  2. HOST参数是否正确
  3. PORT参数是否被占用
  4. 语法是否正确

Q4: 如何解决不同版本Oracle之间的字符集兼容问题?

A: 建议:

  1. 在创建数据库时使用统一的字符集(如AL32UTF8)
  2. 在数据迁移时使用数据泵的TRANSFORM=CHARSET:Y参数
  3. 使用NLS_LANG环境变量临时设置字符集

Q5: 如何限制每个Oracle版本使用的内存大小?

A: 可以通过以下方法:

  1. 在spfile中设置SGA_TARGETPGA_AGGREGATE_TARGET参数
  2. 如果使用自动内存管理,设置MEMORY_TARGET参数
  3. 使用Linux cgroups进行内存隔离

最佳实践

  1. 使用独立的Oracle用户:每个版本使用独立的Oracle用户,便于权限管理和资源隔离
  2. 使用独立的监听端口:避免端口冲突
  3. 合理分配资源:根据服务器资源和业务需求,合理分配CPU、内存和磁盘资源
  4. 制定备份策略:为每个版本制定独立的备份策略
  5. 监控和告警:配置监控和告警,及时发现和解决问题
  6. 定期维护:定期进行数据库维护,如收集统计信息、重建索引、检查数据库健康状态
  7. 文档化:详细记录每个版本的安装配置、参数设置和维护记录
  8. 测试:在生产环境部署前,在测试环境充分测试多版本共存的稳定性和性能

总结

Oracle多版本共存是企业生产环境中常见的需求,通过合理的架构设计、安装配置和维护管理,可以实现多个Oracle版本在同一台服务器上的稳定运行。在实施过程中,需要注意环境变量隔离、监听配置、资源分配和版本间兼容性等问题,确保每个Oracle版本都能获得足够的资源和稳定的运行环境。