【MySQL】さくらVPSに構築したMySQLデータベーススキーマをCloud SQLに移管する

# 概要
さくらVPSで動くMySQLのデータをCloudSQLに移管した時のメモです。

# 手順
## 移管元サーバーでの作業
### バックアップ
[公式ドキュメント](https://cloud.google.com/sql/docs/mysql/import-export/creating-sqldump-csv?hl=ja:title)を参考に進めました。  

まず、移管元のデータが存在するサーバーにSSHログインし、バックアップファイルを生成します。
  
```
$ mysqldump -u[DBユーザー名] -p[DBパスワード] -B [DBスキーマ名] --skip-triggers --set-gtid-purged=OFF --default-character-set=utf8 > ~/backup/mysql_dump_gcp.sql
```

### バックアップデータをローカルに落とす
データ量がそれほど多くなかったので、scpコマンドを使って、ローカルにバックアップファイルを落としてきました。 
 
```
$  scp -P [サーバーのSSHポート番号] [sshのユーザー名]@[移管元サーバーのIPアドレス]:backup/mysql_dump_gcp.sql ~/
```

## GCP内での作業
### Cloud Storage
CloudSQLにバックアップファイルを流し込む際には、Cloud Storageにアップロードしたバックアップファイルを使用して、データをインポートする手順になります。 

#### バケットを作成
バックアップファイルを保存しておくバケットバケットを作成します。
サイドバーから、「Storage」→「ブラウザ」を選択。
![20190124141135.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154121/69ca7ff9-c123-9461-be17-38c8c17357c7.png)

作成画面には色々ありますが、一時的にファイルを乗せるだけなのでバケット名だけわかりやすいものを記入し、あとはスルーでOKです。
「作成」ボタンを押して、バケットを作成。
![20190124141302.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154121/2275574c-fd36-881e-59b3-a40f90da4252.png)

#### ファイルをアップロード
バケットを作成したら、自動的に作成されたバケット内の操作画面に飛びます。
左上の「ファイルをアップロード」をクリックし、先ほどローカルに落とした`mysql_dump_gcp.sql`をアップロードします。  
![20190124141836.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154121/ad9b0628-54a9-9a92-900e-74e0936f81f8.png)

### Cloud SQL
#### インスタンスを作成
サイドバーから、SQLを選択し、「インスタンスの作成」ボタンをクリックします。
![20190124142535.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154121/b00cd209-ddc3-4b68-5192-537cfaa19612.png)

インスタンスの各種設定を定義し、「作成」ボタンをクリックすると、インスタンスが作成されます。

#### データインポート
作成されたインスタンスを選択すると、インスタンスの操作画面に移動します。
上部の「インポート」をクリック。
![20190124143102.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154121/27ec85c6-6475-cc4b-4921-553f6e5ff125.png)

遷移した画面で、先ほどCloud Storageにアップロードしたバックアップファイルを使用します。
![20190124143257.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154121/2ade6ea3-49e7-69e7-3ff2-706bbd2fa258.png)


この画面では下記内容を入力。

* Cloud Storageファイル: 「参照」から、Cloud Storage内にあるバックアップファイルを選択
* インポートの形式: SQL
* データベース: 選択なし（バックアップファイルにデータベーススキーマ作成の命令が入っているので、今回は選択なしでOK）

「インポート」をクリックすると、データが取り込まれます。

#### MySQLユーザーの作成
インポートが終わったら、データベースにアクセスできるユーザーを作成します。
インスタンスの詳細画面から、「ユーザー」を選択。
![20190124145615.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154121/0769c6f5-facf-5bc9-13d0-bcd4b2e1a5cb.png)

任意のアカウント名とパスワードを指定し、ユーザーを作成します。

## データの確認
データの移管が完了したので、データが正常に移管されているかを確認します。

### Cloud SDKの認証設定
Cloud SQL Proxyを使ってCloud SQLに接続するときに、GCPへの認証情報が必要になります。
ここでは、そのための認証設定を行います。  

CLIを使用して対象のプロジェクトを持つユーザーでログインします。

```
$ gcloud auth login
```

次に、プロジェクト設定を行います。
作成したCloudSQLが乗っているプロジェクトを、`gcloud`コマンドで繋ぐデフォルトプロジェクトとしてセット。

```
$ gcloud config set project [プロジェクトID]
```

これで認証設定が完了しました。
Cloud SQL Proxyを使用するときに、ここで設定したCloud SDKの認証設定が参照されます。

### Cloud SQL Proxyを立ち上げる
ローカル環境から、Cloud SQLに接続してデータを確認します。
その際に、GCPでは直接Cloud SQLのホストを指定して接続するのではなく、Cloud SQL Proxyという仕組みを使います。  

参考ページは[こちら](https://cloud.google.com/sql/docs/mysql/connect-admin-proxy?hl=ja)。

ローカル環境でシェルを起動し、Cloud SQL Proxyを立ち上げます。

```
$ ./cloud_sql_proxy -instances=[コネクション名]=tcp:3306
```
ここでのコネクション名は、CloudSQLインスタンスの詳細画面から確認できます。
![20190124145050.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154121/35bf32bd-f383-1b05-7451-a7ac00d8bed5.png)


### データベースに接続する
Cloud SQL Proxyが走ると、「コネクションが確立されたよ」というメッセージが出てきます。
もう一つシェルを立ち上げ、下記コマンドを入力。

```
$ mysql -u[ユーザー名] -p[パスワード] --host 127.0.0.1
```
ユーザー名とパスワードには、先ほどCloud SQLの画面で作成したユーザーの情報を入力します。
すると、Cloud SQLに作成したMySQLに入ることができます。
これで`select`文などでデータの確認を行い、正常に移管できていれば完了です。