在Oracle資料庫中,一般人們可能只會關註資料庫的時區或會話的時區,但是很少有人會關註Scheduler的時區設置,因為Scheduler的時區設置一般只會影響作業的scheduler和Windows的運行,很多時候,人們往往沒有註意到它。這裡簡單總結一下這個知識點。 在Oracle 10g/11 ...
在Oracle資料庫中,一般人們可能只會關註資料庫的時區或會話的時區,但是很少有人會關註Scheduler的時區設置,因為Scheduler的時區設置一般只會影響作業的scheduler和Windows的運行,很多時候,人們往往沒有註意到它。這裡簡單總結一下這個知識點。
在Oracle 10g/11g中,資料庫的scheduler的時區是全局統一的,但是從Oracle 12c開始,多租戶架構中,CDB和各個PDB的scheduler的時區設置是分開的。我們一般可以通過下麵幾種方法查看資料庫的scheduler時區信息
方法1:
select dbms_scheduler.stime from dual;
方法2:
set linesize 680
col attribute_name for a20
col value for a30
select * from dba_scheduler_global_attribute
where attribute_name like '%TIMEZONE%';
方法3:
get_scheduler_attributes.sql腳本
SET SERVEROUTPUT ON
show con_name;
EXEC DBMS_OUTPUT.put_line(RPAD('-',60,'-'));
DECLARE
PROCEDURE display(p_param IN VARCHAR2) AS
l_result VARCHAR2(50);
BEGIN
DBMS_SCHEDULER.get_scheduler_attribute(
attribute => p_param,
value => l_result);
DBMS_OUTPUT.put_line(RPAD(p_param, 30, ' ') || ' : ' || l_result);
END;
BEGIN
display('current_open_window');
display('default_timezone');
display('email_sender');
display('email_server');
display('event_expiry_time');
display('log_history');
display('max_job_slave_processes');
END;
/
如下所示,我們在CDB容器下,查看資料庫的Scheduler時區信息,如下所示,第一個SQL可以判斷為東八區設置,其它兩個SQL的值為null,表示使用systimestamp的時區。而當前systimestamp的時區為東八區
SQL> select dbms_scheduler.stime from dual;
STIME
---------------------------------------------------------------------------
11-SEP-23 10.04.37.395374000 PM +08:00
SQL> set linesize 680
SQL> col attribute_name for a20
SQL> col value for a30
SQL> select * from dba_scheduler_global_attribute
2 where attribute_name like '%TIMEZONE%';
ATTRIBUTE_NAME VALUE
-------------------- ------------------------------
DEFAULT_TIMEZONE
SQL> @get_scheduler_attributes.sql
CON_NAME
------------------------------
CDB$ROOT
------------------------------------------------------------
PL/SQL procedure successfully completed.
current_open_window : MONDAY_WINDOW
default_timezone :
email_sender :
email_server :
event_expiry_time :
log_history : 30
max_job_slave_processes :
PL/SQL procedure successfully completed.
SQL>
官方文檔[1]中的介紹如下
When start_date is NULL, the Scheduler determines the time zone for the repeat interval as follows:
It checks whether or not the session time zone is a region name. The session time zone can be set by either:
Issuing an ALTER SESSION statement, for example:
SQL> ALTER SESSION SET time_zone = 'Asia/Shanghai';
Setting the ORA_SDTZ environment variable.
If the session time zone is an absolute offset instead of a region name, the Scheduler uses the value of the DEFAULT_TIMEZONE Scheduler attribute. For more information, see the SET_SCHEDULER_ATTRIBUTE Procedure.
If the DEFAULT_TIMEZONE attribute is NULL, the Scheduler uses the time zone of systimestamp when the job or window is enabled.
在Oracle 19c中,一般用DBCA創建的PDB資料庫,它的scheduler時區預設為PST8PDT, 如下所示,PST8PDT其實是美國的太平洋標準時間,是美國西部城市的主要計時制度。就和我們的北京時間類似。中國是統一使用北京時間,但是美國東西部使用不同的時間制度。美國東部有西5區,西6區等,PST8PDT就是西8區的時間。
關於這個問題,其實官方文檔Default Scheduler Timezone Value In PDB$SEED Different Than CDB (Doc ID 2702230.1)[2]有闡述這個現象。
On 12C, 18c and 19c, using DBCA General mode create DB, the default timezone of scheduler of PDB is different with CDB$ROOT.
The default timezone of the scheduler of PDB is PST8PDT on 19c and Etc/UTC on 12C & 18c no matter what the timezone of the scheduler is in CDB$ROOT.
But using create database command or using DBCA customize mode, the default timezone of the scheduler of PDB is same with CDB$ROOT.
It is expected behavior.
Please refer to the below bug raised an enhancement request.
Unpublished Bug 30076391 : DIFFERENT TIMEZONES OF SCHEDULER IN CDB$ROOT AND PDB USING DBCA GENERAL MODE CREATE DB
這個現象,如果你沒有註意到,可能Scheduler的運行時間跟你所預期的不一樣。例如,資料庫採集、更新統計信息的時間,這個影響說大其實影響也蠻大的。可能導致在白天業務高峰期,資料庫正在收集統計信息。所以,一般你在創建對應的PDB資料庫時,就必須檢查/設置Scheduler的時區。
設置scheduler的時區
exec dbms_scheduler.set_scheduler_attribute('default_timezone', 'Asia/Shanghai');
參考資料
1: https://docs.oracle.com/en/database/oracle/oracle-database/19/arpls/DBMS_SCHEDULER.html#GUID-2D8930DD-1042-4FA9-A0C0-2E4C7A7BFE9B
[2]2: https://support.oracle.com/epmos/faces/DocumentDisplay?_afrLoop=122259819987503&id=2702230.1&_afrWindowMode=0&_adf.ctrl-state=bngoz01qg_129