问题表现
某客户在恢复 Oracle 数据库的单表时,提示类似下面的信息:
....... Creating automatic instance, with SID='<oracle_sid>' initialization parameters used for automatic instance: db_name=<db_name> db_unique_name=<db_unique_name> compatible=19.0.0 db_block_size=8192 db_files=200 diagnostic_dest=<path> _system_trig_enabled=FALSE sga_target=2560M processes=200 db_create_file_dest=<path> log_archive_dest_1='location=<path>' #No auxiliary parameter file used RMAN-00571: =========================================================== RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS =============== RMAN-00571: =========================================================== RMAN-03002: failure of recover command at 04/12/2020 08:16:32 RMAN-04025: unable to generate a temporary file
问题分析
初步怀疑是客户的文件系统空间或权限的问题,造成 auxiliary 数据库的写出现了问题,但仔细检查却没有发现这方面的问题,感到很困惑!
经过在各大论坛查找,有提示说 Windows 平台下的一个补丁没有打完整会出现这种情况,但出现问题的客户平台是 Linux 平台,但这毕竟是一个线索!
立刻检查一下 Oracle 软件的补丁情况:
$ ./opatch lspatches 31281355;Database Release Update : 19.8.0.0.200714 (31281355) 31219897;OJVM RELEASE UPDATE: 19.8.0.0.200714 (31219897) 29585399;OCW RELEASE UPDATE 19.3.0.0.0 (29585399) OPatch succeeded.
再检查一下 Oracle 数据库的补丁情况
SQL> set linesize 200 SQL> select patch_id,action,status,SOURCE_VERSION,TARGET_VERSION from dba_registry_sqlpatch; PATCH_ID ACTION STATUS SOURCE_VERSION TARGET_VERSION ---------- --------------- ------------------------- --------------- --------------- 29517242 APPLY SUCCESS 19.1.0.0.0 19.3.0.0.0
发现 Oracle 软件的补丁和数据库的补丁不一致!!!
经过和客户的 DBA 沟通得知,上一周客户刚将 Oracle 软件从 19.3.0.0 升级 19.8.0.0,很显然上次客户在给 Oracle 打补丁的时候,DBA 没有执行 datapatch 修改数据库的 sql 文件。
问题解决
执行 datapatch:
[oracle@dell OPatch]$ ./datapatch -verbose SQL Patching tool version 19.8.0.0.0 Production on Fri Sep 18 16:53:54 2020 Copyright (c) 2012, 2020, Oracle. All rights reserved. Log file for this invocation: /opt/oracle/cfgtoollogs/sqlpatch/sqlpatch_1376_2020_09_18_16_53_54/sqlpatch_invocation.log Connecting to database...OK Gathering database info...done ....... SQL Patching tool complete on Fri Sep 18 16:54:53 2020 [oracle@dell OPatch]$
确认补丁版本:
SQL> select patch_id,action,status,SOURCE_VERSION,TARGET_VERSION from dba_registry_sqlpatch; PATCH_ID ACTION STATUS SOURCE_VERSION TARGET_VERSION ---------- --------------- ------------------------- --------------- --------------- 31219897 APPLY SUCCESS 19.1.0.0.0 19.1.0.0.0 31281355 APPLY SUCCESS 19.1.0.0.0 19.8.0.0.0 SQL>
再次执行 Oracle 数据库的单表恢复,成功!!!
思考
有的 DBA 抱怨,Oracle 为什么不把 Datapatch 和 OPatch 合并到一起执行,但实际上把这两者合并在一起是有困难的。因为 OPatch 在数据库关闭时执行,而 Datapatch 要求数据库是打开以完成其活动。
但opatchauto这个工具可以自动完成这个两项工作,中间还会打开数据库,但我实际使用时发现它不会把pdb打开,并在pdb里面执行sql文件,这应该是Oracle的bug。