Webサイト制作コースのお申し込みはこちら Webサイト制作コースのお申し込みはこちら

MySQLで管理しているデータベースのバックアップに使われる、mysqldumpコマンドの使い方について解説します。なお、mysqldumpコマンドは、MySQLをインストールすると使えるようになるクライアントコマンドの一つで、ターミナルなどから実行できます。

mysqldumpを使ったバックアップとリストアの基本

MySQLが管理するデータベースにデータを格納すると、特殊なフォーマットのファイルを作成しますが、そのファイルをそのままコピーしたとしても、データベースを使って復旧したり、別のサーバーに移植したりはできません。MySQLでリストアできる形式でバックアップを作っておく必要があります。なお、バックアップを作る方法は幾つかありますが、よく利用されるのは専用個コマンドのmysqldumpです。

mysqldumpコマンドの詳細を解説する前に、このコマンドを使ったMySQLにおけるバックアップとリストアの基本を説明します。

SQL形式でファイルに書き出す

MySQLでは、データベースやテーブルを新規に作ったり、そこにデータを格納するのにSQLを使います。つまり、既にあるMySQLのデータは、それを作れるSQLさえ保存しておけば、いつでも作り直せる訳です。そして、mysqldumpコマンドは、MySQLに格納されたデータベースから、それを作るためのSQLをファイルに書き出すコマンドです。そのため、mysqldumpコマンドで作成されたSQLは、MySQLデータベースのバックアップに用いられます。

ただし、ファイルを単にコピーするのと違い、データベースを解析して、SQLというテキストファイルに変換してファイルに書き出していることから、処理に時間がかかります。特に大規模なデータは、途中、データの書き換えが発生すると、データの整合性が崩れるといった不具合も発生しかねません。そのため、MySQLで大規模なデータベースを管理している場合は、データの整合性が保証される有償のEnterprise サブスクリプションに含まれるコマンドの利用が推奨されています。

mysqldumpコマンドの実行方法

今回紹介するmysqldumpコマンドは、LinuxやmacOSならターミナルで、また、Windowsならコマンドプロンプトから実行します。なお、このコマンドは、ターミナルなどからキーボードから一文字ずつ打ち込んでも実行できますが、多くの場合はバッチファイル内に組み込み、時刻指定で実行されています。

また、mysqldumpコマンドにはたくさんのオプションが用意されているので、それらを組み合わせて、MySQLの実行環境に合わせたバックアップ処理が可能です。なお、そういったオプションは、時刻指定で実行するバッチファイルの中でもよく利用されています。

mysqldumpのオプション指定方法

$ mysqldump
Usage: mysqldump [OPTIONS] database [tables]
OR     mysqldump [OPTIONS] --databases [OPTIONS] DB1 [DB2 DB3...]
OR     mysqldump [OPTIONS] --all-databases [OPTIONS]
For more options, use mysqldump --help

上記にあるように、オプションの詳細は、mysqldumpコマンドに「–help」オプションを付けて実行することでも表示できます。

なおMySQLのデーモンが実行中のサーバーでバックアップする場合、通常、下記のように使用します。なお、オプションの使い方については、後から詳しく解説します。

$ mysqldump -uuser -ppasswd db1 > backup.sql

mysqldumpコマンドで書き出したファイルのリストア

mysqldumpコマンドで書き出したファイルはSQL形式のため、そのままMySQLのクライアントで実行させれば、元のデータベースを復元可能です。
backup.sqlをリストアするコマンドの例

> mysql -uuser -ppassword < backup.sql

なお、mysqlコマンドで指定するアカウントには、リストアで生成されるデータベースに対する権限が必要です。そのため、リストアする前にMySQLの基本的な設定を完了させてから実行してください。また、この処理はSQLを解析してデータベースを作っているので、データベースが大きい場合はかなり時間が
かかるものだと考えてください。

mysqldumpコマンドのオプションは数が多い

先ほど、mysqldumpコマンドの実行方法を簡単に紹介しましたが、このコマンドにはたくさんのオプションが用意されており、–helpオプションで表示されるメッセージだけでは、どう使えば良いかが解りません。予め、下記のマニュアルサイトなどでオプションの機能をチェックしておくようにしましょう。

