サーバー関連
MySQLのテーブル単位でのバックアップを一括で行う
ヤス
更新日:2021/08/05
データのバックアップは重要です。
【動作検証環境】OS:ubuntu server
MySQLのバックアップをテーブル単位で保管したい
データベースのバックアップはいざというときのリストアのためにも非常に重要です。
しかしデータの規模が大きくなると、リストアの際に時間がかかるようになってしまいます。
特定のテーブルだけ早急にリストアしたい場合などに、データ規模が大きいと時間がかかってしまうので、一括でバックアップをテーブル単位で行うようにシェルスクリプトを作成しました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
#!/bin/sh #--データベースバックアップ用(テーブル単位)-- #--config-- #DBユーザー名 DB_USER=ユーザー名 #DBパスワード DB_PW=パスワード #DBサーバー DB_SERVER=localhost #バックアップファイル保持期間(日数) KEEPDAY=7 #バックアップファイル保存場所 SAVE_DIR=保存場所 #今日の日付 TODAY=`date +'%Y%m%d'` #MySQL用パス PATH=/bin:/usr/bin:/usr/local/bin #--データベース名取得-- echo "SHOW DATABASES;" > ${SAVE_DIR}GetDataBaseList.sql mysql -u ${DB_USER} -p${DB_PW} < ${SAVE_DIR}GetDataBaseList.sql > ${SAVE_DIR}GetDataBaseList.txt rm ${SAVE_DIR}GetDataBaseList.sql sed -e '1,1d' ${SAVE_DIR}GetDataBaseList.txt > ${SAVE_DIR}DataBaseList.txt rm ${SAVE_DIR}GetDataBaseList.txt #--データベース単位で処理-- cat ${SAVE_DIR}DataBaseList.txt | while read DB_NAME do #--データベース名でディレクトリ作成-- BK_DIR=${SAVE_DIR}/${DB_NAME} mkdir -p ${BK_DIR} #--テーブル名取得-- echo "SHOW TABLES FROM `${DB_NAME}`;" > ${SAVE_DIR}GetTableList.sql mysql -u ${DB_USER} -p${DB_PW} < ${SAVE_DIR}GetTableList.sql > ${SAVE_DIR}GetTableList.txt rm ${SAVE_DIR}GetTableList.sql sed -e '1,1d' ${SAVE_DIR}GetTableList.txt > ${SAVE_DIR}TableList.txt rm ${SAVE_DIR}GetTableList.txt #--テーブル単位で処理-- cat ${SAVE_DIR}TableList.txt | while read TABLE_NAME do #バックアップファイル名 BK_FILE=${BK_DIR}/bak_db_${DB_NAME}_${TABLE_NAME}_${TODAY}.sql #当日日付のデータがあれば削除 rm -f ${BK_FILE} #--データベースのバックアップ-- mysqldump -Q -R --host=${DB_SERVER} --user=${DB_USER} --password=${DB_PW} --single-transaction ${DB_NAME} ${TABLE_NAME} > ${BK_FILE} gzip -9 ${BK_FILE} #保持期間を過ぎたバックアップファイルの削除-- find ${BK_DIR}/ -mtime +${KEEPDAY} -name "*.sql.gz" | xargs rm -f done rm ${SAVE_DIR}TableList.txt done rm ${SAVE_DIR}DataBaseList.txt |