MySQL數(shù)據(jù)庫自動化備份腳本的實踐指南
一、腳本概述
該腳本使用 mysqldump 工具,實現(xiàn)以下功能:
- 備份指定的一個或多個 MySQL 數(shù)據(jù)庫
- 自動創(chuàng)建日志和備份數(shù)據(jù)目錄
- 備份文件壓縮為
.tar.gz格式,節(jié)省磁盤空間 - 記錄每次備份的開始、成功、失敗日志
- 自動刪除 30 天前的舊備份文件
適用場景:Linux 服務器 + MySQL 5.7/8.0,支持非標準端口(如 9200)。
二、快速使用
1. 準備腳本
使用 vim 創(chuàng)建腳本文件(不要用 FTP 工具上傳,避免格式問題):
vim /opt/mysql_backup.sh
保存退出。
2. 修改配置
根據(jù)你的環(huán)境修改以下變量:
USER='your_db_user' # 數(shù)據(jù)庫用戶名 PASSWORD='your_password' # 數(shù)據(jù)庫密碼 HOST='your_db_host' # 數(shù)據(jù)庫 IP PORT=3306 # 端口(默認3306) dbName='db1 db2 db3' # 需要備份的數(shù)據(jù)庫,空格分隔
3. 執(zhí)行備份
sh /opt/mysql_backup.sh
執(zhí)行后會在腳本所在目錄下生成 mysql/ 文件夾:
mysql/ ├── data/ # 存放 .tar.gz 壓縮備份 └── log/ # 存放備份日志 mysqllog.log
4. 設置定時任務(生產(chǎn)推薦)
crontab -e # 每天凌晨 2 點執(zhí)行備份 0 2 * * * /bin/bash /opt/mysql_backup.sh > /dev/null 2>&1
三、腳本逐段解讀
1. 環(huán)境變量與配置
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin export PATH
確保 mysqldump 等命令在 PATH 中。如果使用自定義安裝路徑(如 /usr/local/mysql-8.0/bin),需要在腳本中指定完整路徑。
USER='yxw01' PASSWORD='yxw@123!' HOST='192.168.11.36' PORT=9200 dbName='mate_smart'
生產(chǎn)環(huán)境建議將密碼存儲在單獨配置文件中,并設置
600權限,避免硬編碼泄漏。
2. 動態(tài)路徑與日志
backtime=`date +%Y%m%d%H%M%S` # 備份時間戳,如 20250423140230 logpath=$(pwd)/mysql/log datapath=$(pwd)/mysql/data
3. 自動創(chuàng)建目錄
if [ ! -d ${logpath} ];then
mkdir -pv ${logpath}
fi
-p 自動創(chuàng)建父目錄,-v 輸出創(chuàng)建信息。
4. 核心備份命令
/usr/local/mysql-8.0/bin/mysqldump --skip-lock-tables -u ${USER} -h ${HOST} -P${PORT} -p${PASSWORD} ${table} > ${datapath}/${backtime}-${table}.sql
參數(shù)解釋:
--skip-lock-tables:備份時不鎖表(對 InnoDB 表有效,MyISAM 仍可能鎖)。避免阻塞業(yè)務寫入。-P${PORT}:大寫 P 指定端口,小寫 p 是密碼。- 重定向
>將 SQL 輸出到文件。
注意:如果 MySQL 安裝在非標準路徑,需要指定 mysqldump 的完整路徑,否則會報 command not found。
5. 壓縮與清理原始文件
tar zcvf ${backtime}-${table}.tar.gz ${backtime}-${table}.sql > /dev/null
rm -f ${datapath}/${backtime}-${table}.sql
壓縮后刪除原始 SQL 文件,只保留壓縮包。> /dev/null 隱藏壓縮過程輸出
6. 日志記錄與錯誤處理
if [ "$?" == 0 ];then
echo "備份成功" >> ${logpath}/mysqllog.log
else
echo "備份失敗" >> ${logpath}/mysqllog.log
fi
$? 獲取上一條命令的退出碼,0 表示成功。
7. 過期備份清理
find $datapath -name "*.tar.gz" -type f -print -mtime +30 -exec rm -rf {} ;-mtime +30:修改時間超過 30 天的文件-exec rm -rf {} ;:執(zhí)行刪除操作
可根據(jù)磁盤容量調(diào)整保留天數(shù)(如 +7 保留一周)。
四、注意事項與生產(chǎn)優(yōu)化
重要提醒
- 不要在業(yè)務高峰期備份:雖然使用了
--skip-lock-tables,但mysqldump仍可能增加數(shù)據(jù)庫 I/O 負載。建議在凌晨執(zhí)行。 - 腳本格式問題:務必在 Linux 服務器上用
vim或nano創(chuàng)建腳本,不要用 Windows 記事本編輯后上傳,否則會遇到\r導致的command not found錯誤。 - 密碼安全:生產(chǎn)環(huán)境建議使用
~/.my.cnf配置文件存放密碼,腳本中只指定--defaults-extra-file。 - 備份文件驗證:定期嘗試恢復備份到測試環(huán)境,確保備份可用。
- 異地存儲:壓縮后的備份文件應同步到異地(如 OSS、S3、NFS),防止服務器故障導致數(shù)據(jù)全丟。
優(yōu)化建議
① 使用~/.my.cnf避免明文密碼
# 創(chuàng)建 /root/.my.cnf [client] user=yxw01 password='yxw@123!' host=192.168.11.36 port=9200 chmod 600 /root/.my.cnf
腳本中改為:
mysqldump --defaults-extra-file=/root/.my.cnf ${table} > ...② 單數(shù)據(jù)庫多線程備份(可選)
對于超大數(shù)據(jù)庫,可使用 mydumper 或 并行 mysqldump,但腳本復雜度增加。
③ 備份失敗告警
添加郵件或釘釘告警:
if [ "$?" != 0 ]; then
echo "備份失敗" | mail -s "DB Backup Failed" admin@example.com
fi④ 保留策略優(yōu)化
除按天數(shù)刪除外,可保留每周一次的全量備份(例如 find ... ! -name "*Monday*" -mtime +7)。
五、腳本完整版(生產(chǎn)級改進)
#!/bin/bash
# 生產(chǎn)級 MySQL 備份腳本
# 支持多庫、壓縮、過期清理、免密登錄
set -e # 遇錯停止(可選)
BACKUP_BASE="/data/backup/mysql"
LOG_PATH="${BACKUP_BASE}/log"
DATA_PATH="${BACKUP_BASE}/data"
RETENTION_DAYS=30
# 使用 .my.cnf 存儲憑證
MYSQL_OPTS="--defaults-extra-file=/root/.my.cnf --skip-lock-tables"
# 需要備份的數(shù)據(jù)庫列表
DATABASES="db1 db2 db3"
# 創(chuàng)建目錄
mkdir -p ${LOG_PATH} ${DATA_PATH}
# 備份時間戳
TIMESTAMP=$(date +%Y%m%d%H%M%S)
# 記錄日志函數(shù)
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a ${LOG_PATH}/backup.log
}
log "========== 開始備份 =========="
for DB in ${DATABASES}; do
BACKUP_FILE="${DATA_PATH}/${TIMESTAMP}-${DB}.sql"
COMPRESSED_FILE="${BACKUP_FILE}.tar.gz"
log "正在備份數(shù)據(jù)庫: ${DB}"
mysqldump ${MYSQL_OPTS} ${DB} > ${BACKUP_FILE}
if [ $? -eq 0 ]; then
tar czf ${COMPRESSED_FILE} -C ${DATA_PATH} $(basename ${BACKUP_FILE})
rm -f ${BACKUP_FILE}
log "備份成功: ${COMPRESSED_FILE}"
else
log "備份失敗: ${DB}"
# 可選:發(fā)送告警
fi
done
# 清理過期備份
find ${DATA_PATH} -name "*.tar.gz" -type f -mtime +${RETENTION_DAYS} -delete
log "已清理超過 ${RETENTION_DAYS} 天的舊備份"
log "========== 備份完成 =========="六、總結(jié)
本文提供的備份腳本簡單可靠,已在生產(chǎn)環(huán)境運行多年。核心要點:
- 使用
mysqldump+tar實現(xiàn)備份與壓縮 - 通過
find自動清理過期文件 - 完整的日志記錄便于追溯
- 結(jié)合 crontab 實現(xiàn)無人值守
最后提醒:定期測試恢復 比備份本身更重要。建議每季度從備份文件中恢復一次數(shù)據(jù),驗證備份有效性。
以上就是MySQL數(shù)據(jù)庫自動化備份腳本的實踐指南的詳細內(nèi)容,更多關于MySQL自動化備份腳本的資料請關注腳本之家其它相關文章!
相關文章
mysql的聯(lián)合索引(復合索引)的實現(xiàn)
這篇文章主要介紹了mysql的聯(lián)合索引(復合索引)的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-03-03
修改MySQL8.0 默認的數(shù)據(jù)目錄(快捷操作無配置)
這篇文章主要介紹了修改MySQL8.0 默認的數(shù)據(jù)目錄(快捷操作無配置),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-11-11
Mysql表的內(nèi)聯(lián)和外聯(lián)區(qū)別案例解析
文章總結(jié)了SQL中的表連接,包括內(nèi)連接和外連接,內(nèi)連接通過WHERE子句篩選笛卡兒積,而外連接分為左外連接和右外連接,左外連接確保左表的所有記錄都顯示,右外連接確保右表的所有記錄都顯示,文章通過語法案例和練習幫助理解這些連接類型,感興趣的朋友跟隨小編一起看看吧2025-11-11
MySQL刪除binlog日志文件的三種實現(xiàn)方式
本文介紹了三種刪除MySQL binlog日志文件的方法,包含手動刪除、使用SQL命令刪除和設置自動清理,具有一定的參考價值,感興趣的可以了解一下2025-02-02

