[Oracle] タイムゾーン関連

Oracle

タイムゾーン設定は落とし穴が多い設定ポイントです。
この記事は、Oracle Databaseに関するタイムゾーンについて解説します。

タイムゾーンの確認

Oracle Databaseは、どの地域の時刻をベースにするかというタイムゾーン(ASIA/TOKYOなど)の情報を持っています。
保持しているタイムゾーンの情報としては2種類あります。

  • データベースのタイムゾーン:DBTIMEZONE
  • メンテナンスウィンドウのタイムゾーン:DEFAULT_TIMEZONE

マルチテナント構成の環境では、CDBとPDBでそれぞれ個別にタイムゾーンを設定することができますが、
タイムゾーンが異なる場合、メンテナンスウィンドウの実行タイミングが異なりますので注意が必要です。

りお
りお

DBTIMEZONEとDBMS_SCHEDULER.STIMEが別々に管理されていることと、
CDBとPDBでも別々に管理できてしまいます。

CDBのタイムゾーン(DBTIMEZONE)を確認する方法

CDBにログインしてから、以下のSQLを実行します。

$ sqlplus / as sysdba
SQL> SHOW CON_NAME

CON_NAME
------------------------------
CDB$ROOT

SQL> SELECT DBTIMEZONE FROM DUAL;

DBTIMEZONE
------------------
+09:00

実行結果から、+9:00時間(ASIA/TOKYO)に設定されていることが分かります。

CDBのメンテナンスウィンドウのタイムゾーン(DEFAULT_TIMEZONE)を確認する方法

CDBにログインしてから、以下のSQLを実行します。

$ sqlplus / as sysdba
SQL> SHOW CON_NAME

CON_NAME
------------------------------
CDB$ROOT

SQL> SELECT DBMS_SCHEDULER.STIME FROM DUAL;

STIME
---------------------------------------------------------------------------
24-12-02 19:02:57.456721000 ASIA/TOKYO

実行結果から、ASIA/TOKYOに設定されていることが分かります。

PDBのタイムゾーン(DBTIMEZONE)を確認する方法

CDBとPDBで異なるタイムゾーンを設定することもできますので、CDBとPDBが同じタイムゾーンとは限りません。
PDBに接続してから、以下のSQLを実行します。

$ sqlplus / as sysdba
SQL> ALTER SESSION SET CONTAINER = pdb1;
SQL> SHOW CON_NAME

CON_NAME
------------------------------
PDB1

SQL> SELECT DBTIMEZONE FROM DUAL;

DBTIMEZONE
------------------
+09:00

実行結果から、+9:00時間(ASIA/TOKYO)に設定されていることが分かります。

PDBのメンテナンスウィンドウのタイムゾーン(DEFAULT_TIMEZONE)を確認する方法

こちらもPDBに接続してから、以下のSQLを実行します。

$ sqlplus / as sysdba
SQL> ALTER SESSION SET CONTAINER = pdb1;
SQL> SHOW CON_NAME

CON_NAME
------------------------------
PDB1

SQL> SELECT DBMS_SCHEDULER.STIME FROM DUAL;

STIME
---------------------------------------------------------------------------
24-12-02 19:06:17.363643000 ASIA/TOKYO

こちらも実行結果から、ASIA/TOKYOに設定されていることが分かります。

タイムゾーンの変更

DBTIMEZONEを変更する場合と、DEFAULT_TIMEZONEを変更する場合で、実行コマンドが異なります。

CDBのタイムゾーン(DBTIMEZONE)を変更する方法

CDBにログインしてから、以下のSQLを実行します。
タイムゾーンの変更にはデータベースの再起動が必要になります。
以下はUTC(+00:00)に変更する場合の例です。

$ sqlplus / as sysdba
SQL> SHOW CON_NAME

CON_NAME
------------------------------
CDB$ROOT

SQL> SELECT DBTIMEZONE FROM DUAL;

DBTIMEZONE
------------------
+09:00

SQL> ALTER DATABASE SET TIME_ZONE = '+00:00';
SQL> SELECT DBTIMEZONE FROM DUAL;

