Skip to content

Oracle 升级步骤

升级步骤概述

什么是升级步骤

Oracle 数据库升级步骤是指在进行数据库版本升级时,所执行的一系列具体操作和流程。升级步骤的目标是确保数据库升级能够按照计划顺利进行,最大限度地减少升级风险,保障业务的连续性。

升级步骤的重要性

  1. 确保升级顺利进行:详细的升级步骤可以确保升级过程按照计划执行,减少人为错误
  2. 提高升级成功率:规范的升级步骤可以提高升级的成功率
  3. 便于团队协作:明确的升级步骤可以提高团队成员之间的协作效率
  4. 便于回滚:详细的升级步骤可以在升级失败时快速回滚
  5. 便于后续参考:完整的升级步骤记录可以作为后续升级的参考

升级步骤的范围

Oracle 数据库升级步骤应包括以下范围:

  • 升级前准备步骤
  • 升级实施步骤
  • 升级后验证步骤
  • 常见问题和解决方案

升级前准备步骤

1. 最终环境检查

目标:确保数据库环境已准备就绪,适合进行升级

步骤

  • 检查数据库健康状态

    sql
    SELECT name, open_mode, database_status FROM v$database;
    SELECT status FROM v$instance;
    EXEC DBMS_HADR_CHECK.REPORT;
  • 检查数据库组件状态

    sql
    SELECT comp_name, version, status FROM dba_registry;
  • 检查无效对象

    sql
    SELECT owner, object_name, object_type FROM dba_objects WHERE status = 'INVALID';
  • 检查过期统计信息

    sql
    SELECT table_name, last_analyzed FROM dba_tables WHERE last_analyzed IS NULL OR last_analyzed < SYSDATE - 30;
  • 检查临时表空间

    sql
    SELECT tablespace_name, SUM(bytes)/1024/1024 free_mb FROM dba_free_space WHERE tablespace_name LIKE '%TEMP%' GROUP BY tablespace_name;

2. 执行最终备份

目标:确保在升级前有可靠的备份,以便在升级失败时回滚

步骤

  • 执行全量备份

    sql
    -- 使用 RMAN 执行全量备份
    RMAN> BACKUP DATABASE PLUS ARCHIVELOG;
  • 备份控制文件

    sql
    ALTER DATABASE BACKUP CONTROLFILE TO '/path/to/controlfile.bak';
    ALTER DATABASE BACKUP CONTROLFILE TO TRACE AS '/path/to/controlfile.sql';
  • 备份参数文件

    sql
    CREATE PFILE='/path/to/init.ora' FROM SPFILE;
  • 备份密码文件

    bash
    cp $ORACLE_HOME/dbs/orapw$ORACLE_SID /path/to/backup/

3. 准备升级环境

目标:为升级实施做好环境准备

步骤

  • 安装新版本 Oracle 软件:在新的 ORACLE_HOME 中安装新版本的 Oracle 软件
  • 应用最新补丁:在新的 ORACLE_HOME 中应用最新的补丁
  • 配置环境变量:设置新版本 Oracle 的环境变量
  • 创建升级响应文件:根据需要创建升级响应文件

升级实施步骤

1. 使用 AutoUpgrade 工具升级

目标:使用 AutoUpgrade 工具自动化执行数据库升级

步骤

步骤 1: 下载并安装 AutoUpgrade 工具

bash
# 从 Oracle MOS 下载最新版本的 AutoUpgrade 工具
# 将工具解压到新的 ORACLE_HOME 目录
unzip autoupgrade.jar -d $ORACLE_HOME/auto_upgrade

步骤 2: 创建 AutoUpgrade 配置文件

创建一个名为 autoupgrade.cfg 的配置文件:

ini
# 全局配置
global.autoupg_log_dir=/path/to/logs

# 数据库配置
upg1.dbname=ORCL
upg1.start_time=NOW
upg1.source_home=/u01/app/oracle/product/19.0.0/dbhome_1
upg1.target_home=/u01/app/oracle/product/21.0.0/dbhome_1
upg1.sid=ORCL
upg1.log_dir=/path/to/logs/orcl
upg1.upgrade_node=localhost
upg1.target_version=21
upg1.option=analyze