MySQL :: MySQL 5.6 リファレンスマニュアル :: 12.5 文字列関数

次から、たくさんあるオプションの中から、注目してほしいオプションについて紹介します。

最低限必要なアカウントの指定

MySQLで管理しているデータベースにアクセスするために、最低限必要となるのがアカウントです。そして通常は、-u オプションでアカウント名、そして、-pオプションでパスワードを指定します。

mysqldumpの基本の構文
mysqldump -u[ユーザ名] -p[パスワード] データベース名 > 保存先のファイル名

次の例は、アカウント名がuser、パスワードがpasswordというアカウントで、db1というデータベースをbackup.sqlというファイルに書き出す例です。

db1のバックアップ実行例

$ mysqldump -u user -p password db1 > backup.sql

また、データベース全体をバックアップするには、データベース名ではなく、–all-databases オプションを指定します。

データベース全体のバックアップ実行例

$ mysqldump -u user -p password --all-databases > backup.sql

このようにデータベース全体をバックアップするとかなり時間がかかることから、サービスが動作中の場合は、バックアップ中にデータが変更され、データベースの整合性が失われる可能性があります。そのため、バックアップ中は、サービスを停止したり、次に解説する整合性を保つためのオプションを追加して使います。

整合性を保つオプション

Webサービスで利用しているデータベースなど、24時間サービスを提供しているシステムでは、バックアップするからといってサービスを停める訳にはいきません。しかし、バックアップ中にデータベースが書き換わってしまうと、データベースの整合性が失われてしまい、リストアできなくなります。そのため、通常、mysqldumpコマンドを使ってバックアップするためには、整合性を保つためのオプションを指定します。なお、整合性を保つためのオプションは、–single-transactionと–lock-all-tablesの2つです。

整合性を保つオプション
mysqldump –single-transaction -uユーザ名 -pパスワード データベース名 データベース名

mysqldump –lock-all-tables -uユーザ名 -pパスワード データベース名 -A

2つあるのオプションの一つ目の–single-transactionオプションは、バックアップ中の整合性を補償するオプションで、データベースを指定してバックアップする際に使われます。

整合性を考慮した個別バックアップの実行例

$ mysqldump --single-transaction -u user -p password db1 > backup.sql

一方、–lock-all-tablesは、全てのテーブルにロックをかけて読み書きできなくする機能です。そのため、全てのデータベースを対象とするオプションの-Aといっしょに使われます。なお、このオプションを指定してバックアップを実行する場合は、Webサービスも制限を受けるので、エラーにならないような工夫が必要です。

整合性を考慮した全体バックアップの実行例

$ mysqldump --lock-all-tables -u user -p password -A > backup.sql

リモートで実行するためのオプション

データベース専用のサーバーを設定しているため、バックアップをネットワークを介して別のサーバーから実行するケースもあります。そのような場合でも、mysqldumpの利用が可能です。それは、mysqldumpには、MySQLが稼動しているホスト名を指定するオプションが用意されているからです。

mysqldumpのホスト名を指定するオプション

mysql -uユーザー名 -pパスワード -h ホスト名

なお、-h オプションを省略すると、mysqldumpを実行したホストのMySQLが対象になります。また、ホスト名のほかに、iPアドレスを指定することも可能です。さらに、セキュリティ対策として、MySQLにアクセスするポートをデフォルトから変更している場合でも、–port オプションまたは-Pオプションでポート番号を指定できます。

このほかに、ネットワークを介して実行する場合、経路の途中でデータベースの内容を読み取られる可能性があるため、機密性の高いデータを扱う場合、SSLで暗号化する-sslオプションもあります。なお、SSLの使用については、MySQLのサーバー側の設定が必要です。暗号化して通信する場合は、必ずサーバー管理者と
相談してください。

リモートでバックアップする例

$ mysqldump --lock-all-tables -uuser -ppassword -h mysql.hosstname -P 13306 -ssl db1 > backup.sql

mysqldumpの使用例

先ほどもご紹介したようにmysqldumpは、人がターミナルで打ち込んで実行するよりも、バッチファイルに組み込んで時刻指定で実行されるコマンドです。次から、そういったmysqldumpを使ったバックアップ用途での使用例をご紹介します。

