【MySQL入門】データベースをdumpする!不測の事態に備えよう

皆さんMySQL使ってますか?いきなりですが今回はdumpについてお伝えしていきます。dumpというと、クエリを学んでいる真っ最中の方からは縁遠く、もしかしたらはじめて聞いた、なんて方もいるかも知れません。

ですが、データベースをdumpしておくことは長い目でみたときにとても重要な作業なのです。そんな縁の下の力持ちなdumpについて、さっくりと学んでいきましょう!

dumpとはなんなのか

では、まずはdumpとはなにかを理解するところから始めましょう。冒頭からdump、dumpと言ってきましたが、dump(ダンプ)とは、要するにバックアップのことです。

バックアップといえば、皆さんもPCやスマホで馴染みがあるのではないでしょうか。バックアップとは、データを別のところに保管しておくことを言います。そして、なにかアクシデントが起こったときにそのバックアップからデータを復元するわけですね。

ちなみにこの復元作業をリストアといいます。PCやスマホでも不測の事態に備えてバックアップは重要ですが、データベースではその重要性がより高いのです。

データベースは様々なデータを保管しておく場所です。そのデータは一度無くなってしまえば二度と元に戻せないような重要なものかもしれません。

また、多くの人にとって重要なものかもしれません。つまり、PCやスマホと違って、不測の事態が起こったときに与える影響の範囲が非常に大きく、深刻なものになりかねないので、データベースのdumpは重要なのです。

また、データベースは常に稼働し続けていることが求められる場合もあります。このようなデータベースでは、仮にアクシデントでデータベースが1つ使えなくなったとしても、予備のデータベースを動かしながら、元のデータベースを全速力で復旧していきます。

その際に使うのが、今回紹介するdumpデータなのです。なんとなくでもdumpデータの重要性を感じることができましたか?

基本的なdumpの方法

この章では基本的なdumpの方法を紹介していきます。方法の紹介に入る前に注意点を1つだけ。MySQLのdumpには「mysqldump」という専用のツールを使います。

このツールはMySQLの外側で動かすツールです。どういうことかというと、多くの方はMySQLを使う時、MySQLサーバに次のようなコマンドでログインしているはずです。

Windowsの場合はMySQL Command Line Clientを使ってログインしている方も多いかもしれません。mysqldumpはMySQLのログイン後に動かすツールではありません。ログインコマンドの前、コマンドラインの段階で利用するツールです。

そのため、MySQLの文末につけるデリミタ(;)も不要です。お気をつけください。それではあらためて、基本的なdump方法を見ていきましょう。先程登場したmysqldumpを使っていきます。

書式

mysqldump -u ユーザー名 -p データベース名 > 出力ファイル名

MySQLへのログインコマンドに似ていますね。これを実際に動かしてみましょう。今回は手元にあったcase_dbというデータベースをdumpします。データベースの構造は次のようになります。

dumpのためのコマンドは次のようになります。

実行結果

出力されたdumpファイルの中身は普通のテキストファイルなので、テキストエディタで見ることができます。色々と情報が記入してあり、読み辛いですが、よくよくみると、CREATE TABLEINSERT INTOといった見慣れたSQL文を見つけることができます。

ここで種明かしをすると、dumpファイルとは元のデータベースにあったテーブルを作り直すためのコマンドが記載してあるファイルのことだったのです。

dumpは指定されたデータベース内のテーブルと同じものを作るためのコマンドをdumpファイルに出力する行為、とも言えますね。

そのため、テーブル数が多ければCREATE TABLEの数が膨大になりますし、レコードの数が多ければINSERT INTOのデータがすごいことになることは想像できるでしょう。

実際、1GB程度のデータベースのdumpであればそこまで時間はかかりませんが、20,30GB程度になってくると、30分程度はかかるようになってきます。そこで発生するのが整合性の問題です。

