Oracle Cloud Infrastructure（OCI）のDatabase Cloud Service（DBCS）でタイムゾーンを変更してみた

Oracle Cloud Infrastructure（OCI）のDatabase Cloud Service（以下、DBCS）でのデフォルトのタイムゾーンはUTCです。
現在では、DBCSインスタンス作成時に拡張オプションでタイムゾーンが指定できるため、こちらをきちんと指定していればJSTで運用することができます。

ただ、拡張オプションの設定を行わなかったり（デフォルトでは拡張オプションが非表示になっているため忘れがち....）、そもそも拡張オプションでタイムゾーンが指定できなかった時代（1年くらい前はできなかったと思います）に作成されたDBCSインスタンスをJSTで運用したい場合はタイムゾーンの変更が必要となります。

タイムゾーンの変更に関しては、DBCSのマニュアルに記載があります。
https://docs.oracle.com/ja-jp/iaas/Content/Database/References/timezones.htm
今回は、このマニュアルを参考にタイムゾーンの変更を行ってみました。

### 1.環境確認

ホストのシステム時間を確認すると UTCになっています。（現在は日本時間で2021/2/25の夕方です）

```
[opc@testdb ~]$ date
Thu Feb 25 07:23:32 UTC 2021
```

SQLPLUSでデータベースに接続し、タイムゾーンを確認してみます。
DBタイムゾーン、セッション・タイムゾーンいずれもUTCになっていることがわかります。

```
SQL> select DBTIMEZONE from dual;

DBTIME
------
+00:00

SQL> select SESSIONTIMEZONE from dual;

SESSIONTIMEZONE
---------------------------------------------------------------------------
+00:00
```

実際にSQLで日付・時刻を取得してみると、UTC時間になっています。（今は日本時間で2021/2/25の夕方です）

```
SQL> select to_char(sysdate,'YYYY-MM-DD HH24:MI') from dual;

TO_CHAR(SYSDATE,
----------------
2021-02-25 07:25

SQL> select to_char(systimestamp,'YYYY-MM-DD HH24:MI') from dual;

TO_CHAR(SYSTIMES
----------------
2021-02-25 07:25

SQL> select to_char(current_date,'YYYY-MM-DD HH24:MI') from dual;

TO_CHAR(CURRENT_
----------------
2021-02-25 07:26

SQL> select to_char(current_timestamp,'YYYY-MM-DD HH24:MI') from dual;

TO_CHAR(CURRENT_
----------------
2021-02-25 07:26
```

### 2.Grid Infrastructureを使用するDBシステム上のホストのタイム・ゾーンを変更

マニュアルにしたがって、rootユーザーでCRSスタックを停止します。

```
[root@testdb opc]# /u01/app/19.0.0.0/grid/bin/crsctl stop crs
CRS-2791: Starting shutdown of Oracle High Availability Services-managed resources on 'testdb'
　　　・
　　　・
　　　・
CRS-2793: Shutdown of Oracle High Availability Services-managed resources on 'testdb' has completed
CRS-4133: Oracle High Availability Services has been stopped.
```

/etc/sysconfig/clockのバックアップを取得してから、ZONEを"Asia/Tokyo"に変更します。

```
[root@testdb opc]# cp -p /etc/sysconfig/clock /etc/sysconfig/clock.bak
[root@testdb opc]# vi /etc/sysconfig/clock
```

```
ZONE="Asia/Tokyo"
UTC=true
ARC=false
```

さらに、シンボリックリンクを作成することで、ホストのタイム・ゾーンがJSTに変更されたことが確認できます。

```
[root@testdb opc]# date
Thu Feb 25 08:00:19 UTC 2021
[root@testdb opc]# ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
[root@testdb opc]# date
Thu Feb 25 17:01:26 JST 2021
```

### 3.Oracle Grid Infrastructureのタイム・ゾーンを変更

Oracle Grid Infrastructureのタイム・ゾーン変更にも、CRSスタックを停止する必要があります。
今回は停止しているので、そのまま作業を進めます。

rootユーザーで、` GRID_HOME/crs/install/s_crsconfig_<node_name>_env.txt `ファイルの現在のタイム・ゾーン値を調べます。

GRID_HOMEは` u01/app/19.0.0.0/grid `、今回のシステムのnode_nameは` testdb `のため、` /u01/app/19.0.0.0/grid/crs/install/s_crsconfig_testdb_env.txt `
のタイムゾーンを確認すると、` TZ=UTC `となっていることがわかります。

```
[root@testdb opc]# cat /u01/app/19.0.0.0/grid/crs/install/s_crsconfig_testdb_env.txt
#########################################################################
#This file can be used to set values for the NLS_LANG and TZ environment
#variables and to set resource limits for Oracle Clusterware and
#Database processes.
#1. The NLS_LANG environment variable determines the language and
#   characterset used for messages. For example, a new value can be
#   configured by setting NLS_LANG=JAPANESE_JAPAN.UTF8
#2. The Time zone setting can be changed by setting the TZ entry to
#   the appropriate time zone name. For example, TZ=America/New_York
#3. Resource limits for stack size, open files and number of processes
#   can be specified by modifying the appropriate entries.
#
#Do not modify this file except as documented above or under the
#direction of Oracle Support Services.
#########################################################################
TZ=UTC
NLS_LANG=AMERICAN_AMERICA.WE8ISO8859P1
CRS_LIMIT_STACK=2048
CRS_LIMIT_OPENFILE=65536
CRS_LIMIT_NPROC=65536
TNS_ADMIN=
```

タイムゾーンを変更します。

```
TZ=Asia/Tokyo
```

CRSスタックを再起動します。

```
[root@testdb opc]# /u01/app/19.0.0.0/grid/bin/crsctl start crs
CRS-4123: Oracle High Availability Services has been started.
```

### 4.データベースのタイム・ゾーンを変更

oracleユーザーでsqlplusを起動し、データベースのタイム・ゾーンを変更します。

```
ALTER DATABASE SET TIME_ZONE = '+09:00';
```

再起動します。

```
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.

SQL> startup
ORACLE instance started.

Total System Global Area 6442449472 bytes
Fixed Size                  9148992 bytes
Variable Size            1140850688 bytes
Database Buffers         5268045824 bytes
Redo Buffers               24403968 bytes
Database mounted.
Database opened.
```

DBタイムゾーン、セッション・タイムゾーンいずれもJSTに変わっていることが確認できます。

```
SQL> select DBTIMEZONE from dual;

DBTIME
------
+09:00

SQL> select SESSIONTIMEZONE from dual;

SESSIONTIMEZONE
---------------------------------------------------------------------------
+09:00
```

実際にSQLで日付・時刻を取得してみると、JST時間になっています。（今は日本時間で2021/2/25の夕方です）

```
SQL> select to_char(sysdate,'YYYY-MM-DD HH24:MI') from dual;

TO_CHAR(SYSDATE,
----------------
2021-02-25 17:42

SQL> select to_char(systimestamp,'YYYY-MM-DD HH24:MI') from dual;

TO_CHAR(SYSTIMES
----------------
2021-02-25 17:43

SQL> select to_char(current_date,'YYYY-MM-DD HH24:MI') from dual;

TO_CHAR(CURRENT_
----------------
2021-02-25 17:43

SQL> select to_char(current_timestamp,'YYYY-MM-DD HH24:MI') from dual;

TO_CHAR(CURRENT_
----------------
2021-02-25 17:43
```