データを圧縮して転送する方法

mysqldumpを使ってリモートでバックアップを取る際、大量のデータがネットワークに流れることで、通信に遅延が生じ、バックアップに時間がかかったり、レスポンスが悪くなるなどサービスに影響することもあります。その場合、データを圧縮して転送すれば改善しますが、mysqldumpにはデータを圧縮する機能はありません。そこで、よく使われるのが、Linuxのシェルの機能とgzipなどの圧縮コマンドを組み合わせた使い方です。

具体的には、シェルのパイプ機能を使い、mysqldumpの出力を圧縮して、さらにsshコマンドでリモート保存先のサーバーに転送する方法です。

バックアップデータを圧縮して転送する例

mysqldump --lock-all-tables -u user -p password db1 | gzip | ssh backuphost 'zcat > /saved/backup.sql'

この例では、Linuxの圧縮コマンドのgzipと、暗号化してリモート転送するssh、さらに、gzipの圧縮を解凍するzcatを使っています。もちろん他のコマンドを組み合わせても実現でき、Windowsサーバーでも実現可能です。

処理の結果をメールで通知するには

時刻指定でMySQLのデータをバックアップする方法では、自動で実行するから人は何もしなくても良い、という訳ではありません。もし、処理が正常に終了しなかった場合は、原因を調べて正常に動作するように修復する必要があります。そこで、mysqldumpの処理結果を判断し、もし、不具合が発生していたらメールなどで管理者に知らせる処理を組み込むのが一般的です。やり方はいろいろありますが、シェルで組む方法が簡単なので、その例をご紹介します。

#!/bin/bash
echo "mysqldump execute Start"
mysqldump --single-transaction --user=www --password=www-www wordpress > log
if [ $? = 0 ]; then
	echo "Backup success"
else
	echo "Error !!"
fi

mysqldumpは、処理に成功した場合に0を、また、失敗した場合にその理由に対応した1や2といった数字を返します。上の例ではコマンド実行後の戻り値を使って、if文で分岐し、成功した場合のメッセージを、または失敗した場合はエラーメッセージを標準出力に表示します。

MySQLを管理するならmysqldumpをマスターしよう

MySQLに限らず、データベースのバックアップは重要です。何かがあった後では遅いので、確実にバックアップする仕組みを作りましょう。そして、MySQLでバックアップする仕組みを作るのに使われるのが、これまで紹介したmysqldumpです。MySQLを管理する立場の方は、このコマンドを使い方をマスターしましょう。

エンジニアになりたい人に選ばれるプログラミングスクール「ポテパンキャンプ 」

ポテパンキャンプは卒業生の多くがWebエンジニアとして活躍している実践型プログラミングスクールです。 1000名以上が受講しており、その多くが上場企業、ベンチャー企業のWebエンジニアとして活躍しています。

基礎的な学習だけで満足せず、実際にプログラミングを覚えて実践で使えるレベルまで学習したいという方に人気です。 プログラミングを学習し実践で使うには様々な要素が必要です。

それがマルっと詰まっているポテパンキャンプでプログラミングを学習してみませんか?

卒業生の多くがWebエンジニアとして活躍

卒業生の多くがWeb企業で活躍しております。
実践的なカリキュラムをこなしているからこそ現場でも戦力となっております。
活躍する卒業生のインタビューもございますので是非御覧ください。

経験豊富なエンジニア陣が直接指導

実践的なカリキュラムと経験豊富なエンジニアが直接指導にあたります。
有名企業のエンジニアも多数在籍し品質高いWebアプリケーションを作れるようサポートします。

満足度高くコスパの高いプログラミングスクール「ポテパンキャンプ」

運営する株式会社ポテパンは10,000人以上のエンジニアのキャリアサポートを行ってきております。
そのノウハウを活かして実践的なカリキュラムを随時アップデートしております。

代表の宮崎もプログラミングを覚えサイトを作りポテパンを創業しました。
本気でプログラミングを身につけたいという方にコスパ良く受講していただきたいと思っておりますので、気になる方はぜひスクール詳細をのぞいてくださいませ。