ローカルのデータベースをAWS EC2インスタンス内にインポートする(Capistranoによる自動デプロイで)

# ローカルのデータベースをAWSにインポートしたい！
ローカルで作ったアプリをAWSのEC2インスタンス内へデプロイ。その際、ローカルで使っていたデータベースとデプロイ時のデータベースの内容を同じにしたい。つまり、<b>○○_development</b>の内容を<b>○○_production</b>に反映させたい。

あ、ちなみにアプリはRuby on Rails使用で、デプロイはgem Capistranoで自動デプロイしてます。

# EC2インスタンスにMySQLをインストールする

## MySQLのインストールと起動
以下のコマンドでEC2インスタンスへMySQLをインストール。Amazon Linuxを利用している場合、yumというコマンドでMySQLをインストールできる。

```
[ec2-user@ip-xxx-xx-xx-xxx ~]$ sudo yum install mysql56-server mysql56-devel mysql56
```
これでMySQLのバージョン5.6がインストールされます。

MySQLを起動するために```service```コマンドを叩く。これは、Amazon LinuxやCentOSに含まれているもので、インストールしたソフトウェアの起動を一括して行えるツール。

```
[ec2-user@ip-xxx-xx-xx-xxx ~]$ sudo service mysqld start
```

mysql ではなく mysqld であることに注意。「d」はLinuxの用語で「サーバ」を意味する「デーモン(daemon)」の頭文字。
起動確認のために以下のコマンド。

```
[ec2-user@ip-xxx-xx-xx-xxx ~]$ sudo service mysqld status
mysqld (pid  15692) is running...
```
runningと表示されれば、MySQLの起動は成功している。


## パスワードの設定
yum でインストールしたMySQLには、デフォルトで root というユーザーでアクセス出来るようになっているが、パスワードが設定されていない。

以下のコマンドでパスワードを設定

``` 
[ec2-user@ip-xxx-xx-xx-xxx ~]$ sudo /usr/libexec/mysql56/mysqladmin -u root password '<設定したいパスワード>'
```

## MySQLへの接続確認
先ほど入力したパスワードが使えるか、以下のコマンドで確認。

``` 
[ec2-user@ip-xxx-xx-xx-xxx ~]$ mysql -u root -p
```

```Enter password:``` とパスワードを入力するように表示されるので、先ほど登録したパスワードを入力。以下のように表示されれば、MySQLの設定は終了。

```
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 4
Server version: 5.6.33 MySQL Community Server (GPL)

Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.

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>
```

# ローカルのデータベースをAWS EC2インスタンス内にインポートする
## ローカルのデータベースをCSV形式でエクスポートする
まずはローカルのデータベースをCSV形式でエクスポートする。テーブル名.csvの形式でデスクトップへ出力される。

参考
[MySQLのデータインポート・エクスポート](http://qiita.com/rato303/items/2e614f23e5feee150ffc)
[MySQLのデータベースをまるっとお引越し。 (エクスポート/インポート)](http://qiita.com/sango/items/84a45e5911d719a2c08c)

## csvファイルをdbフォルダに入れる
先ほどデスクトップに出力されたcsvファイルを、(アプリ名)/dbの中に入れる。orders, users,productsのテーブルデータをエクスポートしたのなら、こんな具合になる。
![image](https://qiita-image-store.s3.amazonaws.com/0/176100/c7d19bc5-1f69-ebfb-4f97-c2676018b0f8.png)


## seeds.rbを編集する
dbフォルダ下にあるseeds.rbファイル(ちょうど上の画像で選択されてるやつ)を以下のように書き変える。

```ruby:seeds.rb
require "csv"
# 1番上に1度だけ記述　

# 以下は各テーブルごとに名前を変えて記述。例えばこれはordersテーブル。
orders_csv = CSV.readlines("db/orders.csv")
orders_csv.shift
orders_csv.each do |row|
  Order.create(user_id: row[1], created_at: row[2], updated_at: row[3], product_count: row[4], product_id: row[5])
  # idを除くカラム名を記述する
end

# productsテーブル
products_csv = CSV.readlines("db/products.csv")
products_csv.shift
# 以下略
```

## deploy.rbを編集する

次に、deploy.rbを編集する。

```ruby:config/deploy.rb
# 前略
set :log_level, :debug

after 'deploy:publishing', 'deploy:restart'
namespace :deploy do
# 以下を追加
  desc 'db_seed'
  task :db_seed do
    on roles(:db) do |host|
      with rails_env: fetch(:rails_env) do
        within current_path do
          execute :bundle, :exec, :rake, 'db:seed'
        end
      end
    end
  end
# ここまでが追加分
  task :restart do
    invoke 'unicorn:restart'
  end
end
```

## リモートリポジトリへプッシュ
いつものように、git add, commit, push。


## Cap deploy
capistranoを使った自動デプロイ。
まずはいつもの。

```:ローカル
$ bundle exec cap production deploy
```

これで一旦デプロイしたあと、改めてデータベース読み込み。

```:ローカル
$ bundle exec cap production deploy:db_seed
```

これで<b>○○_development</b>と<b>○○_production</b>の内容を同じものにできました！わーい！！


# ちゃんとデータ入ってるのか確認
EC2インスタンスのMySQLへログイン

```
[ec2-user@ip-xxx-xx-xx-xxx ~]$ mysql -u root -p
```
パスワードを求められるので入力。

データベース一覧を確認するにはこのコマンド。

``` 
mysql> show databases
```

データベースを選択

```
mysql> use amazon_production;
```

各テーブルの中身を見る

```
# ordersテーブルなら
mysql> select * from orders
```