DBTIMEZONE
------------------
+09:00 ★この時点ではまだ変更されません

SQL> SHUTDOWN IMMEDIATE
SQL> STARTUP

SQL> SELECT DBTIMEZONE FROM DUAL;

DBTIMEZONE
------------------
+00:00 ★変更されました

CDBのメンテナンスウィンドウのタイムゾーン(DEFAULT_TIMEZONE)を変更する方法

DEFAULT_TIMEZONEを変更する場合は、DBMS_SCHEDULER.SET_SCHEDULER_ATTRIBUTEパッケージを利用します。
以下はUTCに変更する場合の例です。

$ sqlplus / as sysdba
SQL> SHOW CON_NAME

CON_NAME
------------------------------
CDB$ROOT

SQL> SELECT DBMS_SCHEDULER.STIME FROM DUAL;

STIME
---------------------------------------------------------------------------
24-12-02 21:07:04.506910000 ASIA/TOKYO

SQL> EXEC DBMS_SCHEDULER.SET_SCHEDULER_ATTRIBUTE('DEFAULT_TIMEZONE','UTC');

SQL> SELECT DBMS_SCHEDULER.STIME FROM DUAL;

STIME
---------------------------------------------------------------------------
24-12-02 12:07:22.028987000 UTC ★UTCに変更されました

PDBのタイムゾーン(DBTIMEZONE)を変更する方法

PDBにログインしてから、以下のSQLを実行します。
タイムゾーンの変更にはデータベースの再起動が必要になります。
以下はUTC(+00:00)に変更する場合の例です。

$ sqlplus / as sysdba
SQL> ALTER SESSION SET CONTAINER = pdb1;
SQL> SHOW CON_NAME

CON_NAME
------------------------------
PDB1

SQL> SELECT DBTIMEZONE FROM DUAL;

DBTIMEZONE
------------------
+09:00

SQL> ALTER DATABASE SET TIME_ZONE = '+00:00';

SQL> SELECT DBTIMEZONE FROM DUAL;

DBTIMEZONE
------------------
+09:00 ★この時点ではまだ変更されません

SQL> CONN / AS SYSDBA
SQL> ALTER PLUGGABLE DATABASE pdb1 CLOSE;
SQL> ALTER PLUGGABLE DATABASE pdb1 OPEN;

SQL> ALTER SESSION SET CONTAINER = pdb1;
SQL> SHOW CON_NAME

CON_NAME
------------------------------
PDB1

SQL> SELECT DBTIMEZONE FROM DUAL;

DBTIMEZONE
------------------
+00:00 ★変更されました

PDBのメンテナンスウィンドウのタイムゾーン(DEFAULT_TIMEZONE)を変更する方法

DEFAULT_TIMEZONEを変更する場合は、DBMS_SCHEDULER.SET_SCHEDULER_ATTRIBUTEパッケージを利用します。
以下はUTCに変更する場合の例です。

$ sqlplus / as sysdba
SQL> ALTER SESSION SET CONTAINER = pdb1;
SQL> SHOW CON_NAME

CON_NAME
------------------------------
PDB1

SQL> SELECT DBMS_SCHEDULER.STIME FROM DUAL;

STIME
---------------------------------------------------------------------------
24-12-02 21:14:29.368302000 ASIA/TOKYO

SQL> EXEC DBMS_SCHEDULER.SET_SCHEDULER_ATTRIBUTE('DEFAULT_TIMEZONE','UTC');

SQL> SELECT DBMS_SCHEDULER.STIME FROM DUAL;

STIME
---------------------------------------------------------------------------
24-12-02 12:14:47.409252000 UTC ★UTCに変更されました

まとめ

Oracle Databaseでは、
・データベースのタイムゾーン(DBTIMEZONE)
・メンテナンスウィンドウのタイムゾーン(DEFAULT_TIMEZONE)
という2種類のタイムゾーンを、CDBとPDBに分かれて保持しています。

通常はタイムゾーンを変更することはないと思いますが、
タイムゾーンを変更する場合は、2種類の設定内容が存在することを覚えておいてください。

コメント

タイトルとURLをコピーしました