[Oracle Cloud] Oracle Database 23ai新機能 Object Storage上の読取り専用表領域（2024/08/26)

# はじめに
Oracle Database 23aiの新機能に、オブジェクト・ストレージ上の読取り専用表領域 (Read-Only Tablespace on Object Storage) があり、読取り専用表領域のデータファイルをObject Storageに透過的に移動（逆も）でき、それにより、データベースの一部をクラウド内の低コストのストレージに格納できます。

読取り専用表領域のデータファイルをASMからObject Storageへ移動させてみました。

# 前提条件

- OCI Base Database 23ai インスタンスを作成(23.4~）
- DBMS_CLOUDパッケージのインストール
    - 参考： My Oracle Support ドキュメント [How To Setup And Use DBMS_CLOUD Package (Doc ID 2748362.1)](https://support.oracle.com/epmos/faces/DocumentDisplay?_afrLoop=273654378015774&id=2748362.1) (要サポートアカウント)

# 前処理
2024年8月時点で、Base DatabaseでのObject Storage上の読取り専用表領域の利用には、ODM object storeライブラリの追加インストールが必要です。
- 参考：My Oracle Support ドキュメント [23ai:Trying to move data file to Object store with "Alter Database Move Datafile To Object Storage" throw ORA-01119 ORA-27040 Errors (Doc ID 3043058.1)](https://support.oracle.com/epmos/faces/DocumentDisplay?id=3043058.1) (要サポートアカウント)

1. データベースインスタンスのシャットダウン

```
SQL> connect / as sysdba
SQL> shutdown immediate
```

２. ODM object storeのインストール（OSコマンド）

```
$ sudo su - oracle
$ make -f $ORACLE_HOME/rdbms/lib/ins_rdbms.mk opc_on
```

３. データベースインスタンスの起動

```
SQL> connect / as sysdba
SQL> startup
```

# 事前準備

### Object Storage バケットの作成
データファイルを格納するためのOCI Object Storageバケットを作成（バケット名をメモ：例 dbts）

### 表領域の作成と表の作成

```sql
create tablespace TSA datafile '+DATA' size 1G;
create table TBL(COL1 char(10) not null, COL2 char(1000)) tablespace TSA;
insert into TBL values('A','AAAAA');
commit;
```

パーティション表の例

```sql
create tablespace TSA datafile '+DATA' size 1G;
create tablespace TSB datafile '+DATA' size 1G;
partition by list(COL1)
(partition PA values ('A') tablespace TSA,
partition PB values ('B') tablespace TSB
) ;

insert into TBL values('A','AAAAA');
insert into TBL values('B','BBBBB');
commit;
```

# 表領域、データファイル情報の取得

```sql
set pages 5000 linesize 150
col TABLESPACE_NAME for a10
col FILE_NAME for a100
select FILE_ID, STATUS, TABLESPACE_NAME, FILE_NAME from DBA_DATA_FILES 
where TABLESPACE_NAME like 'TS%';

   FILE_ID STATUS    TABLESPACE FILE_NAME
---------- --------- ---------- -----------------------------------------------------
        18 AVAILABLE TSA        +DATA/DB235_nrt/202C1977/DATAFILE/tsa.281.1177572797
        19 AVAILABLE TSB        +DATA/DB235_nrt/202C1977/DATAFILE/tsb.280.1177572805
```

表領域を 読取り専用に変更

```sql
ALTER TABLESPACE TSA read only;
select tablespace_name , status from dba_tablespaces where TABLESPACE_NAME = 'TSA';

TABLESPACE STATUS
---------- ---------
TSA        READ ONLY
```

# DBMS_CLOUD の動作確認
Object Storageバケット内のファイル名の取得

```sql
select object_name from dbms_cloud.list_objects('DEF_CRED_NAME','https://objectstorage.ap-tokyo-1.oraclecloud.com/n/<namespace>/b/dbts/o/');
```

# Object Storageへデータファイルを移動

Enterprise Editionの場合、オンラインでのデータファイル移動が可能

```sql
alter database move datafile '+DATA/DB235_nrt/202C1977/DATAFILE/tsa.281.1177572797' to 'https://objectstorage.ap-tokyo-1.oraclecloud.com/n/<namespace>/b/dbts/o/tsa.dbf';

Database altered.


SQL> select FILE_ID, STATUS, TABLESPACE_NAME, FILE_NAME from DBA_DATA_FILES
  2  where TABLESPACE_NAME like 'TS%';

   FILE_ID STATUS    TABLESPACE FILE_NAME
---------- --------- ---------- -----------------------------------------------------
        18 AVAILABLE TSA        https://objectstorage.ap-tokyo-1.oraclecloud.com/n/<namespace>/b/dbts/o/tsa.dbf
        19 AVAILABLE TSB        +DATA/DB235_nrt/202C1977/DATAFILE/tsb.280.1177572805
```

Standard Editionの場合、表領域をオフラインに変更し、手動でデータファイルをObject Storageへアップロードし、データファイルのRENAMEを実施します。

```sql
ALTER TABLESPACE TSA read only;
ALTER TABLESPACE TSA offline;
```

```shell
$ sudo su - grid
$ asmcmd cp +DATA/DB235_nrt/202C1977/DATAFILE/tsa.281.1177572797 /tmp/tsa.dbf
$ sudo su - oracle
$ oci os object put -ns <namespace> -bn dbts --file /tmp/tse.dbf --name tsa.dbf --no-multipart
```

```sql
ALTER TABLESPACE TSA RENAME DATAFILE '+DATA/DB235_nrt/202C1977/DATAFILE/tsa.281.1177572797' to 'https://objectstorage.ap-tokyo-1.oraclecloud.com/n/<namespace>/b/dbts/o/tsa.dbf';
ALTER TABLESPACE TSA online;

select FILE_ID, STATUS, TABLESPACE_NAME, FILE_NAME from DBA_DATA_FILES
where TABLESPACE_NAME = 'TSA';

   FILE_ID STATUS    TABLESPACE FILE_NAME
---------- --------- ---------- -----------------------------------------------------
        18 AVAILABLE TSA        https://objectstorage.ap-tokyo-1.oraclecloud.com/n/<namespace>/b/dbts/o/tsa.dbf

select tablespace_name , status from dba_tablespaces where TABLESPACE_NAME = 'TSA';

TABLESPACE STATUS
---------- ---------
TSA        READ ONLY
```

# おわりに
読取り専用表領域のデータファイルをObject Storageに移動することで、データ量増加時のストレージ費用を節約することができます。
DBMS_CLOUDのインストールは少し手間がかかりますが、データファイルの移動は簡単に実行できました。


### 参考情報

- [古いパーティションでのオブジェクト・ストアの使用](https://docs.oracle.com/cd/F82042_01/cncpt/partitions-views-and-other-schema-objects.html#GUID-949D9F4C-8E4B-4BDB-AE06-69660F1F6752)
- My Oracle Support ドキュメント [How To Setup And Use DBMS_CLOUD Package (Doc ID 2748362.1)](https://support.oracle.com/epmos/faces/DocumentDisplay?_afrLoop=273654378015774&id=2748362.1) (要サポートアカウント)
- [オブジェクト・ストレージからOracle DB 19c/21cにデータを導入する](https://qiita.com/letian/items/398c91fd79a63eec6e7a)
- My Oracle Support ドキュメント [23ai:Trying to move data file to Object store with "Alter Database Move Datafile To Object Storage" throw ORA-01119 ORA-27040 Errors (Doc ID 3043058.1)](https://support.oracle.com/epmos/faces/DocumentDisplay?id=3043058.1) (要サポートアカウント)