外观
Oracle 多版本共存
Oracle 多版本共存概述
在企业生产环境中,由于业务系统升级、测试需求或兼容性考虑,常常需要在同一台服务器上部署多个不同版本的Oracle数据库。Oracle多版本共存可以帮助企业:
- 平滑过渡:在升级到新版本前,先在同一服务器上部署并测试新版本
- 兼容性测试:验证应用程序在不同Oracle版本下的兼容性
- 资源共享:充分利用服务器资源,减少硬件成本
- 快速回滚:在新版本出现问题时,可以快速切换回旧版本
多版本共存的挑战
- 环境变量冲突:不同版本的Oracle使用不同的环境变量
- 监听配置冲突:默认监听端口都是1521
- 资源竞争:多个数据库实例共享服务器CPU、内存和磁盘资源
- 版本间兼容性:不同版本的Oracle在SQL语法、数据类型和特性上存在差异
- 维护复杂度:需要同时维护多个版本的Oracle实例
多版本共存架构设计
物理架构
在Linux环境中,Oracle多版本共存通常采用以下物理架构:
- 独立的ORACLE_HOME:每个版本的Oracle安装在不同的目录下
- 独立的Oracle用户:每个版本使用不同的Oracle用户(推荐)
- 独立的监听端口:每个版本使用不同的监听端口
- 独立的实例名:每个实例使用唯一的实例名
- 独立的表空间文件:每个实例的表空间文件存储在不同的目录下
逻辑架构
- 环境变量隔离:通过不同的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 oracle21c2. 创建安装目录
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/oraInventory3. 配置环境变量
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
# 启动图形化安装(或使用静默安装)
./runInstallerOracle 21c的安装步骤类似,使用oracle21c用户执行安装命令。
5. 创建数据库实例
Oracle 19c实例创建
bash
# 切换到oracle19c用户
su - oracle19c
# 启动DBCA
$ORACLE_HOME/bin/dbcaOracle 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/oracle19cOracle 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 LISTENER19COracle 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.targetOracle 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版本间数据迁移和兼容
数据迁移方法
- 数据泵(Data Pump):适用于不同版本间的数据迁移
- 物化视图:适用于实时数据同步
- GoldenGate:适用于大规模数据同步和高可用性场景
- 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.log3. 在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报告分析性能
- 资源使用:使用
top、vmstat、iostat等命令监控系统资源 - 日志监控:监控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: 可以通过以下方法:
- 使用不同的用户:每个用户有自己的环境变量
- 临时设置环境变量:bash
export ORACLE_HOME=/u01/app/oracle19c/product/19.3.0/dbhome_1 export PATH=$ORACLE_HOME/bin:$PATH sqlplus / as sysdba - 使用完整路径调用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文件配置错误导致的。请检查:
- 监听名称是否正确
- HOST参数是否正确
- PORT参数是否被占用
- 语法是否正确
Q4: 如何解决不同版本Oracle之间的字符集兼容问题?
A: 建议:
- 在创建数据库时使用统一的字符集(如AL32UTF8)
- 在数据迁移时使用数据泵的
TRANSFORM=CHARSET:Y参数 - 使用
NLS_LANG环境变量临时设置字符集
Q5: 如何限制每个Oracle版本使用的内存大小?
A: 可以通过以下方法:
- 在spfile中设置
SGA_TARGET和PGA_AGGREGATE_TARGET参数 - 如果使用自动内存管理,设置
MEMORY_TARGET参数 - 使用Linux cgroups进行内存隔离
最佳实践
- 使用独立的Oracle用户:每个版本使用独立的Oracle用户,便于权限管理和资源隔离
- 使用独立的监听端口:避免端口冲突
- 合理分配资源:根据服务器资源和业务需求,合理分配CPU、内存和磁盘资源
- 制定备份策略:为每个版本制定独立的备份策略
- 监控和告警:配置监控和告警,及时发现和解决问题
- 定期维护:定期进行数据库维护,如收集统计信息、重建索引、检查数据库健康状态
- 文档化:详细记录每个版本的安装配置、参数设置和维护记录
- 测试:在生产环境部署前,在测试环境充分测试多版本共存的稳定性和性能
总结
Oracle多版本共存是企业生产环境中常见的需求,通过合理的架构设计、安装配置和维护管理,可以实现多个Oracle版本在同一台服务器上的稳定运行。在实施过程中,需要注意环境变量隔离、监听配置、资源分配和版本间兼容性等问题,确保每个Oracle版本都能获得足够的资源和稳定的运行环境。
