[OCI]MySQL Shellを使用してMySQL DBシステムから直接Object StorageにExportして、MySQL DBシステム作成時にImportしてみた

# はじめに

MySQL ShellとOCI CLIを使用することで、MySQL DBシステムのデータベースを直接Object StorageにExportしたり、Exportしたデータを直接Object StorageからImportできるようになったということで、試してみました。

また、MySQL DBシステム作成時にObject Storageに取得したExportデータをImportできるということで、そちらも試してみました。

# 1.MySQL DBシステムの作成
OCIコンソールから、MySQL DBシステムを作成します。

# 2.Computeインスタンスの準備

MySQL Shell、MySQLクライアントを動作させるComputeインスタンスを準備します。
今回はOracle Linux 7.9のComputeインスタンスを準備しました。

# 3.MySQL Shellのインストール

2.で作成したComputeインスタンスにopcユーザでログインします。

yumでMySQL Shellをインストールします。

```
sudo yum install -y https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm
sudo yum install -y mysql-shell
```
# 4.MySQLクライアントのインストール

yumでMySQLクライアントをインストールします。

```
sudo yum install -y mysql
```
# 5.OCI CLIのインストールと設定

yumでOCI CLIをインストールします。

```
sudo yum install -y python36-oci-cli
```
OCI CLIの設定を行います。
設定に必要な以下の情報を事前に確認しておきます。
・テナンシのOCID
・OCIユーザのOCID
・使用するリージョン

```
oci setup config
```
こちらの手順で作成されたAPIキーの公開鍵（デフォルトでは$HOME/.oci/oci_api_key_public.pem）を、コンソールからOCIユーザのAPIキーの公開鍵として登録します。

# 6.Object Storage バケットの作成

MySQL DB SystemのExportファイルの保存先となるバケットを作成します。
今回は「ForMySQLDS」という名前のバケットを作成しました。
![スクリーンショット 2021-05-24 14.08.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/2478afcd-15a3-60da-d274-97864f5bad7c.png)
Exportを実行する際に以下の情報が必要になりますので、メモしておきます。
・Object Storageのネームスペース
・Object Storageバケットの名前

# 7.テスト用データベースとテストデータの作成
Exportのテストのためのデータベースを作成します。
MySQLクライアントから1.で作成したMySQL DBシステムに接続します。

```
mysql --host mysqlds1 -u admin -p
```
データベース「test」を作成します。

```
mysql> CREATE DATABASE test;
Query OK, 1 row affected (0.00 sec)
```
データベースの一覧を確認します。

```
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| test               |
+--------------------+
5 rows in set (0.00 sec)
```

データベース「test」に接続します。

```
mysql> use test
Database changed
```

テスト用のテーブル「dept」を作成し、テストデータをINSERTします。

```
mysql> CREATE TABLE dept (
    -> deptno INT,
    -> dname VARCHAR(14),
    -> loc VARCHAR(13) ,
    -> PRIMARY KEY (deptno));
Query OK, 0 rows affected (0.01 sec)

mysql> INSERT INTO dept VALUES (10,'ACCOUNTING','NEW YORK');
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO dept VALUES (20,'RESEARCH','DALLAS');
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO dept VALUES (30,'SALES','CHICAGO');
Query OK, 1 row affected (0.01 sec)

mysql> INSERT INTO dept VALUES (40,'OPERATIONS','BOSTON');
Query OK, 1 row affected (0.09 sec)

mysql> COMMIT;
Query OK, 0 rows affected (0.00 sec)

mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| dept           |
+----------------+
1 row in set (0.00 sec)

mysql> SELECT * FROM dept;
+--------+------------+----------+
| deptno | dname      | loc      |
+--------+------------+----------+
|     10 | ACCOUNTING | NEW YORK |
|     20 | RESEARCH   | DALLAS   |
|     30 | SALES      | CHICAGO  |
|     40 | OPERATIONS | BOSTON   |
+--------+------------+----------+
4 rows in set (0.00 sec)
```

