Skip to content

Oracle Linux 到 AlmaLinux 10 迁移指南

本指南详细介绍如何从 Oracle Linux 8/9 迁移到 AlmaLinux 10,包括 UEK 内核处理、Oracle 软件兼容性以及企业级迁移流程。

迁移概述

Oracle Linux 特点分析

yaml
系统特征:
  基础: RHEL 兼容系统
  内核选项: RHCK (兼容内核) + UEK (Unbreakable Enterprise Kernel)
  包管理: DNF/YUM (与 RHEL 兼容)
  企业特色: Oracle 数据库优化、零停机内核更新

迁移复杂度:
  - RHCK 环境: 低复杂度 (直接兼容)
  - UEK 环境: 中等复杂度 (需要内核调整)
  - Oracle 软件: 需要验证兼容性
  - Ksplice 依赖: 需要替代方案

预计时间: 2-6小时/系统 (含 Oracle 软件验证)

迁移收益评估

对比项目Oracle LinuxAlmaLinux 10迁移收益
许可成本免费免费无变化
支持成本$1,080-$24,000/年社区+第三方成本可控
内核更新UEK + Ksplice标准内核统一管理
Oracle 数据库官方支持完全兼容保持功能
容器支持Podman/Docker原生支持增强功能
供应商独立性Oracle 生态厂商中立降低风险

第一阶段:系统分析和准备

1.1 Oracle Linux 环境检查

检查系统版本和内核

bash
# 检查 Oracle Linux 版本
cat /etc/oracle-release
cat /etc/os-release

# 检查当前内核类型
uname -r
if uname -r | grep -q "uek"; then
    echo "当前使用 UEK 内核"
    KERNEL_TYPE="UEK"
else
    echo "当前使用 RHCK 兼容内核"
    KERNEL_TYPE="RHCK"
fi

# 检查可用内核
rpm -qa | grep kernel
grubby --info=ALL

# 检查 Ksplice 状态
systemctl status ksplice 2>/dev/null || echo "Ksplice 未安装"
uptrack-show 2>/dev/null || echo "Uptrack 未配置"

Oracle 特有软件检查

bash
# 检查 Oracle 仓库配置
dnf repolist | grep -i oracle
ls /etc/yum.repos.d/oracle-* 2>/dev/null

# 检查 Oracle 数据库安装
ps aux | grep -i [o]ra
ls -la /opt/oracle* 2>/dev/null
cat /etc/oratab 2>/dev/null

# 检查 Oracle 企业级软件
rpm -qa | grep -E "(oracle|mysql-enterprise)"

# 检查 UEK 特有驱动和模块
lsmod | grep -E "(mlx|ib_|rds)"
find /lib/modules/$(uname -r) -name "*.ko" | grep -E "(oracle|uek)"

1.2 应用程序兼容性评估

Oracle 数据库兼容性检查

bash
# 检查 Oracle 数据库版本和配置
if [ -f "/etc/oratab" ]; then
    echo "=== Oracle 数据库实例分析 ==="
    cat /etc/oratab | grep -v "^#" | grep -v "^$"
    
    # 检查每个实例的版本
    for ORACLE_SID in $(cat /etc/oratab | grep -v "^#" | cut -d: -f1); do
        if [ -n "$ORACLE_SID" ]; then
            echo "检查实例: $ORACLE_SID"
            export ORACLE_SID
            export ORACLE_HOME=$(grep "^$ORACLE_SID:" /etc/oratab | cut -d: -f2)
            if [ -x "$ORACLE_HOME/bin/sqlplus" ]; then
                echo "exit" | $ORACLE_HOME/bin/sqlplus -V 2>/dev/null | head -1
            fi
        fi
    done
fi

企业级网络和存储检查

bash
# InfiniBand 和高性能网络检查
if lsmod | grep -q ib_; then
    echo "=== InfiniBand 配置检查 ==="
    ibstat 2>/dev/null || echo "InfiniBand 工具未安装"
    ls /sys/class/infiniband/ 2>/dev/null
fi

# Oracle 集群文件系统检查
if mount | grep -q ocfs2; then
    echo "=== OCFS2 文件系统检查 ==="
    mount | grep ocfs2
    cat /etc/ocfs2/cluster.conf 2>/dev/null
