はじめに
私は1年以上稼働しているシステムを運用しているエンジニアです。
データベース(以下DB)のバックアップをとりたい!でも手順が多くてめんどくさい!ということありますよね。
そこで今回はDBダンプを取得するシェルを作成したので紹介します。
こんな人に読んでほしい
- システムを運用している
- データベースのバックアップをとりたい
- MySQLを使っている
- シェルを使いたい
目次
- なぜシェルを作るのか
- なぜダンプなのか
- シェル概要
- 前提条件
- シェル使用方法
- まとめ
なぜシェルを作るのか
システムの運用をしていると「その時々の本番環境と同様の環境を用意したい」「何かDBに変更を加える前にバックアップを取りたい」などが発生します。
いくら手順化していても「手動操作によるミス」「順番を飛ばす」などのリスクがあります。
そこで「誰でも」「簡単に」「誤りなく」DBバックアップを取る方法のひとつとしてシェルを作成しました。
なぜダンプなのか
DBのバックアップを取る方法はいくつかありますが、今回ダンプにした理由についてスナップショットとの違いをもとに記載します。
バックアップ手法 | メリット | デメリット |
---|---|---|
ダンプ(フルバックアップ) | 元データが消失しても復元可能 | 取得時間が長い |
スナップショット(差分バックアップ) | 取得時間が短い | 元データが消失すると復元不可能 |
上記に挙げた以外にも違いはありますが、私がバックアップを取得する際には「すべてのデータに影響をきたす可能性がある作業」をしなければならないためダンプを取っています。
細かい違いや他のバックアップ手法については皆さんで調べてみてください。
シェル概要
このシェルでは大きく2つの処理を実行しています。
- DBダンプファイルの取得
- ダンプファイルの圧縮
前提条件
このシェルを使用するにあたって、以下環境を用意する必要があります。
- OS:Linux
- DBMS:MySQL
- ツール:gzip
シェル使用方法
シェルを叩く前に、以下手順を実行してください。
- ファイル内の
{}
をみなさんの環境に合わせて変更 - 変更後のファイルを任意のディレクトリに配置
- ファイルへ実行権限の付与
chmod +x mysql_db_dump.sh
上記手順が完了したら、あとは以下コマンドを実行してください。
bash mysql_db_dump.sh
#!/usr/bin/bash
# Mysqlデータベースのダンプファイル取得&圧縮をするスクリプト
#
# 【使い方】
# (1) 権限付与
# chmod +x mysql_db_dump.sh
# (2) スクリプト実行
# bash mysql_db_dump.sh
# (3) ダンプファイル名入力
# 20240101_dump.sql
# (4) パスワード入力
# XXXXXXXX
# (5) 作成完了
# mysqlのインストール有無判定
if ! command -v mysql &> /dev/null; then
echo "mysql がインストールされていません。"
exit
fi
# gzipのインストール有無判定
if ! command -v gzip &> /dev/null; then
echo "gzip がインストールされていません。"
exit
fi
# ダンプファイル名入力
while true; do
read -p "ファイル名を入力してください(例 20240101_dump.sql): " filename
if [[ $filename == *".sql" ]]; then
break
else
# 末尾に.sqlがない場合、再度ファイル名入力
echo "末尾に .sql が含まれていません。再度ファイル名を入力してください。"
fi
done
# ダンプファイル作成
echo "パスワードを入力してください。"
mysqldump --set-gtid-purged=OFF -h {ホスト名} -u {ユーザー名} --port {ポート番号} -p {データベース名} > "${filename}.gz"
# ダンプファイル作成処理の終了ステータス判定
if [ $? -eq 0 ]; then
echo "mysqldumpが成功しました。"
# ダンプファイル圧縮
gzip "$filename"
echo "ファイルの圧縮に成功しました。"
else
# 不要に作成されるファイルの削除
rm "$filename"
echo "mysqldumpが失敗しました。パスワードに誤りがないか確認してください。"
fi
今回は各コマンドの詳細については省略します。
mysqldumpコマンドのオプションについてはMySQL 8.0 リファレンスマニュアルを参考になさってください。
まとめ
今回はDBへ影響を与える作業へのリスクを軽減するためにシェルを作りました。
本番環境と検証環境で取得するDBを分岐する、取得後のファイルをどこかへ送信するなど、みなさんのお好きなようにカスタマイズして何かしらに活用いただければ幸いです。
ここまで読んでくださりありがとうございました!