问题现象: 业务侧反馈下午1点左右出现数据库相应较慢, 影响业务,无具体报错。 问题排查: 反馈数据库较慢,首先查看故障时间段的历史会话视图,以及awr报告,大致定位问题,发现在该时间点,数据库存在大量library cache lock异常等待。这个等待事件也是个老演员了,本质是共享内存资源的并发控制冲突。我们重点排查DDL、统计信息、绑定变量以及是否有会话异常。 我们首先确认DDL情况,明确在故障期间并没有对象DDl和编译动作。 其次,我们确认统计信息。查看统计信息计划,并未人工调整时间,sql如下:
select t1.window_name,t1.repeat_interval,t1.duration from dba_scheduler_windows t1,dba_scheduler_wingroup_members t2
where t1.window_name=t2.window_name and t2.window_group_name in ('MAINTENANCE_WINDOW_GROUP','BSLN_MAINTAIN_STATS_SCHED');
进一步确认统计信息作业调度情况,sql如下:
select t.log_id, t.LOG_DATE, t.JOB_NAME, t.STATUS, t.ACTUAL_START_DATE, to_char((to_timestamp_tz(ACTUAL_START_DATE) at time zone '+08:00'), 'yyyy-mm-dd hh24:mi:ss') "ACTUAL_START_DATE_+8", t.RUN_DURATION, t.con_id from cdb_scheduler_job_run_details t where job_name LIKE 'ORA$AT_OS%' and con_id = 3 order by log_date;

发现调度时间设置为晚上10点,但是实际作业执行时间为第二天下午1点,正好是故障时间期间。注意到这里出现的PST8PDT,需要进一步确认下数据库时区。 在CDB中执行如下命令,确认CDB和PDB的当前默认时区设置:
SELECT t.CON_ID, t.ATTRIBUTE_NAME, t.VALUE FROM CDB_SCHEDULER_GLOBAL_ATTRIBUTE t WHERE t.ATTRIBUTE_NAME = 'DEFAULT_TIMEZONE' ORDER BY 1;
发现CDB的时区是中国标准时间(PRC, UTC+8),但是PDB 的时区设置的是PST8PDT。 问题处理: 修改PDB的时区,以解决调度窗口错乱问题。
ALTER SESSION SET CONTAINER=pdb1;
EXEC DBMS_SCHEDULER.SET_SCHEDULER_ATTRIBUTE('default_timezone', 'PRC');
参考文档: Default Scheduler Timezone Value In PDB$SEED Different Than CDB (Doc ID 2702230.1)