步骤 3: 执行预检查

bash
java -jar $ORACLE_HOME/auto_upgrade/autoupgrade.jar -config autoupgrade.cfg -mode analyze

步骤 4: 执行修复操作

bash
java -jar $ORACLE_HOME/auto_upgrade/autoupgrade.jar -config autoupgrade.cfg -mode fixups

步骤 5: 执行升级

bash
java -jar $ORACLE_HOME/auto_upgrade/autoupgrade.jar -config autoupgrade.cfg -mode deploy

步骤 6: 监控升级过程

bash
# 查看升级日志
tail -f /path/to/logs/orcl/upgrade20251225.log

# 使用 AutoUpgrade 状态命令
java -jar $ORACLE_HOME/auto_upgrade/autoupgrade.jar -config autoupgrade.cfg -mode status

2. 使用 DBUA 工具升级

目标:使用 DBUA 图形化工具执行数据库升级

步骤

步骤 1: 启动 DBUA 工具

bash
# 设置新版本 Oracle 的环境变量
export ORACLE_HOME=/u01/app/oracle/product/21.0.0/dbhome_1
export PATH=$ORACLE_HOME/bin:$PATH

# 启动 DBUA
$ORACLE_HOME/bin/dbua

步骤 2: 选择数据库

在 DBUA 欢迎界面,选择要升级的数据库实例

步骤 3: 升级选项

  • 选择升级选项,包括是否升级时区数据、是否编译无效对象等
  • 选择是否备份数据库

步骤 4: 升级前检查

DBUA 会执行升级前检查,显示检查结果和建议

步骤 5: 执行升级

  • 确认升级选项
  • 点击"Finish"按钮开始升级
  • 监控升级过程

3. 命令行升级

目标:使用命令行工具手动执行数据库升级

步骤

步骤 1: 关闭数据库

sql
SHUTDOWN IMMEDIATE;

步骤 2: 使用新版本 Oracle 启动数据库到 UPGRADE 模式

bash
# 设置新版本 Oracle 的环境变量
export ORACLE_HOME=/u01/app/oracle/product/21.0.0/dbhome_1
export PATH=$ORACLE_HOME/bin:$PATH
export ORACLE_SID=ORCL

# 启动数据库到 UPGRADE 模式
sqlplus / as sysdba
STARTUP UPGRADE;

步骤 3: 执行升级脚本

sql
-- 执行升级脚本
@$ORACLE_HOME/rdbms/admin/catctl.pl -d $ORACLE_HOME/rdbms/admin -l /path/to/logs upgrade

-- 或者使用并行升级
@$ORACLE_HOME/rdbms/admin/catctl.pl -n 4 -d $ORACLE_HOME/rdbms/admin -l /path/to/logs upgrade

步骤 4: 运行 postupgrade_fixups.sql 脚本

sql
@$ORACLE_HOME/rdbms/admin/postupgrade_fixups.sql

步骤 5: 关闭并重启数据库到正常模式

sql
SHUTDOWN IMMEDIATE;
STARTUP;

步骤 6: 执行 catuppst.sql 脚本

sql
@$ORACLE_HOME/rdbms/admin/catuppst.sql

步骤 7: 编译无效对象

sql
@$ORACLE_HOME/rdbms/admin/utlrp.sql

升级后验证步骤

1. 数据库基本状态验证

目标:验证数据库已成功升级,基本功能正常

步骤

  • 检查数据库版本

    sql
    SELECT * FROM v$version;
    SELECT version FROM v$instance;
  • 检查数据库状态

    sql
    SELECT name, open_mode, database_status FROM v$database;
    SELECT status FROM v$instance;
  • 检查数据库组件状态

    sql
    SELECT comp_name, version, status FROM dba_registry;

2. 数据库功能验证

目标:验证数据库的核心功能正常

