MySQL中萬能備份腳本的實現(xiàn)詳解
此腳本適用于 MySQL 各個生命周期的版本
#!/bin/bash
# mybackup.sh
# 備份保留天數(shù),建議保留三天
days=7
# 備份時間
time=$(date +%Y%m%d%H%M%S)
# 備份保存路徑
backup_dir=/opt/backup
# 備份工具
tool=mysqldump
# 端口
port="3306"
# 是否采用 --all-databases 備份所有數(shù)據(jù)庫,是填寫 Y,否填其他
read -p "是否備份所有數(shù)據(jù)庫?(Y/N): " bak_all
# 將要備份的數(shù)據(jù)庫,填寫將要備份的數(shù)據(jù)庫名
if [ "$bak_all" != "Y" ]; then
read -p "請輸入要備份的數(shù)據(jù)庫名,多個數(shù)據(jù)庫用空格分隔: " database_input
IFS=' ' read -r -a database_arr <<< "$database_input"
fi
# 輸入賬號和密碼
read -p "請輸入 MySQL 用戶名: " username
read -s -p "請輸入 MySQL 密碼: " password
echo
# 檢查文件夾是否存在,不存在則創(chuàng)建
if [ ! -d "$backup_dir/mysqlbak_$time" ]; then
mkdir -p "$backup_dir/mysqlbak_$time"
fi
# 備份數(shù)據(jù)庫
if [ "$bak_all" == "Y" ]; then
$tool -u"$username" -p"$password" -P"$port" --master-data=2 --single-transaction --set-gtid-purged=on --all-databases | gzip > "$backup_dir/mysqlbak_$time/mysqlbak_all_$time.sql.gz"
else
for database in "${database_arr[@]}"; do
$tool -u"$username" -p"$password" -P"$port" --master-data=2 --single-transaction --set-gtid-purged=on "$database" | gzip > "$backup_dir/mysqlbak_$time/mysqlbak_${database}_${time}.sql.gz"
done
fi
# 備份 binlog 日志
# 獲取當(dāng)前的 binlog 文件列表
binlog_files=$(mysql -u"$username" -p"$password" -P"$port" -e "SHOW BINARY LOGS;" | awk 'NR>1 {print $1}')
for binlog_file in $binlog_files; do
mysqlbinlog -u"$username" -p"$password" -P"$port" "$binlog_file" > "$backup_dir/mysqlbak_$time/${binlog_file}_${time}.log"
done
# 刪除指定天數(shù)前的備份
find "$backup_dir" -maxdepth 1 -type d -mtime +$days -name 'mysqlbak*' -exec rm -rf {} \;
腳本說明:
賬號和密碼輸入:使用 read 命令在腳本運行時提示用戶輸入 MySQL 用戶名和密碼,其中 -s 選項用于隱藏密碼輸入。
數(shù)據(jù)庫選擇:詢問用戶是否備份所有數(shù)據(jù)庫,如果選擇否,則讓用戶輸入要備份的數(shù)據(jù)庫名,多個數(shù)據(jù)庫名用空格分隔。
備份數(shù)據(jù)庫:根據(jù)用戶的選擇,使用 mysqldump 備份所有數(shù)據(jù)庫或指定的數(shù)據(jù)庫,并將備份文件壓縮保存。
備份 binlog 日志:
- 使用
mysql -e命令獲取當(dāng)前的 binlog 文件列表。 - 遍歷 binlog 文件列表,使用
mysqlbinlog命令將每個 binlog 文件備份到指定的備份目錄。
刪除舊備份:使用 find 命令刪除指定天數(shù)前的備份文件夾。
使用方法:
將上述腳本保存為 mybackup.sh。
給腳本添加執(zhí)行權(quán)限:
chmod +x mybackup.sh
運行腳本:
./mybackup.sh
注意事項:
確保用戶輸入的賬號和密碼具有足夠的權(quán)限來執(zhí)行備份操作。
方法補充
以下是小編為大家整理的其他MySQL 備份腳本,希望對大家有所幫助
腳本代碼:
#!/bin/bash
# 定義變量
USER="root"
PASSWORD="123456"
BACKUP_DIR="/backup/mysql"
DATE=$(date +%Y%m%d)
WEEKDAY=$(date +%u) # 1=星期一, 7=星期日
# 創(chuàng)建備份目錄
mkdir -p $BACKUP_DIR
# 周日全備份,其他日子增量備份
if [ $WEEKDAY -eq 7 ]; then
# 全備份
echo "$(date): 開始全備份" >> $BACKUP_DIR/backup.log
mysqldump -u$USER -p$PASSWORD --all-databases --single-transaction | gzip > $BACKUP_DIR/full_$DATE.sql.gz
echo "$(date): 全備份完成" >> $BACKUP_DIR/backup.log
else
# 增量備份(備份binlog)
echo "$(date): 開始增量備份" >> $BACKUP_DIR/backup.log
mysql -u$USER -p$PASSWORD -e "FLUSH LOGS"
# 復(fù)制最新的binlog文件
cp /usr/local/mysql/data/mysql-bin.$(mysql -u$USER -p$PASSWORD -e "SHOW MASTER STATUS" | awk 'NR==2{print $1}' | sed 's/mysql-bin.//') $BACKUP_DIR/binlog_$DATE
echo "$(date): 增量備份完成" >> $BACKUP_DIR/backup.log
fi
# 刪除7天前的備份
find $BACKUP_DIR -name "*.gz" -mtime +7 -delete
find $BACKUP_DIR -name "binlog_*" -mtime +7 -delete腳本解析
1. 變量定義
USER="root" # MySQL用戶名 PASSWORD="your_password" # MySQL密碼(使用時替換為實際密碼) BACKUP_DIR="/backup/mysql" # 備份文件存儲目錄 DATE=$(date +%Y%m%d) # 當(dāng)前日期(格式:20231006) WEEKDAY=$(date +%u) # 星期幾(1=星期一,7=星期日) #!/bin/bash:指定用Bash解釋器執(zhí)行腳本。
關(guān)鍵變量:
- USER/PASSWORD:連接MySQL的用戶和密碼。
- BACKUP_DIR:所有備份文件將存儲在此目錄。
- DATE和WEEKDAY:用于按日期命名備份文件和控制備份類型。
??2. 創(chuàng)建備份目錄??
mkdir -p $BACKUP_DIR -p:如果目錄不存在則創(chuàng)建,避免報錯。
??3. 備份邏輯(核心部分)??
??情況一:周日全備份??
if [ $WEEKDAY -eq 7 ]; then
echo "$(date): 開始全備份" >> $BACKUP_DIR/backup.log
mysqldump -u $USER -p $PASSWORD --all-databases --single-transaction | gzip > $BACKUP_DIR/full_$DATE.sql.gz
echo "$(date): 全備份完成" >> $BACKUP_DIR/backup.logmysqldump關(guān)鍵參數(shù)??:
--all-databases:備份所有數(shù)據(jù)庫。
--single-transaction:在事務(wù)中執(zhí)行備份,確保數(shù)據(jù)一致性。
gzip:壓縮備份文件以節(jié)省空間。
> full_$DATE.sql.gz :輸出到以日期命名的壓縮文件(如full_20231006.sql.gz)
??情況二:其他日期增量備份??
else
echo "$(date): 開始增量備份" >> $BACKUP_DIR/backup.log
mysql -u$USER -p$PASSWORD -e "FLUSH LOGS"
cp /usr/local/mysql/data/mysql-bin.$(mysql -u$USER -p$PASSWORD -e "SHOW MASTER STATUS" | awk 'NR==2{print $1}' | sed 's/mysql-bin.//') $BACKUP_DIR/binlog_$DATE
echo "$(date): 增量備份完成" >> $BACKUP_DIR/backup.log
fiFLUSH LOGS??:強制MySQL創(chuàng)建新的binlog文件,確保增量備份的邊界清晰。(如從mysql-bin.000123切換到mysql-bin.000124)
mysql -u$USER -p$PASSWORD -e "SHOW MASTER STATUS":獲取當(dāng)前binlog文件名(如mysql-bin.000123)。
awk 'NR==2{print $1}' :從SHOW MASTER STATUS的輸出中提取第二行的第一列(即 mysql-bin.000123)
sed 's/mysql-bin.//':去掉mysql-bin.前綴把 mysql-bin.000123變成 000123。
/usr/local/mysql/data/mysql-bin.$(...):
??作用??:組合MySQL的binlog存儲路徑 + 文件名。
??示例??:
如果 SHOW MASTER STATUS返回 mysql-bin.000123,則最終路徑是:
/var/lib/mysql/mysql-bin.000123
cp ... $BACKUP_DIR/binlog_$DATE
??作用??:將binlog文件復(fù)制到備份目錄,并按日期命名(如 binlog_20231006)。
??示例??:
cp /var/lib/mysql/mysql-bin.000123 /backup/mysql/binlog_20231006
??增量備份原理??:MySQL的binlog記錄了所有數(shù)據(jù)變更,通過定期保存binlog實現(xiàn)增量備份。
如果沒有binlog文件 則再/etc/my.cnf 的 [mysqld] 里添加這一行 log_bin = mysql-bin (啟用binlog,文件前綴為mysql-bin)
??4. 清理舊備份??
find $BACKUP_DIR -name "*.gz" -mtime +7 -delete find $BACKUP_DIR -name "binlog_*" -mtime +7 -delete
??作用??:自動刪除7天前的全備份(.gz文件)和增量備份(binlog_*文件)。
-mtime +7:匹配修改時間超過7天的文件。
-delete:直接刪除文件
??5. 日志記錄??
所有操作均通過echo追加到$BACKUP_DIR/backup.log,格式示例:
Mon Oct 6 03:00:01 UTC 2023: 開始全備份
Mon Oct 6 03:02:30 UTC 2023: 全備份完成
??關(guān)鍵注意事項??
??MySQL配置要求??:
必須啟用binlog(檢查my.cnf中是否有l(wèi)og_bin=ON)。
確保/usr/local/mysql/data是正確的binlog路徑(根據(jù)實際配置調(diào)整)。
到此這篇關(guān)于MySQL中萬能備份腳本的實現(xiàn)詳解的文章就介紹到這了,更多相關(guān)MySQL備份腳本內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
講解Linux系統(tǒng)下如何自動備份MySQL數(shù)據(jù)的基本教程
這篇文章主要介紹了Linux系統(tǒng)下如何自動備份MySQL數(shù)據(jù)的基本教程,還給出了利用shell腳本全備份和增量備份的基本方法,需要的朋友可以參考下2015-11-11

