jumper

コラム

バックアップとリカバリ

2019年05月14日
バックアップとリカバリ

MySQLに限らず、データベースの運用にはデータのバックアップとリカバリが必須です。物理的なストレージに格納されているデータは常に入出力が繰り返されているため、時々刻々と格納されている情報は変動します。

また、運用中に予期しない障害やエラーが起きることがあります。問題が発生した時のためにバックアップが必要になり、バックアップからデータをリカバリする必要があります。
データベースの実務上、その運用にあたってバックアップとリカバリは欠かせない知識といえます。

バックアップとリカバリの種類

バックアップとは文字通りデータの保存を意味しますが、対してリカバリとはバックアップしたものを復元することを指します。MySQLではバックアップおよびリカバリにはいくつかの種類があります。

バックアップの種類には大きく分けて物理バックアップと論理バックアップがあります。MySQLのデータベースはいくつかのディレクトリとファイルで構成されていますが、これをそのままコピーすることでバックアップとします。迅速に対応する必要があり、大規模なリカバリの場合に選択される方法です。

論理バックアップの場合はクエリーを使って情報とデータベース構造を別のファイルに出力します。ストレージに依存することなく、情報のみを保存し復元することが可能です。また、オンラインかオフラインでもバックアップの方法は変わってきます。オンラインバックアップとは、サーバーが起動中のバックアップになります。ホットバックアップともいいますが、サービスを止めることなく、クライアントにも負担をかけずにバックアップをとれます。

しかし、適切なロックなどに留意しなければ不完全なバックアップになる可能性もあり、運用には注意が必要です。オフラインバックアップはコールドバックアップとも呼ばれていますが、サーバーを完全にストップしてから行われます。

さらにバックアップ先の違いでも運用が変わってきます。ローカルバックアップでは、サーバーが起動しているホスト内に保存され、リモートバックアップでは別のホストがその役割を担います。

論理バックアップの中にはスナップショットという手法もとられます。ある時点でのファイルシステム全体を論理コピーするものです。ただ、MySQL自体にはスナップショットの機能はなく、VeritasやLVMなどの論理ボリュームが提供しています。いまやクラウドなどの仮想化技術が一般的になってきていますので、スナップショットも手軽に扱えるようになってきています。

最後にバックアップ内容の範囲での違いもあげておきます。バックアップおよびリカバリには、完全バックアップ・完全リカバリ、そして増分バックアップ・ポイントインタイムリカバリがあります。完全バックアップ・リカバリはある時点での全情報が保存され、増分バックアップ・リカバリはある期間内での変更された情報が保存されます。

完全の場合はバックアップデータの容量が大きくなり、実行時間も増分に比べて長くなります。完全と増分はその特性に合わせて使い方をよく検討してください。バックアップスケジュールや障害対応などの運用上のあり方に影響があります。

バックアップ方法

次に実際のバックアップ方法をみてみましょう。MySQLには上記のように様々バックアップの種類がありますが、その方法もいくつかあります。

・MySQL Enterprise Backupの利用
商用版では多種の便利な機能やツールが提供されていますが、MySQL Enterprise Backupの利用権利もそのひとつです。MySQL Enterprise Backupではホットバックアップで物理バックアップを、論理バックアップと比較しても高速で実行することができます。

・mysqldumpまたはmysqlhotcopyの利用
実務では比較的よく使われる方法のひとつです。特にmysqldumpはさまざまなテーブルを柔軟にバックアップできる、汎用性の高いプログラムです。

・テーブルファイルのコピー
MySQLのストレージには各種のファイルが存在します。それをコピーすることでバックアップファイルとすることができます。なお、バックアップを行う前にFLUSHコマンドでテーブルをロックする必要があります。

・テキストファイルの作成
txtやCSVなどの区切りテキストファイルでエクスポートし、出力ファイルをバックアップとすることです。テキストデータなのでホストやツールなどの特定の環境に依存せず、汎用性の高いバックアップ方法のひとつです。

・増分バックアップの作成
増分バックアップはバイナリログが有効でないと機能しませんが、バージョン8.0からバイナリログが初期状態で有効になっています。バイナリログが有効な場合、適切なログローテーションを施さなければなりませんので、バージョン8.0から始めている方はまずバイナリログの設定を調整してください。

・レプリケーション
レプリケーションとはMySQLの運用上必須の知識といえ、マスターをスレーブにレプリカ(複製)させる技術のことを指します。レプリケーションはバックアップとして活用することできます。マスターおよびスレーブの構成を戦略的に活用し、安全で柔軟なバックアップ体制を整えることができます。

mysqldumpの使用

mysqldumpでのバックアップとリカバリは多くのエンジニアが活用していますので、その情報も幅広く取得することができます。しかし、ここでもあらためてバックアップとリカバリをなぞってみます。

$ mysqldump [arguments] > バックアップファイル名

基本的には上記のコマンドでバックアップファイルを出力します。オプションを付けることでさらに柔軟に利用することが可能です。例えばすべての情報を取得するには--all-databases オプションを付与して実行します。テーブル毎にダンプすることも、あるいは逆に特定のテーブルを除外することもできます。また、文字化けが起こる場合は文字コードを設定することで回避する可能性もあります。バックアップファイルはSQLステートメント、またはその他のテキスト形式でのフォーマットでも作成できます。

リストア(復元)はmysqlクライアントへバックアップを入力することで実行できます。

$ mysql < バックアップファイル名

なお、CREATE DATABASE および USE ステートメントを含まないケースではデータベースを指定して実行する必要があります。

$ mysql データベース名 < バックアップファイル名

区切りテキストフォーマットでは.sqlファイルと.txtファイルの2種類のファイルが生成されますが、sqlはテーブル構造で、txtファイルがデータ本体です。この場合のリストアは、まずsqlを実行することで空のテーブルを作成し、続いてtxtファイルのデータを流し込む流れとなります。

$ mysql データベース名 < バックアップファイル.sql
$ mysqlimport データベース名 バックアップファイル.txt

なお、MySQL8からは以前のバージョンと相違点がいくつかあります。最初からMySQL8を活用している場合は問題ありませんが、バージョンをまたいでバックアップとリストアを行う際は注意が必要です。例えば認証方式やcolumn_statisticsがそれ以前とは変更されています。最新のバージョンにアップデートする際や、バージョンをまたいでバックアップ・リストアする際は、改めて情報を確認してください。

まとめ

MySQLのバックアップとそのリカバリは非常に重要な機能のひとつです。なによりも実務の上でのデータベース運用に欠かせない作業といえます。データベースの運用は、常に整合性・継続性が強く要求される分野ですので、障害時にも迅速な復旧が求められます。その点でもバックアップとリカバリのフローはしっかり定めておくことが望ましいのではないでしょうか。

また、現在運用しているMySQLが5.7以前であれば、8.0バージョンへのアップデートもいずれ検討することになります。その際はバージョンによる相違をよく比較し、情報も最新のものを取得してから実施するようにしてください。

CONTACT

製品・サービスに関するご質問、お見積もり、お問い合わせなど、お気軽にご連絡ください。

 050-5505-5509

受付時間 9:30 - 12:00, 13:00 - 17:00
(土日祝および年末年始を除く)