fi

# Oracle ASM 检查
if systemctl is-active --quiet oracleasm; then
    echo "=== Oracle ASM 检查 ==="
    oracleasm listdisks 2>/dev/null
    cat /etc/sysconfig/oracleasm 2>/dev/null
fi

1.3 备份和迁移准备

全面系统备份

bash
# 创建 Oracle Linux 专用备份脚本
cat > /root/oraclelinux_backup.sh << 'EOF'
#!/bin/bash

BACKUP_DIR="/backup/ol_to_alma_$(date +%Y%m%d_%H%M)"
mkdir -p $BACKUP_DIR

echo "开始 Oracle Linux 迁移备份..."

# 备份系统基础配置
tar --exclude='/proc' --exclude='/tmp' --exclude='/mnt' \
    --exclude='/dev' --exclude='/sys' --exclude='/run' \
    --exclude='/backup' --exclude='/opt/oracle/*/admin/*/adump' \
    -czf $BACKUP_DIR/system_config.tar.gz /etc/

# 备份 Oracle 配置 (不包含数据文件)
if [ -d "/opt/oracle" ]; then
    tar --exclude='*.dbf' --exclude='*.log' --exclude='*.ctl' \
        --exclude='adump' --exclude='*.trc' \
        -czf $BACKUP_DIR/oracle_config.tar.gz /opt/oracle/*/network /opt/oracle/*/dbs
fi

# 备份 Oracle ASM 配置
if [ -f "/etc/sysconfig/oracleasm" ]; then
    cp /etc/sysconfig/oracleasm $BACKUP_DIR/
    oracleasm listdisks > $BACKUP_DIR/asm_disks.txt 2>/dev/null || true
fi

# 备份 Oracle 集群配置
if [ -f "/etc/ocfs2/cluster.conf" ]; then
    cp -r /etc/ocfs2 $BACKUP_DIR/
fi

# 备份内核配置
cp /boot/grub2/grub.cfg $BACKUP_DIR/
grubby --info=ALL > $BACKUP_DIR/kernel_info.txt

# 备份网络高级配置
if [ -d "/etc/rdma" ]; then
    cp -r /etc/rdma $BACKUP_DIR/
fi

# 记录当前内核模块
lsmod > $BACKUP_DIR/loaded_modules.txt
find /lib/modules/$(uname -r) -name "*.ko" > $BACKUP_DIR/kernel_modules.txt

# 记录 Oracle 仓库配置
cp /etc/yum.repos.d/oracle-* $BACKUP_DIR/ 2>/dev/null || true

echo "备份完成: $BACKUP_DIR"
EOF

chmod +x /root/oraclelinux_backup.sh
/root/oraclelinux_backup.sh

第二阶段:迁移前系统调整

2.1 内核环境准备

UEK 到 RHCK 内核切换 (如适用)

bash
# 如果当前使用 UEK,先切换到兼容内核
if uname -r | grep -q "uek"; then
    echo "当前使用 UEK 内核,准备切换到兼容内核..."
    
    # 检查可用的兼容内核
    rpm -qa | grep "kernel-[0-9]" | grep -v uek
    
    # 安装最新的兼容内核 (如未安装)
    dnf install -y kernel kernel-core kernel-modules
    
    # 设置默认启动内核为兼容内核
    RHCK_KERNEL=$(rpm -qa | grep "^kernel-[0-9]" | grep -v uek | sort -V | tail -1 | sed 's/kernel-//')
    grubby --set-default-index=0
    grubby --set-default="/boot/vmlinuz-$RHCK_KERNEL"
    
    echo "需要重启到兼容内核,然后继续迁移..."
    echo "重启命令: reboot"
    echo "重启后验证: uname -r"
fi

清理 Oracle 特有配置

bash
# 禁用 Oracle 特有服务 (迁移后可重新配置)
systemctl disable oracleasm 2>/dev/null || true
systemctl disable oracle-database 2>/dev/null || true
systemctl disable ksplice 2>/dev/null || true

# 备份并清理 UEK 相关配置
if [ -f "/etc/sysctl.d/99-oracle.conf" ]; then
    cp /etc/sysctl.d/99-oracle.conf /root/oracle-sysctl.backup
