RDS for Oracle のタイムゾーンを変更する
前回の記事「PowerShell で RDS for Oracle へファイル転送(PUT_RAW)」の最後で、RDS for Oracle のタイムゾーンが UTC であることが判明しました。 「Amazon RDS DB インスタンスのタイムゾーンを変更する方法を教えてください」 にも書いてますね。今回は、これを日本時間に変えてみましょう。
現状のタイムゾーンの確認
まずは、現状の確認です。DBTIMEZONE を確認すると… UTC ですね。
SELECT DBTIMEZONE FROM DUAL;

SYSTIMESTAMP と接続しているクライアントの時間と比べてみても、ちょうど9時間ずれてますね。

タイムゾーンの変更
ではタイムゾーンを変更してみます。前述のFAQから辿ると英語版に行ってしまうのですが、日本語版はここにあります。ここから辿ると「Oracle のタイムゾーン」に設定方法がありますので、こちらに沿って実施します。
まず、AWS 管理コンソールより、「RDS」→「オプショングループ」を選択します。

デフォルトのオプショングループは変更できないので、新しく「グループを作成」を実行します。名前と作成した RDS と同じバージョンを選択して「作成」します。

作成されたオプショングループ「my-option-group」を選択して「オプションを追加」を実行します。

オプションは「TIMEZONE」、値は「Asia/Tokyo」を選択し「オプションの追加」を実行します。

次に作成したオプショングループとインスタンスを紐づけします。「RDS」→「データベース」から該当するインスタンスを選択し「変更」を実行します。

最後の方の「追加設定」セクションでオプショングループを作成した my-option-group に変更します。

変更のサマリーを確認して「すぐに適用」してみます。

変更後のタイムゾーンの確認
まずは DBTIMEZONE を確認です。変わってますね。

次に SYSTIMESTAMP を確認します。日本時間になりましたね。

Oracle Scheduler タイムゾーンの変更
これで RDS 全体のタイムゾーンは変わったのですが、実は Oracle Scheduler のタイムゾーンまでは変わってません。
SELECT OWNER,WINDOW_NAME,NEXT_START_DATE FROM DBA_SCHEDULER_WINDOWS WHERE ENABLED='TRUE'

Oracle Scheduler のタイムゾーン変更については、「Oracle DB インスタンスの一般的なデータベースタスクの実行」の「Oracle Scheduler ジョブのタイムゾーンの設定」の項に記載がある通り、DBMS_SCHEDULER パッケージを利用して変更します。
EXEC DBMS_SCHEDULER.SET_SCHEDULER_ATTRIBUTE('DEFAULT_TIMEZONE','Asia/Tokyo');
Oracle Scheduler Window を再度確認してみます。日本時間になりましたね。

RDSADMIN_UTIL.ALTER_DB_TIME_ZONE
冒頭でご紹介したユーザーガイドには、今回設定を変更したタイムゾーンの変更に併記して、Amazon RDS プロシージャの利用についてが言及されています。
・Timezone オプション
Timezone オプションは、ホストレベルでタイムゾーンを変更し、SYSDATE など、すべての日付列と値に影響します。詳細については、「Oracle のタイムゾーン」を参照してください。・Amazon RDS プロシージャ
Amazon Relational Database Service ユーザーガイドrdsadmin.rdsadmin_util.alter_db_time_zone
alter_db_time_zone プロシージャは、特定のデータ型のみのタイムゾーンを変更し、SYSDATE は変更しません。タイムゾーンの設定に関する他の制限については、Oracle ドキュメントに示されています。
ですが、正直2点目の「特定のデータ型」って全く意味がわかりません、、、ちょっと追跡調査が必要な気がします。
ディスカッション
コメント一覧
まだ、コメントがありません