Oracle MySQL Database Serviceのインポート・エクスポート

- Oracle MySQL Database Serviceの使い方メモ〜その２
- Oracle MySQL Database Serviceのインポート・エクスポート (mysqldump, MySQL Client, MySQL Workbench)

# はじめに
Oracle Cloud Infrastructure (OCI) でマネージドサービスとして利用可能なOracle MySQL Database Serviceにおけるインポート・エクスポート操作を確認しました。Bastion (踏み台) サーバー上のmysqldumpとMySQL Clientを利用した場合と、クライアント環境のMySQL Workbenchを利用した場合を確認しました。結論はOracle MySQL Database Serviceにインポートする際にSET @@GLOBAL.GTID_PURGEDが含まれていると権限が足りないと怒られるので、エクスポートする際に`--set-gtid-purged=OFF`オプションを付与することがポイントです。
 
# 検証環境 
- MySQLバージョン : 8.0.22-u2-cloud (Oracle MySQL Database Service)
- Oracle-Linux-8.2-2020.11.10-0 (OCI Compute VM) : Bastion (踏台) サーバとして利用
- MySQL Ver 8.0.21 for Linux on x86_64  (Source distribution) : Bastionサーバ上のMySQL Clientとして利用
- macOS 10.15.7 Catalina : クライアント環境
- MySQL Workbench 8.0 Version 8.0.22 : クライアント上にインストール

OCI上の検証環境の構築方法は前回の記事を参照ください。
[Oracle MySQL Database Serviceのインスタンスを作ってMySQL Workbenchから接続してみた](https://qiita.com/orakurara/items/e8e158eebad1295a9448)

# Bastionサーバ上でエクスポート・インポートを実施する
## 概要
Oracle MySQL Database Serviceインスタンスはプライベート・エンドポイントにアクセス可能なBastionサーバ上でmysqldump, MySQL Clientを実行し、Oracle MySQL Database Serviceにおけるインポート・エクスポートを行います。作業のイメージとしては下記のアーキテクチャ図を確認ください。エクスポートによるDumpファイルが生成場所、インポートのためのDumpファイルの配置場所はBastionサーバとなります。
![20-11-15-13-53-20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/2c185dc6-281d-bf65-b50e-5815e2eb9eff.png)



## 失敗例
`--set-gtid-purged=OFF`オプション無しで失敗例を記します。Oracle MySQL Database Serviceインスタンス上のtestスキーマに対して下記エクスポート操作をBastionサーバ上で実施しました。

```shell-session:
$ mysqldump --single-transaction --host [プライベートIPアドレス] -u [管理者ユーザー名] -p test > /tmp/mysqldump_test.dump
Enter password: 
Warning: A partial dump from a server that has GTIDs will by default include the GTIDs of all transactions, even those that changed suppressed parts of the database. If you don't want to restore GTIDs, pass --set-gtid-purged=OFF. To make a complete dump, pass --all-databases --triggers --routines --events. 
```
警告が出ますがDumpファイルは問題なく生成されています。

```shell-session:
$ ls /tmp/mysqldump_test.dump
/tmp/mysqldump_test.dump
```

次にOracle MySQL Database Serviceインスタンスにインポートしてみます。

```shell-session:
mysql --host [プライベートIPアドレス] -u [管理者ユーザー名] -p test < /tmp/mysqldump_test.dump
Enter password: 
ERROR 1227 (42000) at line 18: Access denied; you need (at least one of) the SUPER, SYSTEM_VARIABLES_ADMIN or SESSION_VARIABLES_ADMIN privilege(s) for this operation
```
管理者ユーザーに付与されている権限が不足しているとエラーがでて失敗します。

## 成功例
`--set-gtid-purged=OFF`オプションを付与してmysqldumpコマンドを実施します。

```shell-session:
$ mysqldump --single-transaction --set-gtid-purged=OFF --host [プライベートIPアドレス] -u [管理者ユーザー名] -p test > /tmp/mysqldump_test.dump
Enter password: 
```
警告も表示されず、問題なく成功します。次にOracle MySQL Database Serviceインスタンスにインポートしてみます。

```shell-session:
mysql --host [プライベートIPアドレス] -u [管理者ユーザー名] -p test < /tmp/mysqldump_test.dump
Enter password: 
```
インポートも問題なく実行できました。
mysqldumpのオプションについては[公式マニュアル](https://dev.mysql.com/doc/refman/5.6/ja/mysqldump.html)を確認ください。


# クライアント上のMySQL Workbenchからのエクスポート・インポート
## 概要
Bastionサーバ経由でOracle MySQL Database Serviceにアクセスするように設定したクライアント環境上のMySQL Workbenchからインポート・エクスポートを行います。作業のイメージとしては下記のアーキテクチャ図を確認ください。エクスポートによるDumpファイルが生成場所、インポートのためのDumpファイルの配置場所はクライント環境となります。
![20-11-15-12-55-24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/deac6738-20b6-c83d-f2af-2ed2161881f4.png)


MySQL Workbenchの接続方法については[前回の記事](https://qiita.com/orakurara/items/e8e158eebad1295a9448)を参照ください。

## エクスポート操作
MySQL Workbench起動後に接続情報のタイルを選択し接続、画面左の**Management**メニューより**Data Export**メニューを選択します。画面右上の**Advanced Option**より**set-gtid-purged - Add 'SET @@GLOBAL.GTID_PURGED' to the output**の値を`OFF`に設定し、画面右上の**Return**ボタンを選択して元の画面に戻ります。
![20-11-15-13-07-47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/35ad80bf-cbef-ab3f-0966-c82a055285bf.png)

*Table to Export*よりエクスポート対象となるスキーマとテーブルを選択してください。画面下部の*Export to Dump Project Folder*にDumpファイルの出力先のフォルダPATHを入力し、画面右下の**Start Export**ボタンを選択して、エクスポートを実行します。
![20-11-15-13-19-03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/35ce0999-6468-bd89-2671-ce9e1cb39527.png)


## インポート操作
画面左の**Management**メニューより**Data Export**メニューを選択します。*Import from Dump Project Folder*にインポートするDumpファイルが存在するフォルダPATHを入力します。画面下部の選択メニューより、インポート対象となるスキーマとテーブルを選択してください。画面右下の**Start Import**ボタンを選択して、インポート操作を実行します。
![20-11-15-13-26-58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/75f8a00e-7bb2-6610-cb29-4657cc731650.png)
![20-11-15-13-29-40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/51b69994-46c7-a6d0-775d-fec99ebf7897.png)



# 関連情報
[公式サイト](https://www.oracle.com/jp/mysql/)
[Oracle Cloud Infrastructure Documentation MySQL Database](https://docs.cloud.oracle.com/en-us/iaas/mysql-database/index.html)
[MySQL 5.6 リファレンスマニュアル　mysqldump — データベースバックアッププログラム](https://dev.mysql.com/doc/refman/5.6/ja/mysqldump.html)