暂无图片
暂无图片
2
暂无图片
暂无图片
暂无图片

推荐阅读--19cPDB统计信息任务执行时间错乱

原创 董宏伟 云和恩墨 2023-04-21
453

前言

建议自查所维护的19c多租户数据库下是否存在此问题。

故障描述

19c版本多租户架构,pdb的统计信息任务执行时间错乱。
此问题为未发布的BUG 30076391,暂时无补丁解决方案,本文为workaround。

故障分析

PDB统计信息任务历史执行时间查看

因为ACTUAL_START_DATE列是TIMESTAMP WITH TIMEZONE类型,需要使用函数to_timestamp_tz转换为北京时间东八区。

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;

image.png

PDT(Pacific Daylight Time)太平洋夏令时。

北美的西海岸太平洋沿岸地区,大城市有:温哥华,西雅图,旧金山,洛杉矶,拉斯维加斯,圣迭戈,萨克拉门托,波特兰等在夏时制时用这一时间。
相对应的是PST(Pacific Standard Time )太平洋标准时间。
夏令时制结束后就是PST。
PDT转换成北京时间方法:
PDT从每年3月的第二个星期日到11月的第一个星期日期间和北京时间差15小时,其余月份和北京时间差16小时 。
例如:Oct 02, 2022 at 07:00 PDT = Oct 02, 2022 at 22:00 Beijing Time (7+15=22)

美国夏季始于每年4月的第1个周日,止于每年10月的最后一个周日。夏令时比正常时间早一小时。

PST是太平洋标准时间(西八区),与北京时间(东八区)时差-16个小时,也就是北京时间减去16就是PST时间。而PDT比PST早1个小时,就是说PDT与北京时间时差为-15小时。

也就是说PST8PDT转换成北京时间后,pdb本来晚上22点执行的统计信息采集任务,延迟15/16小时到第二天下午才执行!!!

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$ROOT调度窗口时区是正确的:PRC(中国标准时间),但是另外两个pdb的调度窗口时区是错误的:PST8PDT太平洋夏令时。


    CON_ID ATTRIBUTE_NAME                 VALUE
---------- ------------------------------ ------------------------------
         1 DEFAULT_TIMEZONE               PRC
         3 DEFAULT_TIMEZONE               PST8PDT
         4 DEFAULT_TIMEZONE               PST8PDT

解决方案

  1. 检查调度窗口执行时间
select t1.CON_ID,
       t1.window_name,
       t1.repeat_interval,
       t1.duration,
       t1.enabled,
       t1.next_start_date,
       to_char((to_timestamp_tz(t1.next_start_date) at time zone '+08:00'),
               'yyyy-mm-dd hh24:mi:ss') "next_start_date_+8"
  from cdb_scheduler_windows t1
 where t1.enabled = 'TRUE' and t1.con_id=3
 order by t1.con_id, t1.duration;

image.png
2. 修改调度窗口时区

alter session set container=<pdb_name>;
exec DBMS_SCHEDULER.SET_SCHEDULER_ATTRIBUTE('default_timezone','PRC');

修改后检查

    CON_ID ATTRIBUTE_NAME                 VALUE
---------- ------------------------------ ------------------------------
         1 DEFAULT_TIMEZONE               PRC
         3 DEFAULT_TIMEZONE               PRC
         4 DEFAULT_TIMEZONE               PRC
  1. 确认修改结果,修改后显示窗口时区为PRC,下次执行时间转换到北京时间也是正常期望的时间。
    image.png

参考文档

Default Scheduler Timezone Value In PDB$SEED Different Than CDB (Doc ID 2702230.1)


订阅号:DongDB手记
墨天轮:https://www.modb.pro/u/231198
扫码_搜索联合传播样式白色版.png

最后修改时间:2023-04-22 19:24:10
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
2人已赞赏
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论