PDB未按预期时间执行自动统计信息收集问题分析

问题描述

查看 dba_optstat_operations 发现2026-02-09 为周一但是 gather_database_stats (auto) 在2026-02-09 (02时,06时,10时,14时) 白天执行了4次自动统计信息收集

查看Scheduler windows显示周一的执行窗口开始时间为22时,总时长为4h,与我们查出来的实际执行时间不相符

下面我们将针对两个疑点进行解答:

问题1:为何每隔4小时多次运行自动统计信息收集?

问题2:2/9 为周一,按照Scheduler windows结果,周一的执行时间应为22时,为何在白天时间段运行?

分析:为何每隔4小时多次运行自动统计信息收集?

参考19c官方手册:

https://docs.oracle.com/en/database/oracle/oracle-database/19/admin/managing-automated-database-maintenance-tasks.html#GUID-BF691BB0-DC60-4829-A790-4C5BEB281FF1

官方手册里提到:如果维护窗口时长很长,则除Automatic SQL Tuning Advisor以外的所有自动维护任务都会每隔四小时重新开始运行。此功能可以确保维护任务定期运行,无论窗口的大小如何。

这里说明了为何会出现每4h执行一次统计信息收集

分析:2/9 为周一,按照Scheduler windows结果,周一的执行时间应为22时,为何在白天时间段运行?

参考官方文档:KB140350

官方文档中提到,由于在12c,18c,19c 中使用DBCA通用模板创建数据库时,CDB与PDB中Scheduler默认时区不同。

使用DBCA通用模板建库时无论CDB的Scheduler默认时区如何,在19c中PDB的Scheduler 默认时区为PST8PDT,这是Oracle预期行为。

查看环境中CDB$ROOT与PDB的Scheduler 默认时区果然不同

PRC时区与PST8PDT时区在非夏令时期间相差16h。

通过 dba_autotask_job_history 中的WINDOW_STATR_TIME 与 JOB_START_TIME的差异也可以看出 UTC 的2月11日14时对应的PST8PDT 2月10日 22时,两个时间确实相差16h

通过这个结论换算一下 UTC的2月9日2时、6时、10时、14时实际为PST8PDT的2月8日10时、14时、16时、20时,2月8日为周天,按照预期是在白天执行的自动统计信息收集,再结合前面得出的每4h跑一次scheduler的结论,换算后的执行时间完全符合预期

问题结论

问题1:为何每隔4小时多次运行自动统计信息收集?

解答:参考19c官方手册,如果维护窗口时长很长,则除Automatic SQL Tuning Advisor以外的所有自动维护任务都会每隔四小时重新开始运行。此为Oracle的预期行为。

问题2:2/9 为周一,按照Scheduler windows结果,周一的执行时间应为22时,为何在白天时间段运行?

解答:参考官方文档KB140350,2月9日周一白天运行自动统计信息收集任务的原因实际为CDB$ROOT Scheduler默认时区(PRC)比PDB Scheduler默认时区(PST8PDT)快16h导致的差异,PDB层面是按照PST8PDT的Scheduler时区执行的自动调度任务,也就是按照PST8PDT时区2月8日6时的周日调度任务,实际在北京时间2月8日22时开始执行,结合前一个结论间隔4小时运行一次,也会在2月9日2时、6时、10时、14时再调度一次。

解决方案

1.调整PDB的Scheduler默认时区与CDB$ROOT一致,若对生产无影响,不建议调整,以避免产生其他未知的问题

参考官方文档 KB139437

在PDB中执行

sql 复制代码
--查看PDB当前scheduler时区与时间戳
select dbms_scheduler.stime from dual;
--在PDB中修改Scheduler默认时区与CDB$ROOT一致
exec DBMS_SCHEDULER.SET_SCHEDULER_ATTRIBUTE('default_timezone','PRC');
--再次PDB查看当前scheduler时区与时间戳
select dbms_scheduler.stime from dual;

select * from dba_scheduler_global_attribute where ATTRIBUTE_NAME like '%TIMEZONE%';

2.后续使用DBCA通用模板创建数据库,请设置PDB Scheduler 的默认时区

相关推荐
Leon-Ning Liu1 天前
【真实经验分享】ORA-12516 排查实录:共享服务器模式下 SHARED_SERVER_SESSIONS 不足引发的监听故障
运维·服务器·oracle
snpgroupcn1 天前
企业有必要做 SAP 数据归档吗?优势与价值分析
数据库·oracle
曹牧2 天前
Java:BeanListHandler
java·数据库·oracle
不想纳尼的青春2 天前
where = 的作用?会影响性能吗?count(*) 和 count()哪个快?
数据库·oracle
杨云龙UP2 天前
生产环境Oracle表空间扩容实战:使用Toad for Oracle图形界面新增Datafile(ASM+OMF)
linux·运维·数据库·oracle·表空间·asm 存储管理·toad
惜分飞2 天前
Oracle Block Edit Tool (obet) 功能增强–2026.07
数据库·oracle·obet
#六脉神剑3 天前
myBuilder新版本(8月,Office文件预览、Oracle数据库支持)
数据库·oracle·开发平台·数字化工具·mybuilder
空杆推不起3 天前
穿透数据库 JOIN 核心:语法分类、底层算法、生产优化与高频坑点全解析
数据库·oracle
传说故事4 天前
数据库中一些常用英文单词含义
数据库·oracle