Skip to content

Oracle 升级前准备

升级规划

确定升级路径

  • 当前版本评估

    • 确认当前 Oracle 版本:SELECT * FROM v$version;
    • 确认数据库补丁级别:SELECT * FROM dba_registry_history;
  • 目标版本选择

    • 考虑 Oracle 支持策略
    • 评估业务需求和兼容性
    • 参考 Oracle 推荐的升级路径
  • 升级方法选择

    • 直接升级:适用于相邻版本
    • 跨版本升级:可能需要中间版本
    • 使用 Data Guard 升级:减少停机时间
    • 使用 GoldenGate 升级:实现零停机升级

制定详细计划

  • 时间计划

    • 升级窗口确定
    • 各阶段时间预估
    • 回滚时间预留
  • 人员计划

    • 升级团队组成
    • 各角色职责分配
    • 外部支持安排
  • 资源计划

    • 硬件资源需求
    • 存储空间需求
    • 网络带宽需求
  • 沟通计划

    • 内部沟通机制
    • 外部通知流程
    • 升级状态报告

环境检查

硬件检查

  • 服务器硬件

    • CPU 数量和性能
    • 内存大小
    • 存储空间:确保有足够的空间用于升级
    • I/O 性能:评估磁盘 I/O 速度
  • 存储系统

    • 存储容量
    • 存储性能
    • 存储冗余
    • 备份存储可用性
  • 网络检查

    • 网络带宽
    • 网络稳定性
    • 网络延迟
    • 防火墙配置

软件检查

  • 操作系统

    • 版本兼容性:确认目标 Oracle 版本支持的操作系统版本
    • 补丁级别:确保操作系统补丁符合要求
    • 内核参数:检查并调整内核参数
    • 系统库:确保所需库文件存在
  • Oracle 软件

    • 安装介质准备:下载并验证目标版本安装包
    • 补丁准备:准备必要的补丁
    • 客户端软件:确认客户端版本兼容性
    • 中间件兼容性:检查应用服务器等中间件兼容性
  • 第三方软件

    • 备份软件:确认备份软件兼容性
    • 监控工具:确认监控工具兼容性
    • 其他集成软件:确认所有集成软件兼容性

数据库检查

数据库状态检查

  • 基本状态

    • 数据库是否正常运行:SELECT status FROM v$instance;
    • 是否处于归档模式:SELECT log_mode FROM v$database;
    • 是否有挂起的事务:SELECT * FROM v$transaction;
  • 数据完整性

    • 运行 RMAN 验证:BACKUP VALIDATE DATABASE;
    • 检查数据块损坏:EXECUTE DBMS_REPAIR.CHECK_OBJECT;
    • 运行 ANALYZE 命令:ANALYZE TABLE table_name VALIDATE STRUCTURE;
  • 数据库配置

    • 初始化参数:SHOW PARAMETER
    • 表空间配置:SELECT * FROM dba_tablespaces;
    • 数据文件配置:SELECT * FROM dba_data_files;
    • 重做日志配置:SELECT * FROM v$log;

数据库对象检查

  • 无效对象

    • 检查无效对象:SELECT object_name, object_type FROM dba_objects WHERE status = 'INVALID';
    • 重新编译无效对象:EXECUTE DBMS_UTILITY.COMPILE_SCHEMA('SCHEMA_NAME');
  • 过期统计信息

    • 检查过期统计信息:SELECT owner, table_name FROM dba_tab_statistics WHERE stale_stats = 'YES';
    • 收集统计信息:EXECUTE DBMS_STATS.GATHER_DATABASE_STATS;
  • 分区表

    • 检查分区表状态:SELECT * FROM dba_part_tables;
    • 检查分区索引状态:SELECT * FROM dba_part_indexes;
  • 外部表和目录

    • 检查外部表:SELECT * FROM dba_external_tables;
    • 检查目录对象:SELECT * FROM dba_directories;

安全检查

  • 用户和权限

    • 检查用户状态:SELECT username, account_status FROM dba_users;
    • 检查角色权限:SELECT * FROM dba_role_privs;
    • 检查系统权限:SELECT * FROM dba_sys_privs;
  • 审计配置

    • 检查审计设置:SELECT * FROM dba_audit_trail;
    • 确认审计表空间:SELECT * FROM dba_tables WHERE table_name LIKE 'AUD$%';
  • 密码策略

    • 检查密码策略:SELECT * FROM dba_profiles WHERE resource_type = 'PASSWORD';
    • 确认密码状态:SELECT username, account_status, lock_date FROM dba_users;

