在Oracle19c进行19.15RU补丁升级时,数据库通过datapatch工具进行RU补丁更新,datapatch执行缓慢(1个小时+),长时间未返回信息。
问题:
数据库补丁更新datapatch执行缓慢(1个小时+),长时间会返回信息。
问题原因:
datapatch进行补丁更新,会对数据库的数据字典进行统计信息收集,由于历史统计信息字典表OPTSTAT_XXX数据量太大(195G+),导致统计信息收集长时间未完成,数据库补丁更新datapatch执行缓慢。
问题分析:
查看datapatch执行窗口,datapatch -verbose命令已经执行超过1个小时,命令没有任何输出,日志sqlpatch_xxxx.log也没有任何的输出。

进到数据库里面查看当前的长时间执行会话。
SELECT SE.SID,OPNAME,TRUNC(SOFAR TOTALWORK * 100, 2) || '%' AS PCT_WORK,ELAPSED_SECONDS ELAPSED,ROUND(ELAPSED_SECONDS * (TOTALWORK - SOFAR) SOFAR) REMAIN_TIME,SQL_FULLTEXTFROM V$SESSION_LONGOPS SL, V$SQLAREA SA, V$SESSION SEWHERE SL.SQL_HASH_VALUE = SA.HASH_VALUE and SOFAR>0AND SL.SID = SE.SIDAND SOFAR != TOTALWORKORDER BY START_TIME

COL OCCUPANT_NAME FOR A25COL OCCUPANT_DESC FOR A20COL SCHEMA_NAME FOR A20COL MOVE_PROCEDURE FOR A40COL MOVE_PROCEDURE_DESC FOR A20SET LINES 200 PAGES 1200SELECT SCHEMA_NAME,OCCUPANT_NAME,SPACE_USAGE_KBYTES/1024/1024 GBFROM V$SYSAUX_OCCUPANTS WHERE ROWNUM <20 ORDER BY 3;

由于统计信息收集的预估完成时间为18090秒超过了补丁升级窗口时间,所以没法等待统计信息收集的完成,需要人为进行干预解决。