步骤

  • 测试 SQL 执行

    sql
    SELECT * FROM dual;
    CREATE TABLE test_table (id NUMBER, name VARCHAR2(50));
    INSERT INTO test_table VALUES (1, 'Test');
    SELECT * FROM test_table;
    DROP TABLE test_table;
  • 测试 PL/SQL 执行

    sql
    CREATE OR REPLACE PROCEDURE test_proc AS
    BEGIN
      DBMS_OUTPUT.PUT_LINE('Test Procedure');
    END;
    /
    
    SET SERVEROUTPUT ON;
    EXEC test_proc;
    DROP PROCEDURE test_proc;
  • 测试备份功能

    sql
    -- 执行一个简单的备份测试
    RMAN> BACKUP TABLESPACE SYSTEM SIZE 1G;

3. 应用兼容性验证

目标:验证应用与升级后的数据库兼容

步骤

  • 运行应用测试套件:执行应用的自动化测试套件
  • 测试关键业务流程:手动测试应用的关键业务流程
  • 检查应用日志:查看应用日志,确认没有与数据库相关的错误

4. 性能验证

目标:验证数据库性能是否符合要求

步骤

  • 运行性能测试:执行预定义的性能测试脚本

  • 比较性能指标:将升级后的性能指标与升级前进行比较

  • 检查等待事件

    sql
    SELECT event, COUNT(*) FROM v$session_wait GROUP BY event ORDER BY COUNT(*) DESC;
  • 检查系统负载

    sql
    SELECT * FROM v$system_load;
    SELECT * FROM v$sysmetric WHERE metric_name LIKE '%%Load%%';

5. 安全性验证

目标:验证数据库的安全性配置正常

步骤

  • 检查用户和权限

    sql
    SELECT username, account_status FROM dba_users;
    SELECT grantee, privilege FROM dba_sys_privs WHERE grantee NOT IN ('SYS', 'SYSTEM');
  • 检查审计配置

    sql
    SHOW PARAMETER audit;
    SELECT * FROM dba_audit_trail WHERE event_timestamp > SYSDATE - 1;
  • 检查密码策略

    sql
    SELECT * FROM dba_profiles WHERE profile = 'DEFAULT';

常见问题和解决方案

1. 升级过程中出现 ORA-00904: "UPGRADE_DATA": invalid identifier

问题描述:升级过程中出现 "ORA-00904: "UPGRADE_DATA": invalid identifier" 错误

解决方案

  • 确保使用的是最新版本的 AutoUpgrade 工具
  • 检查源数据库的版本和补丁级别,确保符合升级要求
  • 应用源数据库的最新补丁

2. 升级后出现大量无效对象

问题描述:升级后数据库中出现大量无效对象

解决方案

  • 执行 utlrp.sql 脚本重新编译无效对象:
    sql
    @$ORACLE_HOME/rdbms/admin/utlrp.sql
  • 检查无效对象的错误信息:
    sql
    SELECT owner, object_name, object_type, status, error FROM dba_objects WHERE status = 'INVALID';
  • 根据错误信息手动修复无效对象

3. 升级后应用连接失败

问题描述:升级后应用无法连接到数据库

解决方案

  • 检查监听器配置:

    bash
    lsnrctl status
    lsnrctl services
  • 检查 tnsnames.ora 配置:

    bash
    cat $ORACLE_HOME/network/admin/tnsnames.ora
  • 检查数据库监听状态:

    sql
    SELECT status FROM v$listener_network;
  • 检查用户密码和权限:

    sql
    SELECT username, account_status FROM dba_users WHERE username = 'APP_USER';

4. 升级后性能下降

问题描述:升级后数据库性能下降

解决方案

  • 收集最新的统计信息:

    sql
    EXEC DBMS_STATS.GATHER_DATABASE_STATS;
  • 检查执行计划变化:

    sql
    EXPLAIN PLAN FOR SELECT * FROM employees WHERE department_id = 10;
    SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY());
  • 检查参数设置:

    sql
    SELECT name, value FROM v$parameter WHERE isdefault = 'FALSE';
  • 检查等待事件:

    sql
    SELECT event, COUNT(*) FROM v$session_wait GROUP BY event ORDER BY COUNT(*) DESC;