# 8.MySQL ShellからObject StorageへのExportを実行する

MySQL Shellから1.で作成したMySQL DBシステムのデータベースに接続します。

```
[opc@work ~]$ mysqlsh admin@mysqlds1
Please provide the password for 'admin@mysqlds1': ************
Save password for 'admin@mysqlds1'? [Y]es/[N]o/Ne[v]er (default No): Y
MySQL Shell 8.0.25

Copyright (c) 2016, 2021, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its affiliates.
Other names may be trademarks of their respective owners.

Type '\help' or '\?' for help; '\quit' to exit.
Creating a session to 'admin@mysqlds1'
Fetching schema names for autocompletion... Press ^C to stop.
Your MySQL connection id is 15 (X protocol)
Server version: 8.0.25-cloud MySQL Enterprise - Cloud
No default schema selected; type \use <schema> to set one.
 MySQL  mysqlds1:33060+ ssl  JS >
```
util.dumpInstanceコマンドで、Object StorageへのExportを実行します。

```
util.dumpInstance("<接頭辞>", {osBucketName: "<Object Storage バケット名>", osNamespace: "<Object Storageネームスペース>", threads: <スレッド数>, ocimds: true, compatibility: ["strip_restricted_grants"]})
```
コマンド実行時の表示は以下の様になりました。

```
 MySQL  mysqlds1:33060+ ssl  JS > util.dumpInstance("", {osBucketName: "ForMySQLDS", osNamespace: "xxxxxxxxxxxx", threads: 1, ocimds: true, compatibility: ["strip_restricted_grants"]})
Acquiring global read lock
Global read lock acquired
Gathering information - done
All transactions have been started
Locking instance for backup
Global read lock has been released
Checking for compatibility with MySQL Database Service 8.0.25
NOTE: User 'admin'@'%' had restricted privileges (BACKUP_ADMIN, FLUSH_TABLES, PROXY, ROLE_ADMIN) removed
NOTE: User 'administrator'@'%' had restricted privileges (BACKUP_ADMIN, FLUSH_TABLES, ROLE_ADMIN) removed
NOTE: User 'ociadmin'@'127.0.0.1' had restricted privileges (AUDIT_ADMIN, BACKUP_ADMIN, BINLOG_ADMIN, BINLOG_ENCRYPTION_ADMIN, CLONE_ADMIN, CREATE TABLESPACE, ENCRYPTION_KEY_ADMIN, FILE, FLUSH_OPTIMIZER_COSTS, FLUSH_STATUS, FLUSH_TABLES, FLUSH_USER_RESOURCES, GROUP_REPLICATION_ADMIN, INNODB_REDO_LOG_ARCHIVE, INNODB_REDO_LOG_ENABLE, PERSIST_RO_VARIABLES_ADMIN, PROXY, RELOAD, REPLICATION_SLAVE_ADMIN, ROLE_ADMIN, SERVICE_CONNECTION_ADMIN, SESSION_VARIABLES_ADMIN, SET_USER_ID, SHOW_ROUTINE, SHUTDOWN, SUPER, SYSTEM_USER, SYSTEM_VARIABLES_ADMIN, TABLE_ENCRYPTION_ADMIN) removed
NOTE: User 'ocirpl'@'%' had restricted privileges (SERVICE_CONNECTION_ADMIN, SYSTEM_USER) removed
NOTE: Database test had unsupported ENCRYPTION option commented out
Compatibility issues with MySQL Database Service 8.0.25 were found and repaired. Please review the changes made before loading them.
Writing global DDL files
Writing users DDL
Preparing data dump for table `test`.`dept`
Data dump for table `test`.`dept` will be chunked using column `deptno`
Running data dump using 1 thread.
NOTE: Progress information uses estimated values and may not be accurate.
Writing DDL for schema `test`
Writing DDL for table `test`.`dept`
Data dump for table `test`.`dept` will be written to 1 file
1 thds dumping - 100% (4 rows / ~4 rows), 2.00 rows/s, 48.00 B/s uncomp1 thds dumping - 100% (4 rows / ~4 rows), 2.00 rows/s, 48.00 B/s uncompressed, 0.00 B/s compressed
Duration: 00:00:01s        
Schemas dumped: 1          
Tables dumped: 1
Uncompressed data size: 80 bytes
Compressed data size: 0 bytes
Compression ratio: 80.0    
Rows written: 4            
Bytes written: 0 bytes     
Average uncompressed throughput: 48.19 B/s
Average compressed throughput: 0.00 B/s
 MySQL  mysqlds1:33060+ ssl  JS > 
```
Object StorageへのExportが完了しましたので、バケットの内容を確認してみます。
![スクリーンショット 2021-05-24 14.31.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/7863b2fa-1232-a5f5-7938-c8c061e6ca9c.png)
![スクリーンショット 2021-05-24 14.32.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/a90eee9e-6953-5b0c-a639-96817045305b.png)
MySQL DBシステムからObject Storageに直接Exportできていることが確認できました。