Died at u01/app/oracle/product/19.0.0/db_1/rdbms/admin/catcon.pm line 18217--如果无法取消datapatch命令,可以Kill掉datapatch的OS进程bash-5.0$ ps -ef |grep -i datapatoracle 14418408 11077094 0 22:33:09 pts/6 0:00 grep -i datapatoracle 7471996 21102938 0 20:42:38 pts/3 0:00 bin/sh ./datapatch -verbosebash-5.0$ kill -9 7471996
执行datapatch rollback回滚数据库的补丁信息,确保先前执行的datapatch信息被回退干净。
datapatch -rollback -verbose
如果执行回滚失败,出现Unable to acquire sqlpatch global lock in EXCLUSIVE mode because another datapatch session is currently running,则说明之前的datapatch会话还存在于数据库,需要进行清理。
--查杀等待事件enq: UL - contention所在的堵塞会话--因为datapatch会话请求持有的是用户定义的'UL' (User-defined Lock)锁select blocking_sessionfrom gv$sessionwhere event='enq: UL - contention'BLOCKING_SESSION----------------6051SQL> select spid2 from v$process3 where addr in (select paddr from v$session where sid=6051);SPID----------------------------------17564290bash-5.0$ kill -9 17564290
修改_optim_dict_stats_at_db_cr_upg参数为FALSE。
alter system set "_optim_dict_stats_at_db_cr_upg"=FALSE;
重新执行datapatch -verbose,这一次补丁顺利完成安装用时19分钟,问题得到解决。
./datapatch -verboseInstalling patches...Patch installation complete. Total patches installed: 12Validating logfiles...donePatch 30128191 rollback (pdb CDB$ROOT): SUCCESSlogfile: /u01/app/oracle/cfgtoollogs/sqlpatch/30128191/23105199/30128191_rollback_XXXX_CDBROOT_2022Dec27_22_46_19.log (no errors)Patch 33806152 apply (pdb CDB$ROOT): SUCCESSlogfile: /u01/app/oracle/cfgtoollogs/sqlpatch/33806152/24747429/33806152_apply_XXXX_CDBROOT_2022Dec27_22_46_20.log (no errors)Patch 33808367 apply (pdb CDB$ROOT): SUCCESSlogfile: /u01/app/oracle/cfgtoollogs/sqlpatch/33808367/24710816/33808367_apply_XXXX_CDBROOT_2022Dec27_22_46_19.log (no errors)Patch 30128191 rollback (pdb PDB$SEED): SUCCESSlogfile: /u01/app/oracle/cfgtoollogs/sqlpatch/30128191/23105199/30128191_rollback_XXXX_PDBSEED_2022Dec27_22_56_05.log (no errors)Patch 33806152 apply (pdb PDB$SEED): SUCCESSlogfile: /u01/app/oracle/cfgtoollogs/sqlpatch/33806152/24747429/33806152_apply_XXXX_PDBSEED_2022Dec27_22_56_08.log (no errors)Patch 33808367 apply (pdb PDB$SEED): SUCCESSlogfile: /u01/app/oracle/cfgtoollogs/sqlpatch/33808367/24710816/33808367_apply_XXXX_PDBSEED_2022Dec27_22_56_07.log (no errors)Patch 30128191 rollback (pdb XXXX): SUCCESSlogfile: /u01/app/oracle/cfgtoollogs/sqlpatch/30128191/23105199/30128191_rollback_XXXX_XXXX_2022Dec27_22_56_05.log (no errors)Patch 33806152 apply (pdb XXXX): SUCCESSlogfile: /u01/app/oracle/cfgtoollogs/sqlpatch/33806152/24747429/33806152_apply_XXXX_XXXX_2022Dec27_22_56_06.log (no errors)Patch 33808367 apply (pdb XXXX): SUCCESSlogfile: /u01/app/oracle/cfgtoollogs/sqlpatch/33808367/24710816/33808367_apply_XXXX_XXXX_2022Dec27_22_56_06.log (no errors)Patch 30128191 rollback (pdb XXXX): SUCCESSlogfile: /u01/app/oracle/cfgtoollogs/sqlpatch/30128191/23105199/30128191_rollback_XXXX_XXXX_2022Dec27_22_56_05.log (no errors)Patch 33806152 apply (pdb XXXX): SUCCESSlogfile: /u01/app/oracle/cfgtoollogs/sqlpatch/33806152/24747429/33806152_apply_XXXX_XXXX_2022Dec27_22_56_06.log (no errors)Patch 33808367 apply (pdb XXXX): SUCCESSlogfile: /u01/app/oracle/cfgtoollogs/sqlpatch/33808367/24710816/33808367_apply_XXXX_XXXX_2022Dec27_22_56_06.log (no errors)
回退_optim_dict_stats_at_db_cr_upg参数为TRUE
alter system set "_optim_dict_stats_at_db_cr_upg"=TRUE;
OPTSTAT组件问题:
OPTSTAT表数据量大的问题:
OPTSTAT主要用于存放历史的统计信息,默认保留31天,数据量主要由以下因素影响
1 数据库表,索引的数量,表,索引的数量越大,存放历史信息的数据量就越多
2 统计信息收集的方式,频率,每执行一次统计信息收集,都会将旧的统计信息存放到历史统计信息里面,统计信息收集频率越多, 存放历史信息的数据量就越多
3 数据保留的期限
数据设置的保留时间越长,存放的数据量就越多
--查看当前的保留期限select dbms_stats.get_stats_history_retention from dual;--修改默认的保留期限exec dbms_stats.alter_stats_history_retention(10);

1 默认MMON进程会根据保留期限,定期进行清理,5分钟超时
2 执行命令进行清理
--按天进行清理beginfor i in reverse 10..100loopdbms_stats.purge_stats(sysdate-i);end loop;end;/--truncate全部表数据exec DBMS_STATS.PURGE_STATS(DBMS_STATS.PURGE_ALL)




