SQLデータベースを使う場合、そのバックアップ対策が重要です。特に、24時間稼働のWebシステムでは、どうやってシステムを止めずに安全にバックアップするかを検討しなければなりません。
今回は、SQLが使えるデータベース管理ソフトが扱うデータのバックアップ方法について解説します。
データベースのバックアップは必要?
従来の企業毎のデータセンターで稼働しているデータベースの全てで、何らかのバックアップの仕組みが備えられていました。
これはシステムが稼働していれば、個々のサーバーが故障するかもしれないし、事故や災害でデータセンターそのものが停止する可能性も否定できません。
そのため、情報システムのバックアップは、必須と考えられていました。
しかし、最近のクラウド上で稼働しているデータベースは、冗長化が徹底されており、事故や災害でデータセンターが稼働できなくなっても、別のデータセンターがバックアップすることで、運用を止めずに済むようになっています。
そのため、クラウドに移行したので、バックアップは不要、と考えている方もいるようです。
しかし、人が操作を間違えてデータベースに格納されているデータを破壊してしまう危険は、今の時代でもあります。
バックアップからシステムを復旧する手段を用意していない情報システムを使い続けることは、クラウドの時代になっても大きなリスクを抱えていることに変わりません。
SQLデータベースの仕事をされるエンジニアなら、ぜひ、バックアップの重要性を理解し、データベースのバックアップの仕方について知っておきましょう。
次から、データベースのバックアップの基本について解説します。
物理バックアップと論理バックアップ
データベースのバックアップには、物理バックアップと論理バックアップの2つの考え方があります。まずは、この2つの方法の概略について解説します。
データベースにおける物理バックアップ
OracleやMySQLなどのデータベース管理ソフトは、効率良くデータを取り出せる専用のファイルを作り、そこにデータを格納しています。
そして、そのようなデータベース管理ソフトがアクセスする全てのファイルを、別の領域にコピーする方法が、物理バックアップです。
なお、物理バックアップは、データベース管理ソフトを一旦停止し、全ての情報をファイルに書き込んだ状態で実施します。
そのため、物理バックアップ中、このデータベースを使った情報システムは利用できません。
そのかわり、完全なバックアップを作ることが可能です。また、ファイルをそのままバックアップすることで、バックアップにかかる時間も短縮できます。
データベースにおける論理バックアップ
論理バックアップは、データベース管理ソフトの外部出力機能を使って行うバックアップ方法です。
大抵は、そのままインポートしてデータベースを復活できるダンプ形式でバックアップを作成しますが、CSVファイルなどの別のアプリで利用できるテキストファイルに変換して出力することも可能です。
なお、この方法のメリットは、データベース管理ソフトを稼働した状態でバックアップできる点です。
ただし、バックアップ中にデータベースが更新されると、バックアップされたデータの整合性が崩れる危険があるため、データベースロックを活用するなどの対策が必要です。
また、格納されているデータのサイズによっては、かなり時間がかかることから、特定の時刻の状態でバックアップイメージを作成し、それをファイルに書き出してバックアップとする、といった技術も使われます。
どちらが有利か
物理バックアップと論理バックアップのどちらを使うかは、そのデータベースを使った情報システムによるので、どちらが有利とは言えません。
なお、それぞれで、データを復旧する方法が異なるので、緊急時にどうやって復旧するかを予め決めておき、それを前提にシステムを構築するのが一般的です。
物理バックアップのやり方
物理バックアップでは、エンタープライズ向けのバックアップソフトがよく使われます。
これは、物理バックアップとは、単にファイルのコピーを作れば良い、という訳ではなく、決まった時刻に、確実にバックアップが取れなければならないからです。
また、メールなどでバックアップ状況をレポートしたり、確実に復旧するための手段としてもバックアップソフトが使われます。
なお、確実性には劣りますが、Linuxコマンドを組み合わせて、バックアップを実施することも可能です。
CentOSの標準コマンドで実施する例
次に、クラウドでも使われることの多いCentOSで、MySQLと互換性のあるmariadbの物理バックアップを実施する場合の例を紹介します。
まず、CentOSの標準アプリであるmariadbのデータは、/var/lib/mysqlの下に作成されるので、これがバックアップの対象です。
そして、下記の例では/mnt/backupの下に、バックアップした日付のディレクトリを作成し、その下にコピーします。そして、コピーが終了したら、前日のバックアップを削除しています。
なお、下記の例では同じサーバー内でのコピーなので、tarコマンドを使ってコピーしていますが、別のサーバーにコピーする場合はrsyncコマンドを使います。
#!/usr/bin/bash NEWDIR=`date +%Y%m%d` OLDDIR=`date --date '1 day ago' "+%Y%m%d"` DIST="/var/lib/mysql TARGET="/mnt/backup" mkdir $[TARGET]/$[NEWDIR] (cd $[DIST]; tar cvf - * ) | (cd $[TARGET]/$[NEWDIR]; tar xvf - ) if [ $? != 0 ];then echo "エラーが発生しました" else rm -rf $[TARGET]/$[OLDDIR] echo "バックアップが終了しました" fi
論理バックアップのやり方
データベース管理ソフトを動かした状態で実行する論理バックアップでは、それぞれのクライアントコマンドやバックアップ専用コマンドを使います。
そして、バッチファイルにそのコマンドを記述し、指定時刻にそれを実行してバックアップするのが一般的です。
次から、このような論理バックアップの基本について紹介します。
稼働中のデータベースのバックアップは難しい
論理バックアップは、データベース管理ソフトが稼働した状態でバックアップすることから、24時間稼働が前提のWebシステムのデータのバックアップが可能です。
しかし、バックアップ中にデータが更新されてしまうと、データの整合性が崩れてしまい、壊れたデータがバックアップされることもあります。
そのため、整合性が保たれた状態でバックアップするための機能を活用しなければなりません。
SQLを使うデータベース管理ソフトでは、ロック機能があり、更新処理中は、同時に更新されないような仕組みが使われます。
しかし、長い時間のかかるバックアップ中にロックをかけてしまうと、Webシステムのレスポンスが悪くなるなどの支障が出ます。
そのため、ある時刻の整合性の取れた状態のデータであるスナップショットを作成して、それをバックアップします。
なお、このスナップアップを作成する方法は、データベース管理ソフトによってやり方が違います。システムで使用するデータベース管理ソフトに合わせて、バックアップの方法を検討しておきましょう。
MySQLを使った場合の論理バックアップの例
オープンソースのデータベース管理ソフトとして利用者の多いMySQL、および互換性のあるmariadbでは、バックアップ専用コマンドのmysqldumpを使います。
なお、mysqldumpのオプションは、このコマンドを解説したWebページを参照してください。
MySQL :: MySQL 5.6 リファレンスマニュアル :: 4.5.4 mysqldump — データベースバックアッププログラム
次に、mysqldumpを使って全てのデータベースをバックアップする場合の実行例を紹介します。なお、システムを停止せずにバックアップを取るために、シングルトランザクションオプションを使用します。
基本的なmysqldumpの使い方
/usr/bin/mysqldump -uユーザー名 -pパスワード –single-transaction-A > バックアップファイル名
PostgreSQLを使った場合の論理バックアップの例
オープンソースのデータベース管理ソフトのPostgreSQLには、全てのデータをバックアップする専用コマンドとして、pg_dumpallが用意されています。
このコマンドもオプションの数が多いので、オプションを解説しているWebページを参照してください。
なお、pg_dumpallと個別のデータベース単位でバックアップができるpg_dumpコマンドで作成されたバックアップファイルは、コマンドが実行された時点のデータベースのスナップショットが保存されます。次に、pg_dumpallの簡単な使い方を紹介します。
/usr/bin/pg_dumpall -U ユーザー名 -W パスワード > バックアップファイル名
大規模なデータベースのバックアップ
Oracle databaseなどのエンタープライズ用途のデータベースでは、扱うデータが大きすぎて、先ほど紹介したMySQLやPostgreSQLのような簡単なバックアップでは、うまくいかないこともあります。
そのため、より複雑なバックアップ方法が採用されていることもあります。
例えば、別にSQLサーバーを用意し、そのサーバーとミラーリングしてデータのコピーを作り、そのサーバーでバックアップと取ることで、本番環境を稼働させた状態で、大容量のデータでも負荷をかけずにバックアップが可能です。
まとめ
SQLが使えるデータベースのバックアップ方法として、物理バックアップと論理バックアップを紹介しました。Webシステムでは、バックアップのためにシステムを停止できないケースがほとんどです。
なお、完全なバックアップが必要な場合は、物理バックアップを検討してください。また、Webシステムなど、24時間稼働が前提のシステムでは、論理バックアップをうまく活用しましょう。
そして、論理バックアップでは、時間がかかるバックアップ中にデータが書き換わった場合、バックアップデータの整合性を保つ対策が必要です。
そのため、大規模なデータベースを使うシステムでは、複雑な仕組みを組んで対応しているケースもあります。ぜひ、そういったより高度なバックアップ方法も学んでください。