全量備份腳本,其中BakDir,ZlbakDir,LogFile需要自己創建
#!/bin/bash
export LANG=en_US.UTF-8# 指定備份目錄
BakDir=/root/beifen/data/mysqlbak/data/allbak
# 指定增量備份目錄
ZlbakDir=/root/beifen/data/mysqlbak/data/zlbak
# 備份日志位置
LogFile=/root/beifen/data/mysqlbak/log/bak.log# 獲取當前時間
CurrentDate=$(date +%Y-%m-%d-%H-%M-%S)
# 腳本執行時間
Begin=$(date +"%Y年%m月%d日 %H:%M:%S")
# 要備份的數據庫
Database=a# 進入全備目錄
cd $BakDir || exit 1 # 如果目錄不存在或無法進入,則退出腳本# 存儲即將生成的SQL備份文件名稱
DumpFile=$Database-$CurrentDate.sql
# 存儲壓縮后的名稱
GZDumpFile=$Database-$CurrentDate.tar.gz# 使用mysqldump進行備份,--flush-logs會刷新日志,--delete-master-logs會刪除舊的二進制日志(注意:這通常在生產環境中使用時需要謹慎),--single-transaction用InnoDB表的一致性備份。
mysqldump -u root -plmx $Database --flush-logs --delete-master-logs --single-transaction > $BakDir/$DumpFile# 用tar命令將SQL備份文件壓縮成tar.gz格式
tar -czvf "$GZDumpFile" "$DumpFile"
rm "$DumpFile"# 統計當前目錄下.tar.gz文件的數量
count=$(ls -l *.tar.gz 2>/dev/null | wc -l)
if [ $count -ge 2 ]; then# 刪除最舊的.tar.gz文件file=$(ls -lt *.tar.gz | head -n 1 | awk '{print $9}')rm -f "$file"
fi# 獲取腳本結束時的日期和時間
Last=$(date +"%Y年%m月%d日 %H:%M:%S")# 將備份的開始時間、結束時間和成功生成的壓縮文件名追加到日志文件中
echo "開始:$Begin 結束:$Last $GZDumpFile success" >> "$LogFile"# 進入增量備份目錄,這里假設您只想清空目錄(注意:這可能會刪除重要文件)
cd $ZlbakDir || exit 1
rm -f *# 如果需要保留某些文件(如binlog),請修改上面的rm命令以排除這些文件。
成功后會在目錄里看到一個tar.gz包,解壓之后就可以查看sql文件了
增量備份腳本
其中BakDir,LogFile需要自己創建,BinDir和BinFile需要自己尋找,如果不知道在那的話登錄MySQL輸入以下兩條命令
MySQL 會自動管理二進制日志索引文件,其名稱通常與二進制日志文件的基本名稱相同,但擴展名為 .index
。在您的配置中,由于 log-bin=mysql-bin
,二進制日志索引文件通常會被命名為 mysql-bin.index
#!/bin/bash
# 指定腳本的解釋器為Bashexport LANG=en_US.UTF-8
# 設置環境變量LANG為en_US.UTF-8,確保腳本在處理文本時使用UTF-8編碼BakDir=/root/beifen/data/mysqlbak/data/zlbak
# 定義備份目錄的路徑BinDir=/usr/local/mysql/data
# 定義MySQL二進制日志文件的目錄路徑LogFile=/root/beifen/data/mysqlbak/log/binlog.log
# 定義日志文件的路徑,用于記錄備份過程中的信息BinFile=/usr/local/mysql/data/mysql-bin.index
# 定義包含二進制日志文件列表的索引文件的路徑mysqladmin -u root -plmx flush-logs
# 使用mysqladmin命令刷新MySQL的日志,包括二進制日志。Counter=$(wc -l $BinFile | awk '{print $1}')
# 計算索引文件($BinFile)中的行數,即二進制日志文件的數量,并將結果存儲在變量Counter中NextNum=0
# 初始化NextNum變量為0,用于在后續循環中計數# 這個for循環用于遍歷索引文件($BinFile)中的每一行(每個文件路徑)
for file in $(cat $BinFile)
dobase=$(basename $file)# 使用basename命令從完整路徑中提取文件名(不包含路徑)NextNum=$(expr $NextNum + 1)# 將NextNum的值加1if [ $NextNum -eq $Counter ]then# 如果當前文件是索引文件中的最后一個文件echo $base skip! >> $LogFile# 則記錄到日志文件中,表示跳過else# 如果不是最后一個文件dest=$BakDir/$base# 定義目標備份文件的完整路徑if test -e $destthen# 如果目標備份文件已經存在echo $base exist! >> $LogFile# 則記錄到日志文件中,表示文件已存在else# 如果目標文件不存在cp $BinDir/$base $BakDir# 將二進制日志文件從MySQL的日志目錄復制到備份目錄echo $base copying >> $LogFile# 記錄到日志文件中,表示文件正在被復制fifi
done# 記錄備份成功的消息到日志文件中,并附帶當前日期和時間
echo $(date +"%Y年%m月%d日 %H:%M:%S") Backup success! >> $LogFile
成功后如下