Autonomous Databaseでタイム・ゾーン・ファイルのアップグレードを実行してみた

# はじめに
Oracle Databaseのタイム・ゾーン・ファイルはタイム・ゾーン名やタイム・ゾーンごとの協定世界時(UTC)からのオフセットや夏時間への移行時間、標準時間と夏時間の略称を含むファイルです。さまざまなタイム・ゾーン地域の移行ルールの変更を反映するために定期的に更新され、新しいバージョンのファイルが提供されます。
Autonomous Databaseで使用されるタイム・ゾーン・ファイルはプロビジョニング時にそのときの最新バージョンが自動的に選択されています。デフォルトでは、その後のタイム・ゾーン・ファイルのアップグレードは自動的に行われません。すべてのデータベースでタイムゾーン付のデータ型（TIMESTAMP WITH DATA ZONE型）を使用するとは限らないですし、使用している場合もアップグレードの影響を考慮すると任意でできたほうが都合がよいからと思われます。
これまで、タイム・ゾーン・ファイルのアップグレードはサポートにSupport Request(SR)で申請する必要があったのですが、2月の新機能アップデートでユーザー側で管理できるようになりました。

[Enable Automatic Time Zone File Updates](https://docs.oracle.com/en/cloud/paas/autonomous-database/adbsn/index.html)

今回はその操作を試してみました。なお、操作はAdminユーザーで行っています。

:::note info
タイム・ゾーン付のデータ型を使用していない場合でもアップグレードが必要とされることがあります。Data Pumpでの移行はソース・データベースよりもターゲット・データベースのタイム・ゾーン・ファイルが高いバージョン、または同じバージョンでないとORA-39405が発生します。
```
ORA-39405: Oracle Data Pump does not support importing from a source database with TSTZ version n+1 
into a target database with TSTZ version n.
```
Autonomous Databaseがターゲット・データベースでソース・データベースよりもバージョンが低い場合にはタイム・ゾーン・ファイルのアップグレードが必要です。
:::

# 1.現在のタイム・ゾーン・ファイルのバージョン確認
以下のSQLで確認ができます。現在38であることがわかります。

```sql
-- 現在使用しているタイム・ゾーン・ファイルの情報を確認

SELECT property_name, property_value FROM database_properties WHERE property_name LIKE 'DST_%' ORDER BY property_name;

PROPERTY_NAME            PROPERTY_VALUE 
------------------------ -------------- 
DST_PRIMARY_TT_VERSION   38             
DST_SECONDARY_TT_VERSION 0              
DST_UPGRADE_STATE        NONE           
```

# 2.最新のタイム・ゾーン・ファイルのバージョン確認
利用できるタイム・ゾーン・ファイルの最新バージョンはdba_cloud_configビューでPARM_NAME列の条件を"latest_timezone_version"とすることで確認ができます。結果から39であることがわかります。
```sql
-- 利用できる最新バージョンを確認
SELECT param_name, param_value FROM dba_cloud_config  WHERE LOWER(param_name) = 'latest_timezone_version';

PARAM_NAME              PARAM_VALUE 
----------------------- ----------- 
latest_timezone_version 39          
```

また、現在のAutonomous Databaseで新しいバージョンのタイム・ゾーン・ファイルが利用可能になると、db_notificationsビューにその旨の情報が格納されます。db_notificationsビューにはメンテナンスの通知に関する情報が保存されています。

```sql
-- TYPE列で"TIMEZONE VERSION"を条件として検索
SQL> SELECT type, time, description, expected_start_date FROM db_notifications    WHERE TYPE='TIMEZONE VERSION';
TYPE             TIME                     DESCRIPTION                                                                           EXPECTED_START_DATE 
---------------- ------------------------ ------------------------------------------------------------------------------------- ------------------- 
TIMEZONE VERSION 2021-12-06T18:55:58.517Z A new timezone version is available. Please restart to upgrade to timezone version 39
```    
# 3.タイム・ゾーン・ファイルの自動アップグレードの状態を確認
タイム・ゾーン・ファイルのアップグレードを行うにはタイム・ゾーン・ファイルの自動アップグレード機能を有効化する必要があります。デフォルトは無効化されています。
現状の確認は2のSQLと同じdba_cloud_configビューでPARAM_NAME列の条件を"auto_dst_upgrade"にすることで行うことができます。結果が0行であれば自動アップグレードは有効化されていません。

```sql
-- タイム・ゾーン・ファイルの自動アップグレードの設定値を確認
SELECT param_name, param_value FROM dba_cloud_config WHERE LOWER(param_name) = 'auto_dst_upgrade';

行が選択されていません
```

# 4.タイム・ゾーン・ファイルの自動アップグレードの有効化と確認
自動アップグレードの有効化はDBMS_CLOUD_ADMINパッケージで実行します。
有効化されたかどうかの確認は3と同じSQLで行います。有効化されていれば行が返ります。
```sql
-- タイム・ゾーン・ファイルの自動アップグレードの有効化
BEGIN 
   DBMS_CLOUD_ADMIN.ENABLE_FEATURE(
        feature_name => 'AUTO_DST_UPGRADE');
END;
/

PL/SQLプロシージャが正常に完了しました。

-- 有効化されたかどうかを確認
SELECT param_name, param_value FROM dba_cloud_config WHERE LOWER(param_name) = 'auto_dst_upgrade';

PARAM_NAME       PARAM_VALUE 
---------------- ----------- 
auto_dst_upgrade enable      

1行が選択されました。
```

# 5.Autonomous Databaseの再起動
タイム・ゾーン・ファイルのアップグレードは自動アップグレードを有効化した後でAutonomous Databaseの再起動することで行われます。そのため、再起動を行います。もちろん、停止して、起動でも構いません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134317/d14b3f92-dd8e-ff28-fc52-4a3edfeece4a.png)

