【MySQL】mysqldumpコマンドまとめ｜バックアップ・リストア

>この記事では、《&ensp;mysqldumpコマンド&ensp;》について、
業務を通して学習した内容をまとめています。

- __データベースのバックアップ方法__
- __データベースのリストア（復元）方法__

こういった内容についてまとめています。

__※本記事は、自分で学習したことのまとめ用として書いています。
尚、解説で誤った点があれば、スローして頂ければ喜んでキャッチしますのでお願い致します。__

##【基礎】押さえておきたい知識

![manipulation-1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255884/2598781f-d13e-6103-d627-4165e4ee72af.jpeg)

『MySQL』のバックアップ及びデータの復元には、`mysqldump`コマンドを利用します。 

>`mysqldump`コマンドは、MySQLをインストールすると使えるようになるコマンドで、コマンドプロンプトやターミナルなどから実行できます。

`mysqldump`コマンドを使用する前に押さえておきたいコマンドオプションに… 

- __-–single-transaction__
- __--quick__

の２つがあります。 

###オプション①：&ensp;–-single-transaction

`–-single-transaction`オプションは、トランザクションを利用してバックアップを取得します。 

例えば・・・

バックアップの対象となるデータベースのデータ量が膨大で、バックアップに３０分以上かかるとします。 

そこで発生するのが、__整合性の問題__です。

具体的には・・・

常時運用しているデータベースでは…

__dumpを開始したタイミング__&ensp;と&ensp;__dumpを終了したタイミング__

でデータベースの内容に相違がある可能性があります。

>これを防ぐために、例えば…

>__dumpを行っている間データベースをロックし、変更を許さない状態にする__

>という手もありますが…
常時運用しているデータベースでは、dumpの間データベースが使用不可の状態になるため使えません。

ですが・・・

`–-single-transaction`オプションは、トランザクションを利用してくれるので…

__dumpを開始した時点のデータと、dumpが終了した時点のデータの整合性を保証できます。__

ですので・・・

`–-single-transaction`オプションは、つけておくのがベストです。

###オプション②：&ensp;--quick

また・・・

`–-single-transaction`と併用して使いたいのが、`--quick`オプションです。

__データ量が膨大なデータベースをダンプする場合、メモリーへのバッファリングが問題になる場合があります。__

`--quick`オプションを利用すると・・・

テーブルの全レコードをメモリにバッファせず、１行ずつダンプを行うので…

メモリを圧迫せずに、ダンプを行うことができます。

####※追記

`--quick`オプションは、__デフォルトで『有効』になっているため、使用する必要はありません。__

↓↓↓以下、公式リファレンスより

https://dev.mysql.com/doc/refman/5.6/ja/mysqldump.html

>テーブルを 1 行ずつダンプする場合、--quick オプションを使用してください (または --opt を指定すれば --quick が有効になります)。--opt オプションは (したがって --quick も) デフォルトで有効なため、メモリーへのバッファリングを有効にするには、--skip-quick を使用します。

##バックアップ方法【３種類】

![artistic-black-background-bloom-1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255884/b812ebcf-607f-a991-0f1e-8ea5edd9f0f2.jpeg)

この記事では、３通りのバックアップ方法について解説します。

1. &ensp;__『１つ』のデータベースをバックアップ方法__
2. &ensp;__『複数』のデータベースをバックアップ__
3. &ensp;__『全て』のデータベースをバックアップ__

###『１つ』のデータベースをバックアップ

~~~
mysqldump --single-transaction -u ユーザー名 -p データベース名 > 出力先のファイル
~~~

例えば・・・

- ユーザー名：&ensp;root
- データベース名：&ensp;sample_db
- 出力先のファイル：&ensp;/bak/mysqldump_sample.dump

という内容でバックアップしたい場合は、下記のようになります。

~~~
mysqldump --single-transaction -u root -p sample_db > /bak/mysqldump_sample.dump
~~~

###『複数』のデータベースをバックアップ

~~~
mysqldump --single-transaction -u root -p -B データベース名 データベース名…> 出力先のファイル
~~~

例えば・・・

- ユーザー名：&ensp;root
- データベース名：&ensp;sample1_db、sample2_db、sample3_db
- 出力先のファイル：&ensp;/bak/mysqldump_sample.dump

という内容でバックアップしたい場合は、下記のようになります。

~~~
mysqldump --single-transaction -u root -p -B sample1_db、sample2_db、sample3_db > /bak/mysqldump_sample.dump
~~~

###『全て』のデータベースをバックアップ

~~~
mysqldump --single-transaction -u ユーザー名 -p -A > 出力先のファイル
~~~

例えば・・・

- ユーザー名：&ensp;root
- 出力先のファイル：&ensp;/bak/mysqldump_sample.dump

という内容でバックアップしたい場合は、下記のようになります。

~~~
mysqldump --single-transaction -u root -p -A > /bak/mysqldump_sample.dump
~~~

##リストア（復元）方法【２種類】

![assembly-1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255884/bbada690-76ce-d854-aaf7-9cca5eb6c6ad.jpeg)

続いて、２通りのリストアの方法について解説します。

1. &ensp;__『１つ』のデータベースをリストアする方法__
3. &ensp;__『全て』のデータベースをリストアする方法__


###『１つ』のデータベースをリストアする方法

~~~
mysql -u ユーザー名 -p データベース名 < dumpファイル名
~~~

例えば・・・

- ユーザー名：&ensp;root
- データベース名：&ensp;sample_db
- dumpファイル：&ensp;/bak/mysqldump_sample.dump

という内容でバックアップしたい場合は、下記のようになります。

~~~
mysql -u root -p sample_db < /bak/mysqldump_sample.dump
~~~

*__※尚、データの投入先となるデータベースは、先に作成しておく必要があります！__*

↓↓↓以下、公式リファレンスより

https://dev.mysql.com/doc/refman/5.6/ja/mysqldump-sql-format.html

>--all-databases または --databases を使用すると、mysqldump は、各データベースのダンプ出力の前に、CREATE DATABASE および USE ステートメントを書き込みます。これにより、ダンプファイルがリロードされると、それが各データベースが存在しなければ作成して、デフォルトのデータベースにするため、データベースの内容がそれらの作成元の同じデータベースにロードされます。

つまり・・・

`--databases`オプションを使用して作成したdumpファイルには、データベース名が`sample`の場合、以下の記述が含まれています。

~~~
CREATE DATABASE /*!32312 IF NOT EXISTS*/ `sample_db`;

USE `sample_db`;
~~~

そのため・・・

データベースを作成する必要はありません。

しかし・・・

`--databases`オプションを使用せずにdumpファイルを作成した場合は、上記の記述がないため…

予めデータの投入先となるデータベースを作成しておく必要があります。

###『全て』のデータベースをリストアする方法

~~~
mysql -u ユーザー名 -p < dumpファイル名
~~~

例えば・・・

- ユーザー名：&ensp;root
- dumpファイル：&ensp;/bak/mysqldump_sample.dump

という内容でバックアップしたい場合は、下記のようになります。

~~~
mysql -u root -p < /bak/mysqldump_sample.dump
~~~