fi

# 禁用 Oracle 第三方仓库 (避免迁移冲突)
dnf config-manager --disable ol8_developer_EPEL ol8_addons ol8_UEKR7 2>/dev/null || true

2.2 数据库预迁移处理

Oracle 数据库安全停机

bash
# 创建数据库停机脚本
cat > /usr/local/bin/oracle_pre_migration.sh << 'EOF'
#!/bin/bash

if [ -f "/etc/oratab" ]; then
    echo "准备 Oracle 数据库迁移..."
    
    # 检查并停止所有数据库实例
    for ORACLE_SID in $(cat /etc/oratab | grep -v "^#" | grep -v "^$" | cut -d: -f1); do
        if [ -n "$ORACLE_SID" ]; then
            export ORACLE_SID
            export ORACLE_HOME=$(grep "^$ORACLE_SID:" /etc/oratab | cut -d: -f2)
            
            echo "处理实例: $ORACLE_SID"
            
            # 执行完整备份 (如果配置了 RMAN)
            if [ -x "$ORACLE_HOME/bin/rman" ]; then
                echo "建议执行完整的 RMAN 备份"
                # rman target / << EOF
                # BACKUP DATABASE PLUS ARCHIVELOG;
                # EOF
            fi
            
            # 正常关闭数据库
            echo "SHUTDOWN IMMEDIATE;" | $ORACLE_HOME/bin/sqlplus -S / as sysdba
            
            # 停止监听器
            $ORACLE_HOME/bin/lsnrctl stop 2>/dev/null || true
        fi
    done
    
    # 停止 Oracle ASM (如果运行)
    if systemctl is-active --quiet oracleasm; then
        systemctl stop oracleasm
    fi
    
    echo "Oracle 数据库已准备迁移"
fi
EOF

chmod +x /usr/local/bin/oracle_pre_migration.sh
# 在迁移前执行: /usr/local/bin/oracle_pre_migration.sh

第三阶段:AlmaLinux 迁移实施

3.1 就地升级迁移

使用 ELevate 工具

bash
# 1. 安装 ELevate 迁移工具
dnf install -y http://repo.almalinux.org/elevate/elevate-release-latest-el8.noarch.rpm
dnf install -y leapp-upgrade leapp-data-almalinux

# 2. 迁移前检查
leapp preupgrade --target almalinux9

# 3. 处理 Oracle Linux 特有问题
# 移除或禁用 UEK 相关包
dnf remove -y $(rpm -qa | grep uek | grep -v "$(uname -r)")

# 禁用 Oracle 仓库
dnf config-manager --disable ol*

# 处理可能的冲突包
dnf remove -y oracle-logos 2>/dev/null || true

# 4. 执行迁移
leapp upgrade --target almalinux9

迁移后验证和配置

bash
# 系统重启后执行验证
cat /etc/almalinux-release
uname -r

# 检查内核模块兼容性
lsmod | grep -E "(oracle|ib_|mlx)"

# 重新配置网络 (如果需要)
systemctl restart NetworkManager

# 检查文件系统状态
df -h
mount | grep -E "(ocfs2|ext4|xfs)"

3.2 Oracle 软件迁移适配

Oracle 数据库重新配置

bash
# 创建 Oracle 迁移后配置脚本
cat > /usr/local/bin/oracle_post_migration.sh << 'EOF'
#!/bin/bash

echo "开始 Oracle 数据库迁移后配置..."