Oracle 19c vs 21c 升级步骤差异

特性Oracle 19cOracle 21c
AutoUpgrade 支持支持,但功能相对有限增强的 AutoUpgrade 支持,提供更自动化的升级体验
升级前检查基本的升级前检查增强的升级前检查,提供更详细的建议和修复选项
升级后验证基本的升级后验证增强的升级后验证,支持更多的验证选项
云环境支持基本的云环境支持增强的云环境支持,支持云原生数据库升级
自动化程度有限的自动化程度增强的自动化程度,支持更多的自动化操作

FAQ

Q: 升级过程中遇到错误如何处理?

A: 升级过程中遇到错误时,应:

  1. 详细记录错误信息,包括错误代码、错误描述和上下文
  2. 查看升级日志和跟踪文件,获取更多信息
  3. 根据错误信息搜索 Oracle MOS 或官方文档
  4. 尝试按照错误提示进行修复
  5. 如果无法修复,执行回滚计划

Q: 升级后如何处理时区数据?

A: 升级后处理时区数据的步骤:

  1. 检查当前时区版本:

    sql
    SELECT version FROM v$timezone_file;
  2. 如果需要升级时区数据,执行以下命令:

    sql
    SHUTDOWN IMMEDIATE;
    STARTUP UPGRADE;
    @$ORACLE_HOME/rdbms/admin/dbms_dst.upgrade_db(1, TRUE, TRUE);
    SHUTDOWN IMMEDIATE;
    STARTUP;

Q: 升级后如何迁移统计信息?

A: 升级后迁移统计信息的步骤:

  1. 在源数据库中导出统计信息:

    sql
    EXEC DBMS_STATS.EXPORT_DATABASE_STATS('STAT_TABLE', 'SYS');
  2. 在目标数据库中导入统计信息:

    sql
    EXEC DBMS_STATS.IMPORT_DATABASE_STATS('STAT_TABLE', 'SYS');

Q: 升级后如何更新客户端软件?

A: 升级后更新客户端软件的步骤:

  1. 检查客户端软件版本:

    bash
    sqlplus -v
  2. 下载并安装与服务器版本兼容的客户端软件

  3. 更新客户端配置文件,如 tnsnames.ora 和 sqlnet.ora

  4. 测试客户端连接:

    bash
    sqlplus username/password@service_name

最佳实践

  1. 严格按照升级步骤执行:严格按照预定义的升级步骤执行,避免跳过或修改步骤
  2. 详细记录升级过程:详细记录升级过程中的每一步操作和结果,包括时间、命令、输出等
  3. 保持沟通:升级过程中保持团队成员之间的沟通,及时汇报进展和问题
  4. 准备应急方案:在升级前准备详细的应急方案,包括回滚计划
  5. 监控升级过程:密切监控升级过程,及时发现和处理问题
  6. 升级后进行全面验证:升级后进行全面的验证,确保数据库功能正常
  7. 定期备份:在升级过程中的关键节点进行备份,以便在需要时回滚
  8. 遵循 Oracle 最佳实践:严格遵循 Oracle 官方文档和最佳实践进行升级

总结

Oracle 数据库升级步骤是确保升级成功的关键。通过严格按照预定义的升级步骤执行,可以提高升级的成功率,减少升级风险,保障业务的连续性。升级步骤应包括升级前准备、升级实施和升级后验证等阶段,每个阶段都应有详细的操作指南和验证标准。

在选择升级方法时,应根据数据库环境、业务需求和团队能力等因素进行综合考虑。无论选择哪种升级方法,都应制定详细的升级计划和回滚计划,并在升级前进行充分的测试和准备。

升级完成后,应进行全面的验证,确保数据库的基本功能、应用兼容性、性能和安全性等方面都符合要求。同时,应详细记录升级过程,以便后续参考和改进。