兼容性分析

应用兼容性

  • SQL 兼容性

    • 检查不兼容的 SQL 语法
    • 测试应用 SQL 语句
    • 分析执行计划变化
  • PL/SQL 兼容性

    • 检查不兼容的 PL/SQL 特性
    • 测试存储过程、函数、包
    • 检查 PL/SQL 语法变化
  • 数据类型兼容性

    • 检查数据类型变化
    • 测试数据类型转换
    • 确认字符集兼容性
  • API 兼容性

    • 检查 OCI、JDBC 等 API 变化
    • 测试应用连接
    • 确认驱动程序兼容性

数据库特性兼容性

  • 已弃用特性

    • 检查使用的已弃用特性
    • 制定替代方案
    • 测试新特性
  • 新特性评估

    • 评估目标版本的新特性
    • 确定是否启用新特性
    • 制定新特性使用计划
  • 参数变化

    • 检查初始化参数变化
    • 调整参数设置
    • 测试参数影响
  • 默认行为变化

    • 了解默认行为变化
    • 评估对应用的影响
    • 制定应对策略

备份策略

全库备份

  • 备份类型

    • RMAN 完整备份:BACKUP DATABASE PLUS ARCHIVELOG;
    • 物理备份:冷备份或热备份
    • 逻辑备份:数据泵导出
  • 备份验证

    • 验证备份完整性:VALIDATE BACKUPSET;
    • 测试备份恢复:在测试环境恢复
    • 确认备份可用于回滚
  • 备份存储

    • 本地存储:确保足够空间
    • 远程存储:复制备份到远程位置
    • 备份保留:确保备份保留到升级完成

关键对象备份

  • 数据泵导出

    • 导出关键模式:EXPDP system/password SCHEMAS=HR DIRECTORY=DATA_PUMP_DIR DUMPFILE=hr.dmp LOGFILE=expdp_hr.log
    • 导出关键表:EXPDP system/password TABLES=HR.EMPLOYEES DIRECTORY=DATA_PUMP_DIR DUMPFILE=employees.dmp LOGFILE=expdp_employees.log
    • 导出元数据:EXPDP system/password SCHEMAS=HR DIRECTORY=DATA_PUMP_DIR DUMPFILE=hr_metadata.dmp LOGFILE=expdp_hr_metadata.log CONTENT=METADATA_ONLY
  • 配置文件备份

    • 初始化参数文件:CREATE PFILE='pfile_backup.ora' FROM SPFILE;
    • 网络配置文件:tnsnames.ora, listener.ora
    • 密码文件:orapwSID
  • 诊断文件备份

    • Alert 日志:备份最新的 alert 日志
    • 跟踪文件:备份相关跟踪文件
    • 审计文件:备份审计文件

预检查工具

使用 DBUA 预检查

  • 启动 DBUA

    • Windows:开始菜单 -> Oracle -> Database Upgrade Assistant
    • Linux:$ORACLE_HOME/bin/dbua
  • 执行预检查

    • 选择 "只执行预检查"
    • 选择数据库
    • 运行预检查
    • 查看预检查报告
  • 修复问题

    • 根据预检查报告修复问题
    • 重新运行预检查
    • 确保所有问题都已解决

使用 preupgrade.jar

  • 获取 preupgrade.jar

    • 从目标 Oracle 版本的 $ORACLE_HOME/rdbms/admin 目录获取
    • 或从 Oracle 官网下载
  • 执行预检查

    bash
    # 设置环境变量
    export ORACLE_HOME=当前 Oracle 主目录
    export ORACLE_SID=数据库实例名
    
    # 执行预检查
    java -jar preupgrade.jar FILE TEXT DIR /tmp/preupgrade
  • 查看报告

    • 检查 /tmp/preupgrade/preupgrade.log
    • 检查 /tmp/preupgrade/preupgrade_fixups.sql
    • 检查 /tmp/preupgrade/postupgrade_fixups.sql
  • 执行修复脚本

    sql
    -- 执行预升级修复脚本
    @/tmp/preupgrade/preupgrade_fixups.sql
    
    -- 备份修复脚本执行结果
    spool /tmp/preupgrade/fixups.log
    @/tmp/preupgrade/preupgrade_fixups.sql
    spool off

