MySQL中萬(wàn)能備份腳本的實(shí)現(xiàn)詳解
此腳本適用于 MySQL 各個(gè)生命周期的版本
#!/bin/bash
# mybackup.sh
# 備份保留天數(shù),建議保留三天
days=7
# 備份時(shí)間
time=$(date +%Y%m%d%H%M%S)
# 備份保存路徑
backup_dir=/opt/backup
# 備份工具
tool=mysqldump
# 端口
port="3306"
# 是否采用 --all-databases 備份所有數(shù)據(jù)庫(kù),是填寫(xiě) Y,否填其他
read -p "是否備份所有數(shù)據(jù)庫(kù)?(Y/N): " bak_all
# 將要備份的數(shù)據(jù)庫(kù),填寫(xiě)將要備份的數(shù)據(jù)庫(kù)名
if [ "$bak_all" != "Y" ]; then
read -p "請(qǐng)輸入要備份的數(shù)據(jù)庫(kù)名,多個(gè)數(shù)據(jù)庫(kù)用空格分隔: " database_input
IFS=' ' read -r -a database_arr <<< "$database_input"
fi
# 輸入賬號(hào)和密碼
read -p "請(qǐng)輸入 MySQL 用戶(hù)名: " username
read -s -p "請(qǐng)輸入 MySQL 密碼: " password
echo
# 檢查文件夾是否存在,不存在則創(chuàng)建
if [ ! -d "$backup_dir/mysqlbak_$time" ]; then
mkdir -p "$backup_dir/mysqlbak_$time"
fi
# 備份數(shù)據(jù)庫(kù)
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 {} \;
腳本說(shuō)明:
賬號(hào)和密碼輸入:使用 read 命令在腳本運(yùn)行時(shí)提示用戶(hù)輸入 MySQL 用戶(hù)名和密碼,其中 -s 選項(xiàng)用于隱藏密碼輸入。
數(shù)據(jù)庫(kù)選擇:詢(xún)問(wèn)用戶(hù)是否備份所有數(shù)據(jù)庫(kù),如果選擇否,則讓用戶(hù)輸入要備份的數(shù)據(jù)庫(kù)名,多個(gè)數(shù)據(jù)庫(kù)名用空格分隔。
備份數(shù)據(jù)庫(kù):根據(jù)用戶(hù)的選擇,使用 mysqldump 備份所有數(shù)據(jù)庫(kù)或指定的數(shù)據(jù)庫(kù),并將備份文件壓縮保存。
備份 binlog 日志:
- 使用
mysql -e命令獲取當(dāng)前的 binlog 文件列表。 - 遍歷 binlog 文件列表,使用
mysqlbinlog命令將每個(gè) binlog 文件備份到指定的備份目錄。
刪除舊備份:使用 find 命令刪除指定天數(shù)前的備份文件夾。
使用方法:
將上述腳本保存為 mybackup.sh。
給腳本添加執(zhí)行權(quán)限:
chmod +x mybackup.sh
運(yùn)行腳本:
./mybackup.sh
注意事項(xiàng):
確保用戶(hù)輸入的賬號(hào)和密碼具有足夠的權(quán)限來(lái)執(zhí)行備份操作。
方法補(bǔ)充
以下是小編為大家整理的其他MySQL 備份腳本,希望對(duì)大家有所幫助
腳本代碼:
#!/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): 開(kāi)始全備份" >> $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): 開(kāi)始增量備份" >> $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用戶(hù)名 PASSWORD="your_password" # MySQL密碼(使用時(shí)替換為實(shí)際密碼) BACKUP_DIR="/backup/mysql" # 備份文件存儲(chǔ)目錄 DATE=$(date +%Y%m%d) # 當(dāng)前日期(格式:20231006) WEEKDAY=$(date +%u) # 星期幾(1=星期一,7=星期日) #!/bin/bash:指定用Bash解釋器執(zhí)行腳本。
關(guān)鍵變量:
- USER/PASSWORD:連接MySQL的用戶(hù)和密碼。
- BACKUP_DIR:所有備份文件將存儲(chǔ)在此目錄。
- DATE和WEEKDAY:用于按日期命名備份文件和控制備份類(lèi)型。
??2. 創(chuàng)建備份目錄??
mkdir -p $BACKUP_DIR -p:如果目錄不存在則創(chuàng)建,避免報(bào)錯(cuò)。
??3. 備份邏輯(核心部分)??
??情況一:周日全備份??
if [ $WEEKDAY -eq 7 ]; then
echo "$(date): 開(kāi)始全備份" >> $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ù)庫(kù)。
--single-transaction:在事務(wù)中執(zhí)行備份,確保數(shù)據(jù)一致性。
gzip:壓縮備份文件以節(jié)省空間。
> full_$DATE.sql.gz :輸出到以日期命名的壓縮文件(如full_20231006.sql.gz)
??情況二:其他日期增量備份??
else
echo "$(date): 開(kāi)始增量備份" >> $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??:強(qiáng)制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存儲(chǔ)路徑 + 文件名。
??示例??:
如果 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ù)變更,通過(guò)定期保存binlog實(shí)現(xiàn)增量備份。
如果沒(méi)有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
??作用??:自動(dòng)刪除7天前的全備份(.gz文件)和增量備份(binlog_*文件)。
-mtime +7:匹配修改時(shí)間超過(guò)7天的文件。
-delete:直接刪除文件
??5. 日志記錄??
所有操作均通過(guò)echo追加到$BACKUP_DIR/backup.log,格式示例:
Mon Oct 6 03:00:01 UTC 2023: 開(kāi)始全備份
Mon Oct 6 03:02:30 UTC 2023: 全備份完成
??關(guān)鍵注意事項(xiàng)??
??MySQL配置要求??:
必須啟用binlog(檢查my.cnf中是否有l(wèi)og_bin=ON)。
確保/usr/local/mysql/data是正確的binlog路徑(根據(jù)實(shí)際配置調(diào)整)。
到此這篇關(guān)于MySQL中萬(wàn)能備份腳本的實(shí)現(xiàn)詳解的文章就介紹到這了,更多相關(guān)MySQL備份腳本內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SQL?日期處理視圖創(chuàng)建(常見(jiàn)數(shù)據(jù)類(lèi)型查詢(xún)防范?SQL注入)
這篇文章主要為大家介紹了SQL日期處理和視圖創(chuàng)建:常見(jiàn)數(shù)據(jù)類(lèi)型、示例查詢(xún)和防范?SQL?注入方法示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12
Java項(xiàng)目中mysql深度分頁(yè)解決方案大全
深度分頁(yè)的優(yōu)化核心在于減少M(fèi)ySQL掃描的數(shù)據(jù)量,避免全表掃描,通過(guò)使用索引、游標(biāo)分頁(yè)、延遲關(guān)聯(lián)等技術(shù),可以顯著提升分頁(yè)查詢(xún)的性能,這篇文章主要介紹了Java項(xiàng)目中mysql深度分頁(yè)的相關(guān)資料,需要的朋友可以參考下2026-01-01
MYSQL代碼 定期備份Mysql數(shù)據(jù)庫(kù)
Mysql自動(dòng)備份腳本供大家參考,實(shí)現(xiàn)了定期備份Mysql數(shù)據(jù)庫(kù),并且可以選在在每周的一天做指定目錄下文件的全面?zhèn)浞荩瑐浞菸募詣?dòng)上傳到你指定的FTP上,保證了備份的可靠性。2009-04-04
mysql實(shí)現(xiàn)游標(biāo)分頁(yè)的方法詳解
這篇文章主要為大家詳細(xì)介紹了mysql實(shí)現(xiàn)游標(biāo)分頁(yè)的相關(guān)方法,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2025-10-10
MySQL?中的?CAST?函數(shù)詳解及常見(jiàn)用法
CAST?函數(shù)是MySQL中用于數(shù)據(jù)類(lèi)型轉(zhuǎn)換的重要函數(shù),它允許你將一個(gè)值從一種數(shù)據(jù)類(lèi)型轉(zhuǎn)換為另一種數(shù)據(jù)類(lèi)型,本文給大家介紹MySQL?中的?CAST?函數(shù),感興趣的朋友一起看看吧2025-07-07
從ibd文件恢復(fù)MySQL數(shù)據(jù)的操作步驟及常見(jiàn)錯(cuò)誤
MySQL數(shù)據(jù)恢復(fù)是數(shù)據(jù)庫(kù)管理中的一項(xiàng)重要任務(wù),尤其是在遭遇意外數(shù)據(jù)丟失、硬件故障或軟件錯(cuò)誤時(shí),下面這篇文章主要給大家介紹了關(guān)于從ibd文件恢復(fù)MySQL數(shù)據(jù)的操作步驟及常見(jiàn)錯(cuò)誤,需要的朋友可以參考下2024-08-08