# 9.MySQL ShellでObject Storageに取得したExportデータをMySQL DBシステムにインポートする

Object Storageに取得したExportデータをMySQL Shellを使用してMySQL DBシステムにインポートします。

MySQLクラアントから1.で作成したMySQL DBシステムに接続し、データベース「test」を削除します。

```
[opc@work ~]$ mysql --host mysqlds1 -u admin -p 
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 10
Server version: 8.0.25-cloud MySQL Enterprise - Cloud

Copyright (c) 2000, 2021, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> use mysql
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> DROP DATABASE test;
Query OK, 1 row affected (0.01 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.00 sec)
mysql> exit
Bye
```
MySQL Shellから1.で作成したMySQL DBシステムに接続します。

```
[opc@work ~]$ mysqlsh admin@mysqlds1
MySQL Shell 8.0.25

Copyright (c) 2016, 2021, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its affiliates.
Other names may be trademarks of their respective owners.

Type '\help' or '\?' for help; '\quit' to exit.
Creating a session to 'admin@mysqlds1'
Fetching schema names for autocompletion... Press ^C to stop.
Your MySQL connection id is 24 (X protocol)
Server version: 8.0.25-cloud MySQL Enterprise - Cloud
No default schema selected; type \use <schema> to set one.
 MySQL  mysqlds1:33060+ ssl  JS > 
```
util.loadDumpコマンドでImportを実行します。

```
util.loadDump("<接頭辞>", {osBucketName: "<Object Storageのバケット名>", osNamespace: "<Object Storageのネームスペース>", threads: <スレッド数>})
```
コマンド実行時の表示は以下の様になりました。

```
 MySQL  mysqlds1:33060+ ssl  JS > util.loadDump("", {osBucketName: "ForMySQLDS", osNamespace: "xxxxxxxxxxxx", threads: 1})
Loading DDL and Data from OCI ObjectStorage bucket=ForMySQLDS, prefix='' using 1 thread.
Opening dump...
Target is MySQL 8.0.25-cloud (MySQL Database Service). Dump was produced from MySQL 8.0.25-cloud
Fetching dump data from remote location...
Fetching 1 table metadata files for schema `test`...
Checking for pre-existing objects...
Executing common preamble SQL
Executing DDL script for schema `test`
[Worker000] Executing DDL script for `test`.`dept`
[Worker000] test@dept@@0.tsv.zst: Records: 4  Deleted: 0  Skipped: 0  Warnings: 0
Executing common postamble SQL                                       
                                                        
1 chunks (4 rows, 80 bytes) for 1 tables in 1 schemas were loaded in 1 sec (avg throughput 80.00 B/s)
0 warnings were reported during the load.
 MySQL  mysqlds1:33060+ ssl  JS >
```
MySQLクライアントからMySQL DBシステムに接続して、正しくImportされているか確認します。