つまり、常時運用しているデータベースではdumpをはじめたタイミングとdumpを終了したタイミングではデータベースの内容が書き換わってしまっていることがあるため、dumpファイルとデータベースで不整合が生じる可能性があるのです。

これを防ぐには、手っ取り早い方法としてdumpを行っている間データベースをロックしてしまう、つまり、内容の変更を許さない状態にする、というものがあります。

ですが、これは常時運用しているデータベースではあまりに乱暴です。dumpの間、データベースが実質使用不能なのですから、問題しかありません。ではどうするかというと、簡単な解決策の一つに–single-transactionオプションの利用があります。

これはトランザクションを利用することで、データの整合性を保証してくれるオプションです。とても便利なものなので、dumpを使う際はぜひ利用しましょう。mysqldumpには他にも様々なオプション、利用方法があります。

テーブル単体をバックアップしたり、MySQL管理下にある全てのデータベースをバックアップしたり、dumpのメモリ消費を抑えるオプションや特定のデータベースをdumpしないオプションもあります。

非常に細かくオプションや利用法が設定されているので、細かなバックアップ方法が知りたい方はぜひ公式リファレンスを参照しましょう。

MySQL :: MySQL 5.6 リファレンスマニュアル :: 4.5.4 mysqldump — データベースバックアッププログラム

ファイルをリストアする方法

それでは、最後にdumpしたファイルをリストアする方法を紹介します。dumpファイルを見てもらうとわかりますが、dumpファイルにはデータベースを作るクエリは含まれていません。

データベースはユーザー側で用意してあげて、その中身をリストアしていきます。データベースの準備は忘れないようにしましょう。この性質のため、もとのデータベース名と新しくリストアするデータベース名が同じである必要はありません。

実際にデータベースをリストアしながら確認してみましょう。まず、MySQL内部でリストアするためのデータベースを作っておきます。

MySQLからログアウトして、そこからリストアを行っていきます。リストアに使うのは、いつも利用しているmysqlです。

リストアの書式

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

先程つくったdumpファイルからリストアしてみます。

上手くいった場合、何も表示は出ません。実際にリストアされているのか、MySQLにログインして確かめてみましょう。

たしかに、同じテーブルが再現されていますね。

まとめ

いかがでしたか?今回はdumpについて、必要性から基礎的な使い方、リストア方法までをみてきました。dump自体はSQLに含まれているものではなく、バックアップということでどうしても地味に感じてしまうのも致し方ありません。

ですが、データベースの安定的な運用には欠かすことのできない重要な要素であることは納得していただけたのではないかと思います。

dumpも含めたデータベースのバックアップと上手く付き合い、堅牢性の高いデータベース運営をできるよう頑張っていきましょう。この記事が皆様のMySQL学習の一助となれば幸いです。

LINEで送る
Pocket

最短でエンジニアを目指すなら侍エンジニア塾

cta_under_bnr

侍エンジニア塾は業界で初めてマンツーマンレッスンを始めたプログラミングスクールです。これまでの指導実績は16,000名を超え、未経験から数多くのエンジニアを輩出しています。

あなたの目的に合わせてカリキュラムを作成し、現役エンジニア講師が専属であなたの学習をサポートするため効率よく学習を進めることができますよ。

無理な勧誘などは一切ありません。まずは無料体験レッスンを受講ください。

無料体験レッスンの詳細はこちら

書いた人

平山 晃

平山 晃

フリーのエンジニア・ライター。
プログラミング、ライティング、マーケティングなど、あらゆる手段を駆使して、
ハッピーなフルリモートワーカーを目指し中。

最近興味がある分野は深層強化学習。
積みゲー、積ん読がどんどん増加しているのがここ数年の悩み。
実は侍エンジニア塾の卒業生だったりします。

おすすめコンテンツ

あなたにぴったりなプログラミング学習プランを無料で診断!

プログラミング学習の効率を劇的に上げる学習メソッドを解説