將備份腳本儲存為 /home/user/mysql_backup.sh,並透過 crontab 設定每天固定時間執行:
# crontab -l # m h dom mon dow command 28 16 * * * /home/user/mysql_backup.sh
#!/bin/sh
# mysql_backup.sh: 備份 MySQL 資料庫並保留最新 5 天備份
# Last updated: 20 March 2006
# GNU GPL v2.0+, Copyright (C) 2006 Sam Tang
# MySQL 連線資訊
db_user="root"
db_passwd="password"
db_host="localhost"
# 備份儲存目錄
backup_dir="/home/mybackup"
# 日期格式 (dd-mm-yyyy)
time="$(date +\"%d-%m-%Y\")"
# 執行檔路徑
MYSQL="/usr/local/mysql/bin/mysql"
MYSQLDUMP="/usr/local/mysql/bin/mysqldump"
MKDIR="/bin/mkdir"
RM="/bin/rm"
MV="/bin/mv"
GZIP="/bin/gzip"
# 檢查備份目錄是否可寫入
test ! -w $backup_dir && echo \"Error: $backup_dir is un-writeable.\" && exit 0
# 建立最新備份目錄
test ! -d \"$backup_dir/backup.0/\" && $MKDIR \"$backup_dir/backup.0/\"
# 取得所有資料庫名稱
all_db=\"$($MYSQL -u $db_user -h $db_host -p$db_passwd -Bse 'show databases')\"
# 逐一備份並壓縮
for db in $all_db
do
$MYSQLDUMP -u $db_user -h $db_host -p$db_passwd $db | $GZIP -9 > \"$backup_dir/backup.0/$time.$db.gz\"
done
# 刪除最舊的備份 (第 5 天)
test -d \"$backup_dir/backup.5/\" && $RM -rf \"$backup_dir/backup.5\"
# 輪轉備份目錄 (0→1, 1→2, ...)
for int in 4 3 2 1 0
do
if test -d \"$backup_dir/backup.$int\"
then
next_int=`expr $int + 1`
$MV \"$backup_dir/backup.$int\" \"$backup_dir/backup.$next_int\"
fi
done
exit 0
mysql 使用者身份執行,若 /home/mybackup 不可寫入會導致備份失敗。chmod 777 /home/mybackup 解決權限問題(生產環境建議使用更安全的權限設定)。