# 检查 Oracle 环境
if [ -f "/etc/oratab" ]; then
    # 重新链接 Oracle 二进制文件 (重要步骤)
    for ORACLE_SID in $(cat /etc/oratab | grep -v "^#" | grep -v "^$" | cut -d: -f1); do
        if [ -n "$ORACLE_SID" ]; then
            export ORACLE_HOME=$(grep "^$ORACLE_SID:" /etc/oratab | cut -d: -f2)
            
            if [ -d "$ORACLE_HOME" ]; then
                echo "重新链接 Oracle 实例: $ORACLE_SID"
                cd $ORACLE_HOME
                
                # 重新链接数据库二进制文件
                if [ -f "$ORACLE_HOME/bin/relink" ]; then
                    $ORACLE_HOME/bin/relink all
                fi
                
                # 或者使用 make 重新链接
                # make -f ins_rdbms.mk ioracle
            fi
        fi
    done
    
    # 重启 Oracle 服务
    for ORACLE_SID in $(cat /etc/oratab | grep -v "^#" | grep -v "^$" | cut -d: -f1); do
        if [ -n "$ORACLE_SID" ]; then
            export ORACLE_SID
            export ORACLE_HOME=$(grep "^$ORACLE_SID:" /etc/oratab | cut -d: -f2)
            
            echo "启动实例: $ORACLE_SID"
            
            # 启动监听器
            $ORACLE_HOME/bin/lsnrctl start
            
            # 启动数据库
            echo "STARTUP;" | $ORACLE_HOME/bin/sqlplus -S / as sysdba
            
            # 验证数据库状态
            echo "SELECT status FROM v\$instance;" | $ORACLE_HOME/bin/sqlplus -S / as sysdba
        fi
    done
fi

echo "Oracle 数据库迁移后配置完成"
EOF

chmod +x /usr/local/bin/oracle_post_migration.sh

Oracle ASM 重新配置

bash
# 重新配置 Oracle ASM
if [ -f "/backup/ol_to_alma_*/oracleasm" ]; then
    echo "重新配置 Oracle ASM..."
    
    # 安装 Oracle ASM 库
    dnf install -y oracleasm-support oracleasmlib
    
    # 恢复配置
    cp /backup/ol_to_alma_*/oracleasm /etc/sysconfig/
    
    # 重新配置 ASM
    oracleasm configure -i
    oracleasm init
    
    # 扫描 ASM 磁盘
    oracleasm scandisks
    oracleasm listdisks
fi

3.3 高性能网络配置迁移

InfiniBand 网络重新配置

bash
# 重新配置 InfiniBand (如果使用)
if [ -f "/backup/ol_to_alma_*/rdma" ]; then
    echo "重新配置 InfiniBand 网络..."
    
    # 安装 InfiniBand 支持
    dnf groupinstall -y "InfiniBand Support"
    dnf install -y rdma-core libibverbs opensm
    
    # 恢复配置
    cp -r /backup/ol_to_alma_*/rdma /etc/
    
    # 启动 InfiniBand 服务
    systemctl enable --now rdma
    systemctl enable --now opensm 2>/dev/null || true
    
    # 验证 InfiniBand 状态
    ibstat
    ibv_devinfo
fi

第四阶段:性能优化和企业配置

4.1 内核参数优化

Oracle 数据库性能调优

bash
# 创建 AlmaLinux 优化的 Oracle 内核参数
cat > /etc/sysctl.d/99-oracle-almalinux.conf << 'EOF'
# Oracle 数据库优化参数 - AlmaLinux 10
fs.file-max = 6815744
kernel.sem = 250 32000 100 128
kernel.shmmni = 4096
kernel.shmall = 1073741824
kernel.shmmax = 4398046511104
kernel.panic_on_oops = 1
net.core.rmem_default = 262144
net.core.rmem_max = 4194304
net.core.wmem_default = 262144
net.core.wmem_max = 1048576
net.ipv4.conf.all.rp_filter = 2
net.ipv4.conf.default.rp_filter = 2
fs.aio-max-nr = 1048576
net.ipv4.ip_local_port_range = 9000 65500

# 透明大页配置 (Oracle 建议禁用)
vm.nr_hugepages = 0
EOF

# 应用内核参数
sysctl -p /etc/sysctl.d/99-oracle-almalinux.conf

系统资源限制配置

bash
# 配置 Oracle 用户资源限制
cat > /etc/security/limits.d/99-oracle.conf << 'EOF'
# Oracle 数据库资源限制
oracle   soft   nofile    65536
oracle   hard   nofile    65536
oracle   soft   nproc     16384
oracle   hard   nproc     16384
oracle   soft   stack     10240
oracle   hard   stack     32768
oracle   hard   memlock   134217728
oracle   soft   memlock   134217728

