【SQL実践|実務向け】【DBAの実務】GUIに頼らない!MySQLの堅牢なバックアップ運用術

導入

データベース管理者にとって、バックアップは「保険」ではなく「生命線」です。phpMyAdminなどのGUIツールは手軽ですが、本番環境のデータ量が増加すると、タイムアウトやメモリ不足でエクスポートに失敗することがあります。実務現場では、コマンドラインによる自動化と整合性の確保が必須要件です。本稿では、mysqldumpを用いた信頼性の高いバックアップ手法を解説します。

基礎知識

MySQLのバックアップには、主に「論理バックアップ」と「物理バックアップ」があります。
論理バックアップは、SQL形式(INSERT文など)でデータを出力する方法です。mysqldumpコマンドがこれに該当します。データの可搬性が高く、特定のテーブルのみを復元できるのが利点ですが、データ量に比例して実行時間が長くなる傾向があります。
整合性を保つためには、実行時のデータ書き込みを一時的に停止または静止させる必要があり、InnoDBエンジンを利用している場合は「–single-transaction」オプションの使用が重要です。

実装/解決策

実務で推奨されるのは、cronによる自動化と、バックアップファイルへのタイムスタンプ付与です。これにより、万が一の障害発生時に「どの時点のデータに戻すべきか」を即座に判断できます。また、出力ファイルを圧縮することでディスク容量を節約し、転送時間を短縮させます。

サンプルプログラム

以下のシェルスクリプトは、単一のデータベースをバックアップし、過去7日分を残して古いファイルを削除する実用的な構成です。

!/bin/bash

設定項目
DB_NAME=”my_database”
BACKUP_DIR=”/var/backups/mysql”
DATE=$(date +%Y%m%d_%H%M%S)
FILE_NAME=”${BACKUP_DIR}/${DB_NAME}_${DATE}.sql.gz”

バックアップ実行
–single-transaction: トランザクション分離レベルを設定し、整合性を保つ
–routines: ストアドプロシージャや関数もバックアップ対象にする
gzip: パイプで渡して圧縮しながら保存
mysqldump -u root -p’password’ –single-transaction –routines ${DB_NAME} | gzip > ${FILE_NAME}

成功確認
if [ $? -eq 0 ]; then
echo “バックアップ成功: ${FILE_NAME}”
else
echo “バックアップ失敗”
exit 1
fi

7日以上前のバックアップファイルを削除
find ${BACKUP_DIR} -name “${DB_NAME}_.sql.gz” -mtime +7 -exec rm {} \;

応用・注意点

現場で陥りやすい失敗の筆頭は「バックアップしたつもりになっている」ことです。以下の点に注意してください。

1. リストアテストの実施: バックアップは「書き込めたこと」ではなく「正しく復元できること」が証明されて初めて価値を持ちます。定期的に別環境へのリストア手順を確認してください。
2. 権限の最小化: mysqldump実行専用のユーザーを作成し、必要最小限の権限(SELECT, LOCK TABLES, SHOW VIEWなど)のみを付与してください。rootユーザーをスクリプトに直書きするのはセキュリティリスクが高いため避けましょう。
3. バイナリログの活用: mysqldumpは「ある時点」の静止点しか保存できません。より高度な復旧を目指すなら、バイナリログの有効化(Point-in-Time Recovery)を検討し、ダンプ後の増分データを補完できるようにしておくのがDBAの定石です。

コメント

タイトルとURLをコピーしました