外观
Oracle 升级前准备
升级规划
确定升级路径
当前版本评估:
- 确认当前 Oracle 版本:
SELECT * FROM v$version; - 确认数据库补丁级别:
SELECT * FROM dba_registry_history;
- 确认当前 Oracle 版本:
目标版本选择:
- 考虑 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;
- 运行 RMAN 验证:
数据库配置:
- 初始化参数:
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; - 物理备份:冷备份或热备份
- 逻辑备份:数据泵导出
- RMAN 完整备份:
备份验证:
- 验证备份完整性:
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: 确定升级路径的方法:
- 确认当前 Oracle 版本:
SELECT * FROM v$version; - 参考 Oracle 文档中的升级路径矩阵
- 对于跨多个版本的升级,可能需要通过中间版本
- 考虑使用 Data Guard 或 GoldenGate 简化升级过程
Q2: 升级前需要多少存储空间?
A2: 升级所需存储空间估算:
- 目标 Oracle 软件安装空间:约 10-20GB
- 数据库扩展空间:当前数据库大小的 10-20%
- 临时空间:至少 10GB
- 备份空间:至少等于数据库大小
Q3: 如何处理无效对象?
A3: 处理无效对象的方法:
- 识别无效对象:
SELECT object_name, object_type FROM dba_objects WHERE status = 'INVALID'; - 重新编译无效对象:sql
-- 编译单个对象 ALTER PROCEDURE procedure_name COMPILE; -- 编译整个模式 EXECUTE DBMS_UTILITY.COMPILE_SCHEMA('SCHEMA_NAME'); -- 使用 utlrp.sql 编译所有无效对象 @?/rdbms/admin/utlrp.sql
Q4: 如何验证备份可用于回滚?
A4: 验证备份可用于回滚的方法:
- 在测试环境恢复备份
- 验证恢复后的数据库状态
- 测试应用连接和功能
- 确认数据完整性
Q5: 预检查工具发现的问题如何处理?
A5: 处理预检查工具发现问题的方法:
- 仔细阅读预检查报告
- 按照报告中的建议修复问题
- 执行预检查工具提供的修复脚本
- 重新运行预检查,确保问题已解决
- 对于无法解决的问题,制定变通方案
Q6: 如何减少升级停机时间?
A6: 减少升级停机时间的方法:
使用 Data Guard 进行升级:
- 升级备用数据库
- 执行角色切换
- 验证新主数据库
使用 GoldenGate 进行零停机升级:
- 配置 GoldenGate 复制
- 升级目标数据库
- 同步数据并切换
优化升级步骤:
- 预创建必要的表空间
- 预编译无效对象
- 并行执行升级操作
Q7: 升级后需要做哪些验证?
A7: 升级后验证的内容:
- 数据库状态:
SELECT status FROM v$instance; - 数据库版本:
SELECT * FROM v$version; - 无效对象:
SELECT COUNT(*) FROM dba_objects WHERE STATUS = 'INVALID'; - 应用连接和功能
- 数据完整性:运行关键查询和报告
- 性能:执行性能测试
- 备份:执行新的备份
Q8: 如何制定回滚计划?
A8: 制定回滚计划的方法:
- 确定回滚触发条件
- 详细记录回滚步骤:
- 停止应用访问
- 关闭数据库
- 从备份恢复
- 启动数据库
- 验证数据库状态
- 恢复应用访问
- 估算回滚时间
- 测试回滚流程
- 准备回滚所需的工具和脚本