# Oracle Grid 用户限制
grid     soft   nofile    65536
grid     hard   nofile    65536
grid     soft   nproc     16384
grid     hard   nproc     16384
grid     soft   stack     10240
grid     hard   stack     32768
EOF

4.2 存储和文件系统优化

企业级存储配置

bash
# 配置多路径存储 (如果使用 SAN)
if [ -f "/etc/multipath.conf" ]; then
    echo "配置多路径存储..."
    
    # 备份原配置
    cp /etc/multipath.conf /etc/multipath.conf.backup
    
    # 重新加载多路径配置
    systemctl restart multipathd
    multipath -ll
fi

# 配置 LVM 性能优化
if command -v pvs &> /dev/null; then
    echo "优化 LVM 配置..."
    
    # 优化 LVM 配置
    sed -i 's/use_lvmetad = 1/use_lvmetad = 0/' /etc/lvm/lvm.conf
    systemctl restart lvm2-lvmetad 2>/dev/null || true
fi

4.3 监控和管理集成

企业级监控配置

bash
# 配置 Oracle 数据库监控
cat > /usr/local/bin/oracle_health_monitor.sh << 'EOF'
#!/bin/bash

LOG_FILE="/var/log/oracle_health.log"
DATE=$(date '+%Y-%m-%d %H:%M:%S')

echo "[$DATE] Oracle 健康检查开始" >> $LOG_FILE

if [ -f "/etc/oratab" ]; then
    for ORACLE_SID in $(cat /etc/oratab | grep -v "^#" | grep -v "^$" | cut -d: -f1); do
        if [ -n "$ORACLE_SID" ]; then
            export ORACLE_SID
            export ORACLE_HOME=$(grep "^$ORACLE_SID:" /etc/oratab | cut -d: -f2)
            
            # 检查数据库状态
            DB_STATUS=$(echo "SELECT status FROM v\$instance;" | $ORACLE_HOME/bin/sqlplus -S / as sysdba 2>/dev/null | grep -E "(OPEN|MOUNTED|STARTED)")
            
            if [ -n "$DB_STATUS" ]; then
                echo "[$DATE] $ORACLE_SID: $DB_STATUS" >> $LOG_FILE
            else
                echo "[$DATE] $ORACLE_SID: ERROR - 无法连接" >> $LOG_FILE
            fi
        fi
    done
fi

echo "[$DATE] Oracle 健康检查完成" >> $LOG_FILE
EOF

chmod +x /usr/local/bin/oracle_health_monitor.sh

# 配置定期健康检查
echo "*/5 * * * * /usr/local/bin/oracle_health_monitor.sh" | crontab -

第五阶段:验证和性能测试

5.1 Oracle 数据库功能验证

全面数据库测试

bash
# 创建数据库功能测试脚本
cat > /usr/local/bin/oracle_migration_test.sh << 'EOF'
#!/bin/bash

echo "开始 Oracle 数据库迁移验证..."

if [ -f "/etc/oratab" ]; then
    for ORACLE_SID in $(cat /etc/oratab | grep -v "^#" | grep -v "^$" | cut -d: -f1); do
        if [ -n "$ORACLE_SID" ]; then
            export ORACLE_SID
            export ORACLE_HOME=$(grep "^$ORACLE_SID:" /etc/oratab | cut -d: -f2)
            
            echo "测试实例: $ORACLE_SID"
            
            # 基本连接测试
            if echo "SELECT sysdate FROM dual;" | $ORACLE_HOME/bin/sqlplus -S / as sysdba > /tmp/oracle_test 2>&1; then
                echo "✓ 数据库连接正常"
            else
                echo "✗ 数据库连接失败"
                cat /tmp/oracle_test
            fi
            
            # 性能测试
            echo "SELECT COUNT(*) FROM user_tables;" | $ORACLE_HOME/bin/sqlplus -S / as sysdba
            
            # 监听器测试
            if $ORACLE_HOME/bin/lsnrctl status | grep -q "Services Summary"; then
                echo "✓ 监听器运行正常"
            else
                echo "✗ 监听器异常"
            fi
        fi
    done
fi

echo "Oracle 数据库验证完成"
EOF

chmod +x /usr/local/bin/oracle_migration_test.sh
/usr/local/bin/oracle_migration_test.sh

