オンプレミス環境でのmysqldumpを使った復元方法
オンプレミス環境でサービスを運用していると、予期せぬトラブルが発生することがあります。例えば、サービス開始40日目にサーバー障害や人為的ミスでMySQLデータベースが消失してしまった場合、どう対応すれば良いでしょうか?
mysqldumpを使用して定期的にバックアップを取得していれば、データの復元が可能です。ただし、バックアップが39日目のものまでしか存在しない場合、39日目の時点のデータまでしか復元できないという制約があります。
この記事では、mysqldumpを使ったバックアップの取得方法と、バックアップからデータを復元する手順を解説します。
1. データ消失!まず確認するべきこと
データが消失した場合、以下の状況を確認しましょう。
(1) サーバーとストレージの状態確認
サーバーが正常に動作しているか?
電源やOSの稼働状況を確認。
ストレージが破損していないか?
ディスクエラーやファイルシステムの状態を調査。
(2) バックアップの有無
mysqldumpを使用してバックアップが取得されているか。
今回の例では、「毎日24時にmysqldumpでバックアップを取得」という想定で進めます。
(3) データディレクトリの状況
MySQLのデータディレクトリ(通常は/var/lib/mysql)の状態を確認。
2. mysqldumpでデータをバックアップする方法
mysqldumpはMySQLデータベースのスナップショットを作成する便利なツールです。以下の手順でバックアップを取得できます。
ステップ 1: 全データベースをバックアップ
MySQLのすべてのデータベースをバックアップするには、以下のコマンドを使用します。
mysqldump -u root -p --all-databases > /backup/`date +\%Y\%m\%d`_backup.sql
--all-databases: 全てのデータベースをバックアップ。
/backup/: バックアップファイルの保存先ディレクトリ。
date +\%Y\%m\%d: バックアップファイル名に日付を付けて管理。
ステップ 2: 特定のデータベースをバックアップ
特定のデータベースのみをバックアップしたい場合は、以下のコマンドを使用します。
mysqldump -u root -p my_database > /backup/`date +\%Y\%m\%d`_my_database_backup.sql
my_database: バックアップ対象のデータベース名。
ステップ 3: 自動化
cronを利用してバックアップを毎日定期的に取得します。
0 0 * * * mysqldump -u root -p my_database > /backup/`date +\%Y\%m\%d`_my_database_backup.sql
これにより、毎日24時に最新のバックアップが保存されます。
3. mysqldumpを使った復元手順
mysqldumpで取得したバックアップファイルがある場合、以下の手順で復元できます。
ステップ 1: データベースの準備
新しいデータベースを作成します。
mysql -u root -p -e "CREATE DATABASE my_database;"
ステップ 2: バックアップファイルをインポート
mysqldumpで取得したSQLファイルをインポートします。
mysql -u root -p my_database < /backup/39日目のバックアップファイル.sql
ステップ 3: データの確認
正常に復元されたか確認します。
mysql -u root -p -e "SHOW TABLES FROM my_database;"
4. 復元可能なデータの範囲
mysqldumpのバックアップは指定した時点のデータのスナップショットを保存します。そのため、バックアップを毎日24時に取得していた場合、例えば40日目にデータが消失した場合でも39日目のデータまでしか復元できません。
失われるデータ
40日目の午前0時以降に発生したデータは復元できません。
例:
ユーザーが40日目の午前中に登録したデータ。
40日目の営業活動で追加されたトランザクション情報。
対応策
このようなデータ損失を最小限に抑えるには、以下の対策を講じることが重要です。
バイナリログを有効にして、mysqldumpのバックアップ時点から消失時点までのデータを再現。
mysqldump以外の増分バックアップツールを併用(例: Percona XtraBackup)。
5. mysqldump復元時の注意点
バックアップファイルの復元中に問題が発生することがあります。以下はその対処法です。
ケース 1: ファイルサイズが大きい場合
大規模データベースの場合、タイムアウトが発生することがあります。この場合、MySQLの設定を調整します。
mysql -u root -p
SET GLOBAL max_allowed_packet = 1073741824; -- 1GB
SET GLOBAL net_buffer_length = 1000000;
ケース 2: 権限エラーが発生する場合
復元先のデータベースにアクセス権がない場合、以下のコマンドで権限を付与します。
mysql -u root -p
GRANT ALL PRIVILEGES ON my_database.* TO 'user'@'localhost';
FLUSH PRIVILEGES;
6. バックアップ運用の改善ポイント
mysqldumpを使用したバックアップ運用を効率化するには、以下のポイントを押さえましょう。
(1) 複数の保存先を確保
バックアップファイルをオンプレミスサーバー以外にも外部ストレージやクラウドに保存します。
(2) 定期的な復元テスト
バックアップが実際に復元可能か、定期的にテストします。
(3) バイナリログの有効化
バイナリログを活用すると、mysqldumpで取得したバックアップ時点以降のデータを復元可能になります。
mysql -u root -p
SHOW VARIABLES LIKE 'log_bin';
まとめ
mysqldumpは、オンプレミス環境でのMySQLデータベースのバックアップと復元において非常に有用なツールです。ただし、スナップショットであるため、バックアップ時点以降のデータは復元できません。今回のように39日目のバックアップが最新の場合、40日目のデータは失われることになります。
データ損失のリスクを最小限に抑えるため、mysqldumpだけでなく、増分バックアップやバイナリログの活用、バックアップの冗長化を徹底しましょう。