自定义检查脚本

  • 数据库状态检查

    sql
    -- 检查数据库状态
    SET LINESIZE 200
    COL STATUS FOR A10
    COL DATABASE_STATUS FOR A20
    SELECT INSTANCE_NAME, STATUS, DATABASE_STATUS FROM v$instance;
    
    -- 检查归档模式
    SELECT LOG_MODE FROM v$database;
    
    -- 检查无效对象
    SELECT COUNT(*) FROM dba_objects WHERE STATUS = 'INVALID';
    
    -- 检查表空间使用情况
    SELECT TABLESPACE_NAME, ROUND((USED_SPACE * 8) / 1024, 2) AS USED_MB,
           ROUND((TOTAL_SPACE * 8) / 1024, 2) AS TOTAL_MB,
           ROUND((USED_SPACE / TOTAL_SPACE) * 100, 2) AS USED_PERCENT
    FROM dba_tablespace_usage_metrics
    ORDER BY USED_PERCENT DESC;
  • 兼容性检查

    sql
    -- 检查使用的已弃用特性
    SELECT * FROM dba_feature_usage_statistics 
    WHERE VERSION = (SELECT version FROM v$instance) 
    AND USAGE_COUNT > 0 
    AND DETECTED_USAGES > 0;
    
    -- 检查时间戳类型
    SELECT TABLE_NAME, COLUMN_NAME, DATA_TYPE 
    FROM dba_tab_columns 
    WHERE DATA_TYPE LIKE '%TIMESTAMP%';
    
    -- 检查分区表
    SELECT COUNT(*) FROM dba_part_tables;

测试环境准备

搭建测试环境

  • 环境复制

    • 使用备份恢复创建测试环境
    • 使用 Data Guard 创建备用数据库作为测试环境
    • 使用 Oracle Database Duplicate 创建测试环境
  • 环境配置

    • 配置与生产环境相似的硬件和软件
    • 确保网络和存储配置相似
    • 配置相同的初始化参数
  • 数据同步

    • 确保测试环境数据与生产环境一致
    • 定期同步测试环境数据
    • 测试前最终同步

测试升级流程

  • 模拟升级

    • 在测试环境执行完整升级流程
    • 记录升级时间和步骤
    • 验证升级后数据库状态
  • 应用测试

    • 在测试环境测试应用连接和功能
    • 执行应用回归测试
    • 验证数据完整性和一致性
  • 性能测试

    • 测试升级后的性能
    • 比较升级前后的性能差异
    • 识别性能问题并优化
  • 回滚测试

    • 测试从备份恢复的流程
    • 验证回滚后数据库状态
    • 测试应用在回滚后的功能

文档准备

升级文档

  • 升级计划文档

    • 升级目标和范围
    • 升级路径和方法
    • 时间计划和人员安排
    • 风险评估和应对策略
  • 升级步骤文档

    • 详细的升级步骤
    • 每个步骤的执行命令
    • 预期结果和验证方法
    • 常见问题和解决方案
  • 回滚计划文档

    • 回滚触发条件
    • 详细的回滚步骤
    • 回滚后的验证方法
    • 回滚后的恢复策略

参考文档

  • Oracle 文档

    • Oracle Database Upgrade Guide
    • Oracle Database New Features Guide
    • Oracle Database Release Notes
  • 内部文档

    • 数据库架构文档
    • 应用架构文档
    • 历史升级文档
    • 问题记录文档
  • 外部资源

    • Oracle MOS 文档和补丁
    • 社区论坛和博客
    • 第三方工具文档

升级前最终检查

检查清单

  • 硬件和软件

    • [ ] 服务器硬件符合要求
    • [ ] 存储空间足够
    • [ ] 操作系统版本兼容
    • [ ] 操作系统补丁已应用
    • [ ] 目标 Oracle 软件已安装
    • [ ] 必要补丁已准备
  • 数据库

    • [ ] 数据库状态正常
    • [ ] 数据完整性验证通过
    • [ ] 无效对象已修复
    • [ ] 统计信息已更新
    • [ ] 分区表状态正常
    • [ ] 外部表和目录已检查
  • 备份

    • [ ] 全库备份已完成
    • [ ] 备份验证已通过
    • [ ] 关键对象已导出
    • [ ] 配置文件已备份
    • [ ] 备份存储在安全位置
  • 预检查

    • [ ] DBUA 预检查已通过
    • [ ] preupgrade.jar 检查已完成
    • [ ] 所有问题已修复
    • [ ] 修复脚本已执行
    • [ ] 测试环境升级已成功
  • 文档和沟通

    • [ ] 升级计划已审批
    • [ ] 升级步骤文档已准备
    • [ ] 回滚计划已准备
    • [ ] 相关人员已通知
    • [ ] 升级窗口已确认