# 6.再起動後の確認
1のSQLで確認してみます。39になっていることが確認できます。
```sql
SELECT property_name, property_value FROM database_properties WHERE property_name LIKE 'DST_%' ORDER BY property_name;

PROPERTY_NAME            PROPERTY_VALUE 
------------------------ -------------- 
DST_PRIMARY_TT_VERSION   39             
DST_SECONDARY_TT_VERSION 0              
DST_UPGRADE_STATE        NONE   
```
また、タイム・ゾーン・ファイルが最新バージョンにアップグレードされたので、db_notificationsビューからはタイム・ゾーン・ファイルの行がなくなりました。
```sql
SELECT type, time, description, expected_start_date FROM db_notifications    WHERE TYPE='TIMEZONE VERSION';

行が選択されていません
```
# 7.タイム・ゾーン・ファイルの自動アップグレードの無効化
無効化も有効化と同じようにDBMS_CLOUD_ADMINパッケージで設定します。
```sql
-- タイム・ゾーン・ファイルの自動アップグレードの無効化を設定
BEGIN    DBMS_CLOUD_ADMIN.DISABLE_FEATURE(
        feature_name => 'AUTO_DST_UPGRADE');
END;
/

PL/SQLプロシージャが正常に完了しました。

-- 無効化されたかどうかを確認
SELECT param_name, param_value FROM dba_cloud_config WHERE LOWER(param_name) = 'auto_dst_upgrade';

行が選択されていません。
```

# おわりに
Autonomous Databaseでタイム・ゾーン・ファイルのアップグレードを試してみました。Oracle Databaseの場合は、タイム・ゾーン・ファイルのアップグレードはutltz_*スクリプトかDBMS_DSTパッケージを使用して行うのですが、Autonomous Databaseでは自動アップグレード機能の有効化だけで済みます。簡単ですね。

# 参考資料
- [Autonomous Database : Manage Time Zone File Version on Autonomous Database](https://docs.oracle.com/en/cloud/paas/autonomous-database/adbsa/manage-time-zone-file-version.html)
- [Oracle Database : 4.7 タイム・ゾーン・ファイルおよびタイム・ゾーン・データ付きタイムスタンプのアップグレード](https://docs.oracle.com/cd/F19136_01/nlspg/datetime-data-types-and-time-zone-support.html#GUID-B0ACDB2E-4B49-4EB4-B4CC-9260DAE1567A)