Amazon RDS Custom for Oracleタイムゾーン変更手順


#はじめに
Amazon RDS Custom for Oracleは作成時のタイムゾーンはUTCで作成されます（作成時に変更することはできません）。
JSTで利用するためには作成後に変更する必要があり、ユーザガイドの変更手順はこちらになります （[Changing the time zone of an RDS Custom for Oracle DB instance](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/custom-managing.html#custom-managing.timezone)）。
この手順内でも触れられてますが、OS側も変更する必要があり、そのあたりの記述はユーザガイド中では曖昧なので、こちらにまとめておきます。

ちなみにRDS Custom for SQL Serverはタイムゾーン変更ができない、と制限に記載があります。。

- [You can't modify the time zone of an existing RDS Custom for SQL Server DB instance.](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/custom-reqs-limits.html#custom-reqs-limits.limits)

#タイムゾーン変更手順

タイムゾーンの変更は以下のような流れで実施します。

1. RDS Customオートメーションの一時停止
1. RDS Customのタイムゾーンの変更、RDSの停止
1. OS のタイムゾーンの変更
1. RDS Customの起動
1. RDS Customオートメーションの再開

###1．RDS Customオートメーションの一時停止

まず、RDS Customオートメーションですが、RDS Customはマネージドサービスとなっているため、AWSの管理下に置かれています。
定期的にAWSから構成がチェックされ、Unsupportedとなる設定が検出された場合には状態が「Unsupported-Configuration」となり、RDS Customに対する変更が制限されます。

- [RDS Custom support perimeter and unsupported configurations](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/custom-troubleshooting.html#custom-troubleshooting.support-perimeter)

RDS Customは自動的にアーカイブログのバックアップが取得されたりしてます。ユーザガイドにも記載から読み解くと、タイムゾーンの変更によってREDOログ（とアーカイブログ）の管理に影響がでるようです（オートメーションを停止せずにタイムゾーンの変更を行ってみたらわかるかもしれません）。
作業前後でSnapshotを取得しておくと良いでしょう。
さて、RDS Customのオートメーションは、コンソールで変更したいRDS Customを選択し、「変更」を実行することで一時停止可能です。

![Automation_Chnage01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2313926/f2931c5c-d3e2-eeb6-00f3-37945b77fc65.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2313926/ff629778-c618-d953-b517-b7be2e6b0bbf.png)

変更を実施すると、以下のように「RDSカスタムオートメーションモード」が「一時停止」に変更されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2313926/2322c47c-8706-f55a-9114-27093cc52603.png)


###2．RDS Customのタイムゾーンの変更、RDSの停止

RDS Customのタイムゾーン変更は、ユーザガイドの流れに沿って実行します。
基本的にSQLでの実行になります。

```
SQL*Plus: Release 19.0.0.0.0 - Production on Mon Dec 13 00:17:56 2021 Version 19.10.0.0.0
Copyright (c) 1982, 2020, Oracle.  All rights reserved.
Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production Version 19.10.0.0.0

SQL> alter session set NLS_DATE_FORMAT='YYYY/MM/DD HH24:MI:SS';

Session altered.

SQL> select dbtimezone from dual;

DBTIME
------
+00:00

SQL> select sysdate from dual;

SYSDATE
-------------------
2021/12/13 00:18:28

SQL> alter database set time_zone = 'Asia/Tokyo';

Database altered.

SQL>
SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> exit
Disconnected from Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production Version 19.13.0.0.0
```

###3. OS のタイムゾーンの変更

OSのタイムゾーン変更は、rootユーザにて `timedatectl` を利用して変更します、この手順だけでOSリブート時も変更の適用は継続されます。
ちなみにNTP同期はオフられてます。。

```
# date
Mon Dec 13 00:20:05 UTC 2021
# timedatectl
      Local time: Mon 2021-12-13 00:20:20 UTC
  Universal time: Mon 2021-12-13 00:20:20 UTC
        RTC time: Mon 2021-12-13 00:20:20
       Time zone: UTC (UTC, +0000)
     NTP enabled: no
NTP synchronized: no
 RTC in local TZ: no
      DST active: n/a
# timedatectl list-timezones | grep Tokyo
Asia/Tokyo
# timedatectl set-timezone Asia/Tokyo

# timedatectl
      Local time: Mon 2021-12-13 09:20:49 JST
  Universal time: Mon 2021-12-13 00:20:49 UTC
        RTC time: Mon 2021-12-13 00:20:49
       Time zone: Asia/Tokyo (JST, +0900)
     NTP enabled: no
NTP synchronized: no
 RTC in local TZ: no
      DST active: n/a
# date
Mon Dec 13 09:20:58 JST 2021

```

###4. RDS Customの起動

SQL*PlusからRDS Customを起動し、タイムゾーンを確認します。
無事、Asia/Tokyoに変更されてます。

```
SQL*Plus: Release 19.0.0.0.0 - Production on Mon Dec 13 09:21:46 2021 Version 19.10.0.0.0
Copyright (c) 1982, 2020, Oracle.  All rights reserved.

Connected to an idle instance.

SQL> startup
ORACLE instance started.

Total System Global Area 1.2382E+10 bytes
Fixed Size                  8910200 bytes
Variable Size            6207569920 bytes
Database Buffers         6140461056 bytes
Redo Buffers               24641536 bytes
Database mounted.
Database opened.
SQL>
SQL> select dbtimezone from dual;

DBTIMEZONE
----------
Asia/Tokyo

SQL> select sysdate from dual;

SYSDATE
-------------------
2021/12/13 09:22:47

```

###5. RDS Cusotomオートメーションの再開

RDS Customを起動したのち、オートメーションを再開すると、作業完了です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2313926/65bb65ec-3b04-f267-94df-3ce075dcb9e8.png)


#まとめ

日本で利用する場合には、基本的にはUTCで運用するのではなくJSTでの運用になると思います。
変更自体は簡単ですので、作成した直後にJSTへ変更するのが良いと思います。


なお、最初にも述べましたが、RDS Custom for SQL Serverでは制限にTimeZone変更は許可されない、との記載があります [You can't modify the time zone of an existing RDS Custom for SQL Server DB instance](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/custom-reqs-limits.html#custom-reqs-limits.limitsMS) ので、ご注意ください。


##おまけ
少し触れましたが、デフォルトではNTP同期がされていない状態、且つChronyもインストールされていない状態ですので、ChronyをインストールしてAWS のサービスと同期してみました。

###Chronyのインストール
yumリポジトリを利用してchronyをインストールします。
必要な場合にはリポジトリを作成しましょう、Oracle Linuxのisoは[eDelivery](https://edelivery.oracle.com/osdc/faces/SoftwareDelivery)からダウンロード可能です。

```
# yum -y install chrony
dvd                                                                                                                                                                                                                                                                                                  | 3.6 kB  00:00:00
(1/2): dvd/group_gz                                                                                                                                                                                                                                                                                  | 131 kB  00:00:00
(2/2): dvd/primary_db                                                                                                                                                                                                                                                                                | 5.2 MB  00:00:00
Resolving Dependencies
--> Running transaction check
---> Package chrony.x86_64 0:3.4-1.0.1.el7 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

============================================================================================================================================================================================================================================================================================================================
 Package                                                                     Arch                                                                        Version                                                                             Repository                                                                Size
============================================================================================================================================================================================================================================================================================================================
Installing:
 chrony                                                                      x86_64                                                                      3.4-1.0.1.el7                                                                       dvd                                                                      250 k

Transaction Summary
============================================================================================================================================================================================================================================================================================================================
Install  1 Package

Total download size: 250 k
Installed size: 491 k
Downloading packages:
warning: /media/Packages/chrony-3.4-1.0.1.el7.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID ec551f03: NOKEY
Public key for chrony-3.4-1.0.1.el7.x86_64.rpm is not installed
Retrieving key from file:///etc/pki/rpm-gpg/RPM-GPG-KEY-oracle
Importing GPG key 0xEC551F03:
 Userid     : "Oracle OSS group (Open Source Software group) <build@oss.oracle.com>"
 Fingerprint: 4214 4123 fecf c55b 9086 313d 72f9 7b74 ec55 1f03
 Package    : 7:oraclelinux-release-7.9-1.0.9.el7.x86_64 (@latest/$releasever)
 From       : /etc/pki/rpm-gpg/RPM-GPG-KEY-oracle
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
Warning: RPMDB altered outside of yum.
  Installing : chrony-3.4-1.0.1.el7.x86_64                                                                                                                                                                                                                                                                              1/1
  Verifying  : chrony-3.4-1.0.1.el7.x86_64                                                                                                                                                                                                                                                                              1/1

Installed:
  chrony.x86_64 0:3.4-1.0.1.el7

Complete!
```


###同期設定

/etc/chrony.conf に `server 169.254.169.123 prefer iburst minpoll 4 maxpoll 4` を同期先として追加し、chronydを開始すると、同期がとられるようになります。（必要な場合にはデフォルトの同期先はコメントアウトしておきましょう）

```
# systemctl start chronyd

# chronyc sources -v
210 Number of sources = 1

  .-- Source mode  '^' = server, '=' = peer, '#' = local clock.
 / .- Source state '*' = current synced, '+' = combined , '-' = not combined,
| /   '?' = unreachable, 'x' = time may be in error, '~' = time too variable.
||                                                 .- xxxx [ yyyy ] +/- zzzz
||      Reachability register (octal) -.           |  xxxx = adjusted offset,
||      Log2(Polling interval) --.      |          |  yyyy = measured offset,
||                                \     |          |  zzzz = estimated error.
||                                 |    |           \
MS Name/IP address         Stratum Poll Reach LastRx Last sample
===============================================================================
^* 169.254.169.123               3   4    37    10  +2822ns[  +38us] +/-  393us

# timedatectl
      Local time: Mon 2021-12-13 13:36:52 JST
  Universal time: Mon 2021-12-13 04:36:52 UTC
        RTC time: Mon 2021-12-13 04:36:51
       Time zone: Asia/Tokyo (JST, +0900)
     NTP enabled: yes
NTP synchronized: yes
 RTC in local TZ: no
      DST active: n/a
#
```