```
[opc@work ~]$ mysql --host mysqlds1 -u admin -p 
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 27
Server version: 8.0.25-cloud MySQL Enterprise - Cloud

Copyright (c) 2000, 2021, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| test               |
+--------------------+
5 rows in set (0.00 sec)

mysql> use test
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| dept           |
+----------------+
1 row in set (0.01 sec)

mysql> SELECT * FROM dept;
+--------+------------+----------+
| deptno | dname      | loc      |
+--------+------------+----------+
|     10 | ACCOUNTING | NEW YORK |
|     20 | RESEARCH   | DALLAS   |
|     30 | SALES      | CHICAGO  |
|     40 | OPERATIONS | BOSTON   |
+--------+------------+----------+
4 rows in set (0.00 sec)

mysql>
```
Object Storageに取得したExportが正しくImportされていることが確認できました。

# 10.MySQL DBシステム作成時にObject Storageに取得したExportデータをインポートする

MySQL DBシステム作成時にObject Storage上のExportデータを指定してImportを行うことができます。

MySQL DBシステムを作成する際に、作成画面の「拡張オプションの表示」をクリックし、「データのインポート」タブに移動します。
「既存のMySQLシェル・ダンプ・ファイル（@.manifest.json）に対するPAR URLを作成するには、ここをクリックします。」をクリックします。
![スクリーンショット 2021-05-24 13.21.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/6abc6579-b42b-5aff-b02c-9693cc5fe6bc.png)
Exportデータが保存されているObject Storageバケット、マニフェストファイル、PAR（事前認証済みリクエスト）の有効期限を選択して「PAR URLの作成と設定」をクリックします。
![スクリーンショット 2021-05-24 13.22.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/cae8007a-0b6d-937d-2704-5fb81304b15c.png)
PAR URLが作成され、自動的にPARソースURLにセットされます。
![スクリーンショット 2021-05-24 13.23.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/cfc864c7-3c2a-e287-390d-35cba8001316.png)
この設定を行なってから「作成」ボタンをクリックすると、MySQL DB Systemが作成された後に指定したObject StorageバケットからExportデータがImportされます。

MySQLクライアントから作成されたMySQL DBシステムに接続し、Object Storage上のExportデータがImportされているか確認してみます。

```
[opc@work ~]$ mysql --host mysqlds2 -u admin -p 
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 11
Server version: 8.0.25-cloud MySQL Enterprise - Cloud

Copyright (c) 2000, 2021, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| test               |
+--------------------+
5 rows in set (0.00 sec)

mysql> use test
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed

mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| dept           |
+----------------+
1 row in set (0.00 sec)

mysql> SELECT * FROM dept;
+--------+------------+----------+
| deptno | dname      | loc      |
+--------+------------+----------+
|     10 | ACCOUNTING | NEW YORK |
|     20 | RESEARCH   | DALLAS   |
|     30 | SALES      | CHICAGO  |
|     40 | OPERATIONS | BOSTON   |
+--------+------------+----------+
4 rows in set (0.00 sec)

mysql>
```
Object Storage上のExportデータが正しくImportされていることが確認できました。

# まとめ

MySQL Shell、OCI CLIを用いることで、MySQL DBシステムを直接Object StorageにExportしたり、Object Storage上のExportデータをMySQL DBシステムに直接Importできることが確認できました。
また、Object Storageに取得したExportデータをMySQL DBシステム作成時にImportできることが確認できました。
めでたし、めでたし。

# 参考情報
[Oracle Cloud Infrastructure Documentation MySQL Database : Importing and Exporting Databases](https://docs.oracle.com/en-us/iaas/mysql-database/doc/importing-and-exporting-databases.html)
[Oracle Cloud Infrastructure Documentation Command Line Interface (CLI)](https://docs.oracle.com/en-us/iaas/Content/API/Concepts/cliconcepts.htm)