MySQL數(shù)據(jù)庫(kù)實(shí)現(xiàn)本地和異地備份的全面指南
在Linux環(huán)境下,mysqldump工具是進(jìn)行MySQL數(shù)據(jù)庫(kù)備份的常見(jiàn)方式。本文將分享一份改進(jìn)版的數(shù)據(jù)庫(kù)備份腳本,并結(jié)合實(shí)際案例,闡述如何定期備份MySQL數(shù)據(jù)庫(kù),并實(shí)現(xiàn)本地和異地備份。通過(guò)本文,您將掌握一個(gè)高效、安全的備份方案,確保數(shù)據(jù)的安全性和可恢復(fù)性。
一定要全部看完,再操作,因?yàn)閿?shù)據(jù)庫(kù)密碼我沒(méi)有再腳本中體現(xiàn),當(dāng)然也可以體現(xiàn),看具體需求
備份腳本概述
我們創(chuàng)建一個(gè)改進(jìn)版的備份腳本,命名為mysql_backup.sh。該腳本的目標(biāo)是:
- 自動(dòng)備份MySQL數(shù)據(jù)庫(kù),并排除系統(tǒng)數(shù)據(jù)庫(kù)(如
mysql、information_schema等)。 - 將備份數(shù)據(jù)打包并進(jìn)行本地壓縮。
- 同步備份到異地備份服務(wù)器(通過(guò)
rsync)。 - 自動(dòng)清理30天前的備份文件,節(jié)省存儲(chǔ)空間。
- 記錄詳細(xì)的備份日志,便于排查問(wèn)題。
編寫備份腳本
腳本內(nèi)容
#!/bin/bash
set -eo pipefail
trap 'echo "錯(cuò)誤發(fā)生在行 $LINENO"; exit 1' ERR
# 配置區(qū)
USER="root" # MySQL用戶名
BACKUP_DIR="/data/backup" # 備份存儲(chǔ)目錄
EXCLUDE_DBS="mysql|information_schema|performance_schema|sys" # 排除的系統(tǒng)數(shù)據(jù)庫(kù)
RSYNC_TARGET="rsync_backup@192.168.1.2::mysqlbackup/192.168.1.3/" # 異地備份目標(biāo)
LOGFILE="$BACKUP_DIR/data_backup.log" # 日志文件路徑
DATE=$(date +%Y%m%d_%H%M) # 當(dāng)前日期時(shí)間
# 創(chuàng)建備份目錄
mkdir -p "$BACKUP_DIR" || exit 1
cd "$BACKUP_DIR" || exit 1
# 記錄開(kāi)始時(shí)間
echo "==== 備份開(kāi)始 $(date +"%Y-%m-%d %H:%M:%S") ====" >> "$LOGFILE"
# 獲取數(shù)據(jù)庫(kù)列表并備份
DATABASES=$(mysql -e "SHOW DATABASES;" | grep -Ev "$EXCLUDE_DBS" | tr '\n' ' ')
echo "備份數(shù)據(jù)庫(kù): $DATABASES" >> "$LOGFILE"
mysqldump --routines --single-transaction --master-data=2 --databases $DATABASES > "wzqmysql_bak${DATE}.sql"
# 壓縮備份
if [ -s "wzqmysql_bak${DATE}.sql" ]; then
tar -czf "wzqmysql_bak${DATE}.tar.gz" "wzqmysql_bak${DATE}.sql"
rm -f "wzqmysql_bak${DATE}.sql"
echo "壓縮完成,文件大小: $(du -sh wzqmysql_bak${DATE}.tar.gz)" >> "$LOGFILE"
else
echo "備份文件為空,終止流程!" >> "$LOGFILE"
exit 1
fi
# 同步到異地
rsync -avz --password-file=/etc/rsync.password "wzqmysql_bak${DATE}.tar.gz" "$RSYNC_TARGET"
# 清理30天前備份
find "$BACKUP_DIR" -type f -mtime +30 -name "*.gz" -delete
echo "==== 備份完成 $(date +"%Y-%m-%d %H:%M:%S") ====" >> "$LOGFILE"
主要參數(shù)解釋
--single-transaction:對(duì)于InnoDB表,確保備份的一致性。--master-data=2:將主服務(wù)器的二進(jìn)制日志位置寫入備份文件,適用于主從復(fù)制環(huán)境。--routines:備份存儲(chǔ)過(guò)程和函數(shù)。rsync:用于將備份文件同步到異地服務(wù)器。find -mtime +30:清理30天前的備份文件。
設(shè)置腳本權(quán)限
在Linux系統(tǒng)中,為腳本添加執(zhí)行權(quán)限:
chmod +x /data/mysql_backup.sh
定期執(zhí)行備份
為了實(shí)現(xiàn)自動(dòng)備份,可以將該腳本添加到定時(shí)任務(wù)中(例如每天凌晨1點(diǎn)執(zhí)行)。
設(shè)置crontab任務(wù)
編輯crontab配置文件:
crontab -e
添加如下行,設(shè)定每天凌晨1點(diǎn)執(zhí)行備份腳本:
0 1 * * * /data/mysql_backup.sh
保存退出后,crontab會(huì)自動(dòng)更新。
安全性建議
避免明文密碼
將MySQL密碼存儲(chǔ)在~/.my.cnf配置文件中,并設(shè)置嚴(yán)格權(quán)限:
[client] user = root password = 123456
設(shè)置配置文件權(quán)限:
chmod 600 ~/.my.cnf
rsync密碼文件安全
確保/etc/rsync.password權(quán)限為600:
chmod 600 /etc/rsync.password
進(jìn)階功能和優(yōu)化
增量備份
mysqldump不支持增量備份,建議使用二進(jìn)制日志或Percona XtraBackup。以下是簡(jiǎn)要步驟:
查看二進(jìn)制日志位置:
head -n 30 wzqmysql_bak${DATE}.sql | grep "CHANGE MASTER TO"
使用mysqlbinlog導(dǎo)出增量日志:
mysqlbinlog --start-datetime="2025-02-21 00:00:00" /var/lib/mysql/binlog.000001 > incremental.sql
備份驗(yàn)證
定期驗(yàn)證備份文件是否可以成功恢復(fù):
# 解壓備份 tar -wzqf wzqmysql_bak20250221_0100.tar.gz # 恢復(fù)數(shù)據(jù)庫(kù) mysql -e "CREATE DATABASE test_restore;" mysql test_restore < wzqmysql_bak20250221_0100.sql
日志輪轉(zhuǎn)
使用logrotate管理日志文件:
/data/backup/data_backup.log {
daily
rotate 30
compress
missingok
}
詳細(xì)解釋
daily: 這表示日志文件將每天進(jìn)行輪換。如果日志文件每天更新或者你希望每次備份后都生成一個(gè)新的日志文件,可以使用這個(gè)選項(xiàng)。rotate 30: 這表示系統(tǒng)將保留最近30個(gè)輪換過(guò)的日志文件,其余的將被刪除。比如,你的日志文件每天生成一個(gè)新備份,當(dāng)系統(tǒng)積累到30個(gè)日志文件時(shí),最舊的日志文件將會(huì)被刪除,確保只保留最新的30個(gè)日志備份。compress: 這個(gè)選項(xiàng)告訴logrotate在輪換日志時(shí),對(duì)舊的日志文件進(jìn)行壓縮(通常是.gz格式),從而節(jié)省磁盤空間。壓縮文件的名字一般會(huì)附加.gz擴(kuò)展名,例如data_backup.log.1.gz、data_backup.log.2.gz等。missingok: 如果指定的日志文件不存在,不會(huì)拋出錯(cuò)誤,而是跳過(guò)處理。例如,如果/data/backup/data_backup.log文件在某一天沒(méi)有生成,logrotate會(huì)忽略這個(gè)情況,不會(huì)報(bào)錯(cuò)或中止執(zhí)行。
總結(jié)
通過(guò)本文的改進(jìn)版腳本,您可以實(shí)現(xiàn)MySQL數(shù)據(jù)庫(kù)的定期備份、本地壓縮、異地同步以及舊備份文件的自動(dòng)清理。結(jié)合安全性建議和進(jìn)階功能,您可以構(gòu)建一個(gè)高效、可靠的數(shù)據(jù)庫(kù)備份方案,確保數(shù)據(jù)的安全性和可恢復(fù)性。
附錄:腳本依賴
- MySQL客戶端和
mysqldump工具。 rsync用于異地備份。cron用于定時(shí)任務(wù)調(diào)度。mailutils(可選)用于郵件通知。
到此這篇關(guān)于MySQL數(shù)據(jù)庫(kù)實(shí)現(xiàn)本地和異地備份的全面指南的文章就介紹到這了,更多相關(guān)MySQL數(shù)據(jù)庫(kù)備份內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Can''t connect to MySQL server on ''localhost'' (10048)問(wèn)題解決方
windows 2003服務(wù)器運(yùn)行php的提示Can't connect to MySQL server on 'localhost' (10048), 下面來(lái)看下解決方法2013-09-09
mysql斷電后無(wú)法啟動(dòng)的問(wèn)題小結(jié)
這篇文章主要介紹了mysql斷電后無(wú)法啟動(dòng)的問(wèn)題小結(jié),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2024-04-04
MySQL事務(wù)日志(redo?log和undo?log)的詳細(xì)分析
innodb事務(wù)日志包括redo?log和undo?log,redo?log是重做日志,提供前滾操作,undo?log是回滾日志,提供回滾操作,下面這篇文章主要給大家介紹了關(guān)于MySQL事務(wù)日志(redo?log和undo?log)的詳細(xì)分析,需要的朋友可以參考下2022-04-04
MySQL 常見(jiàn)的數(shù)據(jù)表設(shè)計(jì)誤區(qū)匯總
雖然會(huì)有一些常規(guī)意義上的數(shù)據(jù)表錯(cuò)誤設(shè)計(jì)和優(yōu)秀設(shè)計(jì)原則,但是同樣也會(huì)有 MySQL 特定的一些情況,這會(huì)導(dǎo)致我們犯一些 MySQL 特定的錯(cuò)誤。本篇討論常見(jiàn)的設(shè)計(jì)誤區(qū)。2021-06-06
MySQL大表數(shù)據(jù)的分區(qū)與分庫(kù)分表的實(shí)現(xiàn)
數(shù)據(jù)庫(kù)的分區(qū)和分庫(kù)分表是兩種常用的技術(shù)方案,本文主要介紹了MySQL大表數(shù)據(jù)的分區(qū)與分庫(kù)分表的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2025-03-03