风险评估

  • 高风险项

    • 数据库大小和复杂性
    • 应用兼容性问题
    • 硬件资源不足
    • 备份不完整
    • 升级时间超出预期
  • 风险缓解措施

    • 充分的测试
    • 详细的回滚计划
    • 额外的硬件资源
    • 多重备份策略
    • 分阶段升级
  • 应急响应

    • 建立应急响应团队
    • 准备应急联系人列表
    • 制定详细的应急流程
    • 准备应急工具和脚本

常见问题(FAQ)

Q1: 如何确定升级路径?

A1: 确定升级路径的方法:

  1. 确认当前 Oracle 版本:SELECT * FROM v$version;
  2. 参考 Oracle 文档中的升级路径矩阵
  3. 对于跨多个版本的升级,可能需要通过中间版本
  4. 考虑使用 Data Guard 或 GoldenGate 简化升级过程

Q2: 升级前需要多少存储空间?

A2: 升级所需存储空间估算:

  1. 目标 Oracle 软件安装空间:约 10-20GB
  2. 数据库扩展空间:当前数据库大小的 10-20%
  3. 临时空间:至少 10GB
  4. 备份空间:至少等于数据库大小

Q3: 如何处理无效对象?

A3: 处理无效对象的方法:

  1. 识别无效对象:SELECT object_name, object_type FROM dba_objects WHERE status = 'INVALID';
  2. 重新编译无效对象:
    sql
    -- 编译单个对象
    ALTER PROCEDURE procedure_name COMPILE;
    
    -- 编译整个模式
    EXECUTE DBMS_UTILITY.COMPILE_SCHEMA('SCHEMA_NAME');
    
    -- 使用 utlrp.sql 编译所有无效对象
    @?/rdbms/admin/utlrp.sql

Q4: 如何验证备份可用于回滚?

A4: 验证备份可用于回滚的方法:

  1. 在测试环境恢复备份
  2. 验证恢复后的数据库状态
  3. 测试应用连接和功能
  4. 确认数据完整性

Q5: 预检查工具发现的问题如何处理?

A5: 处理预检查工具发现问题的方法:

  1. 仔细阅读预检查报告
  2. 按照报告中的建议修复问题
  3. 执行预检查工具提供的修复脚本
  4. 重新运行预检查,确保问题已解决
  5. 对于无法解决的问题,制定变通方案

Q6: 如何减少升级停机时间?

A6: 减少升级停机时间的方法:

  1. 使用 Data Guard 进行升级:

    • 升级备用数据库
    • 执行角色切换
    • 验证新主数据库
  2. 使用 GoldenGate 进行零停机升级:

    • 配置 GoldenGate 复制
    • 升级目标数据库
    • 同步数据并切换
  3. 优化升级步骤:

    • 预创建必要的表空间
    • 预编译无效对象
    • 并行执行升级操作

Q7: 升级后需要做哪些验证?

A7: 升级后验证的内容:

  1. 数据库状态:SELECT status FROM v$instance;
  2. 数据库版本:SELECT * FROM v$version;
  3. 无效对象:SELECT COUNT(*) FROM dba_objects WHERE STATUS = 'INVALID';
  4. 应用连接和功能
  5. 数据完整性:运行关键查询和报告
  6. 性能:执行性能测试
  7. 备份:执行新的备份

Q8: 如何制定回滚计划?

A8: 制定回滚计划的方法:

  1. 确定回滚触发条件
  2. 详细记录回滚步骤:
    • 停止应用访问
    • 关闭数据库
    • 从备份恢复
    • 启动数据库
    • 验证数据库状态
    • 恢复应用访问
  3. 估算回滚时间
  4. 测试回滚流程
  5. 准备回滚所需的工具和脚本