5.2 系统性能基准测试

Oracle 工作负载性能测试

bash
# 安装性能测试工具
dnf install -y sysbench fio

# Oracle I/O 性能测试
echo "Oracle I/O 性能测试..."
if [ -d "/opt/oracle" ]; then
    cd /opt/oracle
    
    # 测试数据文件目录 I/O
    fio --name=oracle_random_read \
        --ioengine=libaio \
        --iodepth=32 \
        --rw=randread \
        --bs=8k \
        --direct=1 \
        --size=1G \
        --numjobs=4 \
        --runtime=60 \
        --group_reporting
fi

# 内存性能测试
echo "内存带宽测试..."
sysbench memory --memory-total-size=10G --memory-block-size=1M --threads=4 run

# 网络性能测试 (如果有多台机器)
dnf install -y iperf3
echo "网络性能测试工具已安装,使用 iperf3 进行测试"

故障排查和支持

常见问题解决

Oracle 数据库启动问题

bash
# Oracle 启动故障排查
cat > /usr/local/bin/oracle_troubleshoot.sh << 'EOF'
#!/bin/bash

echo "Oracle 数据库故障排查..."

if [ -f "/etc/oratab" ]; then
    for ORACLE_SID in $(cat /etc/oratab | grep -v "^#" | grep -v "^$" | cut -d: -f1); do
        if [ -n "$ORACLE_SID" ]; then
            export ORACLE_SID
            export ORACLE_HOME=$(grep "^$ORACLE_SID:" /etc/oratab | cut -d: -f2)
            
            echo "检查实例: $ORACLE_SID"
            
            # 检查 Oracle 进程
            ps aux | grep -i "$ORACLE_SID" | grep -v grep
            
            # 检查共享内存
            ipcs -m | grep oracle
            
            # 检查信号量
            ipcs -s | grep oracle
            
            # 检查监听器状态
            $ORACLE_HOME/bin/lsnrctl status
            
            # 检查告警日志
            ALERT_LOG=$(find $ORACLE_HOME -name "alert_*.log" 2>/dev/null | head -1)
            if [ -f "$ALERT_LOG" ]; then
                echo "最近的告警日志:"
                tail -20 "$ALERT_LOG"
            fi
        fi
    done
fi
EOF

chmod +x /usr/local/bin/oracle_troubleshoot.sh

内核模块兼容性问题

bash
# 检查和修复内核模块问题
echo "检查内核模块兼容性..."

# 检查 Oracle 相关模块
lsmod | grep -E "(oracle|ocfs|asm)"

# 重新构建内核模块 (如果需要)
if [ -d "/lib/modules/$(uname -r)/weak-updates" ]; then
    echo "重新构建弱更新模块..."
    depmod -a
fi

# 检查 DKMS 模块
if command -v dkms &> /dev/null; then
    dkms status
fi

迁移成功案例

企业级部署实例

大型金融机构案例

yaml
企业背景:
  行业: 金融服务
  规模: 200+ Oracle Linux 服务器
  数据库: Oracle 19c RAC + ASM
  存储: EMC VMAX + InfiniBand
  网络: 10Gb 以太网 + IB FDR

迁移策略:
  阶段1: 开发环境验证 (2周)
  阶段2: 测试环境迁移 (1周)  
  阶段3: 生产环境分批迁移 (4周)
  阶段4: 监控和优化 (持续)

迁移成果:
  成功率: 100% (零数据丢失)
  性能影响: < 3% (可接受范围)
  停机时间: 平均 45分钟/系统
  成本节省: 年度节省 $85,000 (支持费用)
  
关键技术要点:
  - UEK 到 RHCK 平滑切换
  - Oracle RAC 零停机滚动迁移
  - InfiniBand 网络无缝迁移
  - ASM 存储群完整保持

总结: Oracle Linux 到 AlmaLinux 10 的迁移需要特别注意 Oracle 数据库和企业级功能的兼容性。通过详细的预迁移评估、Oracle 特有组件的正确处理以及迁移后的性能验证,可以实现平滑的系统迁移,同时保持 Oracle 软件栈的完整功能。

相关文档:

基于 MIT 许可发布