[OCI]既存のOracle DatabaseからAutonomous DatabaseへのData Pumpによる移行をOCI File Storage経由でやってみた

# はじめに
先日のアップデートで、Autonomous DatabaseにOCI File Storageのファイルシステムがアタッチできるようになりました。

https://docs.oracle.com/en/cloud/paas/autonomous-database/adbsa/load-oci-file-storage.html#GUID-B9A7E58E-E1C0-4859-B16B-EF88942704BF

従来は、Data Pumpを使用して既存のOracle DatabaseからAutonomous Databaseに移行する際にはObject Storageを経由する必要がありましたが、このアップデートによりOCI File Storageを使用したData Pumpによる移行が可能になりました。
これにより、Autnomous Databaseへの移行がより簡単に、より短時間で行えるようになりました。

オンプレミスとOCI環境がIPSec VPNやFast Connectで接続されている場合、オンプレミス側のサーバでもOCI File Storageのファイルシステムをマウントすることができます。
そのため、こちらの図のように、エクスポートしたダンプファイルを移動することなく、既存DBからAutonomous Databaseへの移行が可能になります。
![スクリーンショット 2022-11-16 13.59.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/f1eefaa1-7f20-f1b8-50ad-0b8f73977aff.png)

今回は[こちら](https://docs.oracle.com/cd/F19136_01/comsc/installing-sample-schemas.html#GUID-1E645D09-F91F-4BA6-A286-57C5EC66321D)のサンプルスキーマをロードしたDBからHRスキーマをexpdpでOCI File Storageのファイルシステム上にエクスポートし、OCI File Storageのファイルシステム上のダンプファイルをAutonomous Databaseにimpdpでインポートして移行するシナリオを検証してみました。

# 1. File Storage Service ファイルシステムの作成

こちらの記事を参考に、File Storage Serviceのファイルシステムを作成します。

https://qiita.com/500InternalServerError/items/aefb00f33b163b5262dd

今回は以下のような設定でファイルシステムを作成しました。
![スクリーンショット 2022-11-19 21.39.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/f83ed266-9918-b6bc-6295-732ee4c36780.png)
![スクリーンショット 2022-11-19 21.39.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/6e238860-48ae-2cf6-3f45-c3747ca9c375.png)
![スクリーンショット 2022-11-19 21.40.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/0824bc7d-8692-c547-c33d-607dcbcf7c88.png)
作成後にエクスポートの詳細画面の「マウント・コマンド」をクリックして、ファイルシステムをマウントする際に必要なコマンドを確認します。
![スクリーンショット 2022-11-19 20.18.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/83665f63-7fcf-c110-110e-fc93c17adc6c.png)




# 2. 既存DBサーバでのFile Storage ファイルシステムのマウント

既存DBの稼働するサーバでFile Storage ファイルシステムをマウントします。

File Storage ファイルシステムをマウントするためのマウントポイント/mnt/FSSを作成します。
```
[opc@basedb /]$ sudo mkdir -p /mnt/FSS
```
mountコマンドで/mnt/FSSにFile Storageをマウントします。
```
[opc@basedb /]$ sudo mount fss.testsubnet.testvcn.oraclevcn.com:/FSS /mnt/FSS
```
Oracleの実行ユーザが書き込みできるように、マウントポイント/mnt/FSSのパーミッションを変更します。
```
[opc@basedb /]$ sudo chmod 777 /mnt/FSS
```

# 3. 既存DBの確認

SQL*Plusから既存DBに、エクスポートの対象であるHRユーザとして接続します。
```
[oracle@basedb ~]$ sqlplus hr/Demo#2Demo#2@pdb1

SQL*Plus: Release 19.0.0.0.0 - Production on Sat Nov 19 19:57:12 2022
Version 19.17.0.0.0

Copyright (c) 1982, 2022, Oracle.  All rights reserved.

Last Successful login time: Sat Nov 19 2022 19:17:21 +09:00

Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.17.0.0.0

SQL> 
```
既存のDB内のHRスキーマの内容を確認します。
```
SQL> col table_name for a15
SQL> SELECT table_name, num_rows FROM user_tables;

TABLE_NAME	      NUM_ROWS
--------------- ----------
COUNTRIES		        25
DEPARTMENTS		        27
EMPLOYEES	           107
JOBS			        19
JOB_HISTORY		        10
LOCATIONS		        23
REGIONS 		         4

7 rows selected.

SQL>
```
HRスキーマには、7つのテーブルがあることがわかりました。

SQL*Plusを終了します。
```
SQL> exit
Disconnected from Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.17.0.0.0
[oracle@basedb ~]$ 
```

# 4. 既存DBからFile Storageへのエクスポート

SQL*Plusから既存DBにsystemとして接続します。
```
[oracle@basedb ~]$ sqlplus system/Demo#1Demo#1@pdb1

SQL*Plus: Release 19.0.0.0.0 - Production on Sat Nov 19 19:57:12 2022
Version 19.17.0.0.0

Copyright (c) 1982, 2022, Oracle.  All rights reserved.

Last Successful login time: Sat Nov 19 2022 19:17:21 +09:00

Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.17.0.0.0

SQL>
```
File Storage ファイルシステムのマウントポイント/mnt/FSSを参照するディレクトリ・オブジェクトFSS_DIRを作成します。
```
SQL> CREATE DIRECTORY FSS_DIR AS '/mnt/FSS';

Directory created.

SQL >
```
SQL*Plusを終了します。
```
SQL> exit
Disconnected from Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.17.0.0.0
[oracle@basedb ~]$ 
```
expdpコマンドで、既存DBからHRスキーマをFSS_DIR（= File Storage）内にhr.dumpというファイル名でエクスポートします。
```
[oracle@basedb ~]$ expdp system/Demo#1Demo#1@pdb1 directory=FSS_DIR dumpfile=hr.dump schemas=hr encryption_password=DumpPassw0rd

Export: Release 19.0.0.0.0 - Production on Sun Nov 20 00:35:45 2022
Version 19.17.0.0.0

Copyright (c) 1982, 2019, Oracle and/or its affiliates.  All rights reserved.

Connected to: Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Starting "SYSTEM"."SYS_EXPORT_SCHEMA_01":  system/********@pdb1 directory=FSS_DIR dumpfile=hr.dump schemas=hr encryption_password=******** 
Processing object type SCHEMA_EXPORT/TABLE/TABLE_DATA
Processing object type SCHEMA_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICS
Processing object type SCHEMA_EXPORT/TABLE/STATISTICS/TABLE_STATISTICS
Processing object type SCHEMA_EXPORT/STATISTICS/MARKER
Processing object type SCHEMA_EXPORT/USER
Processing object type SCHEMA_EXPORT/SYSTEM_GRANT
Processing object type SCHEMA_EXPORT/ROLE_GRANT
Processing object type SCHEMA_EXPORT/DEFAULT_ROLE
Processing object type SCHEMA_EXPORT/TABLESPACE_QUOTA
Processing object type SCHEMA_EXPORT/PASSWORD_HISTORY
Processing object type SCHEMA_EXPORT/PRE_SCHEMA/PROCACT_SCHEMA
Processing object type SCHEMA_EXPORT/SEQUENCE/SEQUENCE
Processing object type SCHEMA_EXPORT/TABLE/TABLE
Processing object type SCHEMA_EXPORT/TABLE/COMMENT
Processing object type SCHEMA_EXPORT/PROCEDURE/PROCEDURE
Processing object type SCHEMA_EXPORT/PROCEDURE/ALTER_PROCEDURE
Processing object type SCHEMA_EXPORT/VIEW/VIEW
Processing object type SCHEMA_EXPORT/TABLE/INDEX/INDEX
Processing object type SCHEMA_EXPORT/TABLE/CONSTRAINT/CONSTRAINT
Processing object type SCHEMA_EXPORT/TABLE/CONSTRAINT/REF_CONSTRAINT
Processing object type SCHEMA_EXPORT/TABLE/TRIGGER
. . exported "HR"."EMPLOYEES"                            17.09 KB     107 rows
. . exported "HR"."LOCATIONS"                            8.445 KB      23 rows
. . exported "HR"."JOB_HISTORY"                          7.203 KB      10 rows
. . exported "HR"."JOBS"                                 7.117 KB      19 rows
. . exported "HR"."DEPARTMENTS"                          7.132 KB      27 rows
. . exported "HR"."COUNTRIES"                            6.375 KB      25 rows
. . exported "HR"."REGIONS"                              5.554 KB       4 rows
Master table "SYSTEM"."SYS_EXPORT_SCHEMA_01" successfully loaded/unloaded
******************************************************************************
Dump file set for SYSTEM.SYS_EXPORT_SCHEMA_01 is:
  /mnt/FSS/hr.dump
Job "SYSTEM"."SYS_EXPORT_SCHEMA_01" successfully completed at Sun Nov 20 00:36:37 2022 elapsed 0 00:00:49

[oracle@basedb ~]$
```
無事エクスポートが完了しました。

ディレクトリ・オブジェクトFSS_DIRの実体である/mnt/FSS（=File Storage ファイルシステムをマウントしているマウントポイント）の内容を確認してみます。
```
[oracle@basedb ~]$ ls -l /mnt/FSS
total 776
-rw-r----- 1 oracle oinstall   2580 Nov 19 19:34 export.log
-rw-r----- 1 oracle oinstall 737280 Nov 19 19:34 hr.dump
[oracle@basedb ~]$
```
エクスポートファイルhr.dumpとexpdpのログexport.logが出力されていることが確認できました。

SQL*Plusから既存DBにsysdbaとして接続します。
```
[oracle@basedb ~]$ sqlplus / as sysdba

SQL*Plus: Release 19.0.0.0.0 - Production on Sat Nov 19 19:57:12 2022
Version 19.17.0.0.0

Copyright (c) 1982, 2022, Oracle.  All rights reserved.

Last Successful login time: Sat Nov 19 2022 19:17:21 +09:00

Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.17.0.0.0

SQL>
```
エクスポートが完了したので、ディレクトリ・オブジェクトFSS_DIRを削除します。
```
SQL> DROP DIRECTORY FSS_DIR;

Directory dropped.

SQL>
```
SQL*Plusを終了します。
```
SQL> exit
Disconnected from Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.17.0.0.0
[oracle@basedb ~]$ 
```

umountコマンドでFile Storage ファイルシステムをアンマウントします。
```
[opc@basedb /]$ sudo unmount /mnt/FSS
```

# 5. Autonomous DatabasaeへのFile Storage ファイルシステムのアタッチ

SQL*Plusから移行先となるAutonomous Databaseにadminとして接続します。
```
[oracle@basedb ~]$ sqlplus admin/Demo#1Demo#1@adb

SQL*Plus: Release 19.0.0.0.0 - Production on Sat Nov 19 19:44:37 2022
Version 19.17.0.0.0

Copyright (c) 1982, 2022, Oracle.  All rights reserved.


Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.17.0.1.0

SQL>
```
File Storage ファイルシステムをアタッチするためのディレクトリ・オブジェクトFSS_DIRを作成します。
```
SQL> CREATE DIRECTORY FSS_DIR AS 'FSSDIR';

Directory created.

SQL>
```
DBMS_CLOUD_ADMIN.ATTACH_FILE_SYSTEMを使用して、作成したディレクトリ・オブジェクトFSS_DIRにFile Storage ファイルシステムをアタッチします。
```
SQL> BEGIN
  2     DBMS_CLOUD_ADMIN.ATTACH_FILE_SYSTEM(
  3      file_system_name      => 'FSS',
  4      file_system_location  => 'fss.testsubnet.testvcn.oraclevcn.com:/FSS',
  5      directory_name        => 'FSS_DIR',
  6      description           => 'Mounting a FSS'
  7     );
  8  END;
  9  /

PL/SQL procedure successfully completed.

SQL>
```
Autonomous DatabaseにFile Storage ファイルシステムをアタッチすることができました。

SQL*Plusを終了します。
```
SQL> exit
Disconnected from Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.17.0.1.0
[oracle@basedb ~]$
```

# 6. Autonomous Databaseへのインポート

準備が整ったので、File Storage ファイルシステムにあるダンプファイルhr.dumpをAutonomous Databaaseにインポートします。

impdpコマンドで、Autonomous DatabasaeにディレクトリFSS_DIR（=File Storage ファイルシステム）にあるダンプファイルhr.dump内のHRスキーマをインポートします。
```
[oracle@basedb ~]$ impdp admin/Demo#1Demo#1@adb directory=FSS_DIR dumpfile=hr.dump schemas=hr exclude=grant encryption_password=DumpPassw0rd

Import: Release 19.0.0.0.0 - Production on Sun Nov 20 00:47:03 2022
Version 19.17.0.0.0

Copyright (c) 1982, 2019, Oracle and/or its affiliates.  All rights reserved.

Connected to: Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Master table "ADMIN"."SYS_IMPORT_SCHEMA_01" successfully loaded/unloaded
Starting "ADMIN"."SYS_IMPORT_SCHEMA_01":  admin/********@adb directory=FSS_DIR dumpfile=hr.dump schemas=hr exclude=grant encryption_password=******** 
Processing object type SCHEMA_EXPORT/USER
Processing object type SCHEMA_EXPORT/SYSTEM_GRANT
Processing object type SCHEMA_EXPORT/ROLE_GRANT
Processing object type SCHEMA_EXPORT/DEFAULT_ROLE
Processing object type SCHEMA_EXPORT/TABLESPACE_QUOTA
Processing object type SCHEMA_EXPORT/PASSWORD_HISTORY
Processing object type SCHEMA_EXPORT/PRE_SCHEMA/PROCACT_SCHEMA
Processing object type SCHEMA_EXPORT/SEQUENCE/SEQUENCE
Processing object type SCHEMA_EXPORT/TABLE/TABLE
Processing object type SCHEMA_EXPORT/TABLE/TABLE_DATA
. . imported "HR"."EMPLOYEES"                            17.09 KB     107 rows
. . imported "HR"."LOCATIONS"                            8.445 KB      23 rows
. . imported "HR"."JOB_HISTORY"                          7.203 KB      10 rows
. . imported "HR"."JOBS"                                 7.117 KB      19 rows
. . imported "HR"."DEPARTMENTS"                          7.132 KB      27 rows
. . imported "HR"."COUNTRIES"                            6.375 KB      25 rows
. . imported "HR"."REGIONS"                              5.554 KB       4 rows
Processing object type SCHEMA_EXPORT/TABLE/COMMENT
Processing object type SCHEMA_EXPORT/PROCEDURE/PROCEDURE
Processing object type SCHEMA_EXPORT/PROCEDURE/ALTER_PROCEDURE
Processing object type SCHEMA_EXPORT/VIEW/VIEW
Processing object type SCHEMA_EXPORT/TABLE/INDEX/INDEX
Processing object type SCHEMA_EXPORT/TABLE/CONSTRAINT/CONSTRAINT
Processing object type SCHEMA_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICS
Processing object type SCHEMA_EXPORT/TABLE/CONSTRAINT/REF_CONSTRAINT
Processing object type SCHEMA_EXPORT/TABLE/TRIGGER
Processing object type SCHEMA_EXPORT/TABLE/STATISTICS/TABLE_STATISTICS
Processing object type SCHEMA_EXPORT/STATISTICS/MARKER
Job "ADMIN"."SYS_IMPORT_SCHEMA_01" successfully completed at Sat Nov 19 15:47:27 2022 elapsed 0 00:00:18

[oracle@basedb ~]$
```
無事インポートが完了しました。

# 7. インポートの確認

SQL*PlusからAutonomous DatabaseにインポートされたHRユーザとして接続します。
```
[oracle@basedb ~]$ sqlplus hr/Demo#2Demo#2@adb
SQL*Plus: Release 19.0.0.0.0 - Production on Sat Nov 19 19:53:43 2022
Version 19.17.0.0.0

Copyright (c) 1982, 2022, Oracle.  All rights reserved.


Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.17.0.1.0

SQL> 
```
HRスキーマ内の内容を確認します。
```
SQL> col table_name for a15        
SQL> SELECT table_name, num_rows FROM user_tables;

TABLE_NAME	      NUM_ROWS
--------------- ----------
COUNTRIES		        25
JOBS			        19
LOCATIONS		        23
EMPLOYEES	           107
REGIONS 		         4
JOB_HISTORY		        10
DEPARTMENTS		        27

7 rows selected.

SQL>
```
移行元のHRスキーマのテーブルがインポートされていることが確認できました。

SQL*Plusを終了します。
```
SQL> exit
Disconnected from Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.17.0.1.0
[oracle@basedb ~]$
```

# 8. Autonomous Databaseからの File Storage ファイルシステムのデタッチ

SQL*PlusからAutonomous Databaseにadminユーザとして接続します。

```
[oracle@basedb ~]$ sqlplus admin/Demo#1Demo#1@adb
SQL*Plus: Release 19.0.0.0.0 - Production on Sat Nov 19 20:12:11 2022
Version 19.17.0.0.0

Copyright (c) 1982, 2022, Oracle.  All rights reserved.

Last Successful login time: Sat Nov 19 2022 19:52:47 +09:00

Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.17.0.1.0

SQL>
```
DBMS_CLOUD_ADMIN.DETACH_FILE_SYSTEMプロシージャで、ディレクトリ・オブジェクトFSS_DIRからFile Storage ファイルシステムをデタッチします。
```
SQL> BEGIN
  2     DBMS_CLOUD_ADMIN.DETACH_FILE_SYSTEM(file_system_name => 'FSS');
  3  END;
  4  /

PL/SQL procedure successfully completed.

SQL>
```

ディレクトリ・オブジェクトFSS_DIRを削除します。
```
SQL> DROP DIRECTORY FSS_DIR;

Directory dropped.

SQL>
```

以上で、既存のOracle DatabaseからAutonomous DatabaseへのData Pumpによる移行をOCI File Storage経由で行うことができました。

# 参考資料

・[Autonomous Databasae：File Storage ServiceのファイルシステムをAutonomous Databaseにアタッチしてみた](https://qiita.com/500InternalServerError/items/aefb00f33b163b5262dd)
・[Oracle Data Pump エクスポート](https://docs.oracle.com/cd/F19136_01/sutil/oracle-data-pump-export-utility.html)
・[Oracle Data Pump インポート](https://docs.oracle.com/cd/F19136_01/sutil/datapump-import-utility.html)
・[CREATE DIRECTORY](https://docs.oracle.com/cd/F19136_01/sqlrf/CREATE-DIRECTORY.html)