未開啟binlog時mysql全量備份的實現(xiàn)
在未開啟binlog的情況下,MySQL無法進行增量備份和時間點恢復(fù),只能進行全量備份。以下是針對無binlog環(huán)境的備份方案:
一、mysqldump全量備份(推薦)
1. 基礎(chǔ)全量備份命令
# 備份整個數(shù)據(jù)庫實例 mysqldump -u root -p \ --all-databases \ --single-transaction \ --routines \ --triggers \ --events \ --flush-logs \ --master-data=2 \ > full_backup_$(date +%Y%m%d).sql
參數(shù)說明:
--single-transaction: InnoDB一致性讀,不鎖表--flush-logs: 刷新日志,雖然無binlog但不影響--master-data=2: 記錄備份位置信息,雖然無binlog但保留格式
2. 按數(shù)據(jù)庫粒度備份腳本
#!/bin/bash
# backup_no_binlog.sh
BACKUP_DIR="/data/backup/mysql"
DATE=$(date +%Y%m%d_%H%M%S)
MYSQL_USER="root"
MYSQL_PASSWORD="yourpassword"
MYSQL_HOST="localhost"
# 創(chuàng)建備份目錄
mkdir -p ${BACKUP_DIR}/${DATE}
# 獲取所有數(shù)據(jù)庫列表(排除系統(tǒng)庫)
databases=$(mysql -h${MYSQL_HOST} -u${MYSQL_USER} -p${MYSQL_PASSWORD} \
-e "SHOW DATABASES;" | grep -Ev "Database|information_schema|performance_schema|sys")
# 逐個備份數(shù)據(jù)庫
for db in $databases; do
echo "正在備份數(shù)據(jù)庫: $db"
mysqldump -h${MYSQL_HOST} -u${MYSQL_USER} -p${MYSQL_PASSWORD} \
--single-transaction \
--routines \
--triggers \
--events \
--skip-lock-tables \
${db} | gzip > ${BACKUP_DIR}/${DATE}/${db}.sql.gz
# 記錄備份大小
size=$(du -h ${BACKUP_DIR}/${DATE}/${db}.sql.gz | cut -f1)
echo "${db}: ${size}" >> ${BACKUP_DIR}/${DATE}/backup_info.txt
done
# 刪除30天前的備份
find ${BACKUP_DIR} -type d -mtime +30 -exec rm -rf {} \;
echo "備份完成: ${BACKUP_DIR}/${DATE}"
二、文件系統(tǒng)物理備份
1. 冷備方案(需要停機)
#!/bin/bash
# cold_backup.sh
# 1. 停止MySQL服務(wù)
sudo systemctl stop mysql
# 2. 復(fù)制數(shù)據(jù)文件
BACKUP_DIR="/backup/mysql/cold_backup_$(date +%Y%m%d)"
mkdir -p ${BACKUP_DIR}
# 復(fù)制整個數(shù)據(jù)目錄
sudo cp -rp /var/lib/mysql ${BACKUP_DIR}/
# 復(fù)制配置文件
sudo cp -rp /etc/mysql ${BACKUP_DIR}/
# 3. 啟動MySQL服務(wù)
sudo systemctl start mysql
# 4. 打包壓縮
tar -czf ${BACKUP_DIR}.tar.gz ${BACKUP_DIR}
sudo rm -rf ${BACKUP_DIR}
echo "冷備完成: ${BACKUP_DIR}.tar.gz"
2. 使用MySQL Enterprise Backup(商業(yè)版)
# 熱備,無需binlog mysqlbackup --user=root --password=yourpassword \ --backup-dir=/backup/full_backup \ backup-and-apply-log
三、針對無binlog的備份策略
1. 多周期備份方案
#!/bin/bash
# multi_cycle_backup.sh
BACKUP_ROOT="/backup/mysql"
DATE=$(date +%Y%m%d)
WEEKDAY=$(date +%u) # 1-7 周一到周日
DAY_OF_MONTH=$(date +%d)
# 日備份目錄
DAILY_DIR="${BACKUP_ROOT}/daily/${DATE}"
# 周備份目錄
WEEKLY_DIR="${BACKUP_ROOT}/weekly/week${WEEKDAY}"
# 月備份目錄
MONTHLY_DIR="${BACKUP_ROOT}/monthly/$(date +%Y%m)"
mkdir -p ${DAILY_DIR} ${WEEKLY_DIR} ${MONTHLY_DIR}
# 執(zhí)行備份函數(shù)
do_backup() {
local target_dir=$1
mysqldump -uroot -pyourpassword \
--all-databases \
--single-transaction \
--routines \
--triggers \
--events | gzip > ${target_dir}/full_backup.sql.gz
# 記錄備份元數(shù)據(jù)
echo "backup_time: $(date '+%Y-%m-%d %H:%M:%S')" > ${target_dir}/metadata.txt
echo "backup_type: ${2}" >> ${target_dir}/metadata.txt
echo "binlog_status: disabled" >> ${target_dir}/metadata.txt
}
# 每天執(zhí)行日備份
do_backup ${DAILY_DIR} "daily"
# 每周日執(zhí)行周備份(周日的weekday=7)
if [ ${WEEKDAY} -eq 7 ]; then
cp ${DAILY_DIR}/full_backup.sql.gz ${WEEKLY_DIR}/
cp ${DAILY_DIR}/metadata.txt ${WEEKLY_DIR}/
fi
# 每月1號執(zhí)行月備份
if [ ${DAY_OF_MONTH} -eq 1 ]; then
cp ${DAILY_DIR}/full_backup.sql.gz ${MONTHLY_DIR}/
cp ${DAILY_DIR}/metadata.txt ${MONTHLY_DIR}/
fi
# 清理策略
# 保留7天日備份
find ${BACKUP_ROOT}/daily -type d -mtime +7 -exec rm -rf {} \;
# 保留4周周備份
find ${BACKUP_ROOT}/weekly -type d -mtime +28 -exec rm -rf {} \;
# 保留3個月備份
find ${BACKUP_ROOT}/monthly -type d -mtime +90 -exec rm -rf {} \;
四、避免數(shù)據(jù)丟失的預(yù)防措施
1. 備份前校驗表
# 備份前檢查表狀態(tài) mysqlcheck -u root -p --all-databases --check-only # 修復(fù)表(如果需要) mysqlcheck -u root -p --all-databases --repair
2. 備份后完整性驗證
#!/bin/bash
# verify_backup.sh
BACKUP_FILE=$1
# 檢查文件完整性
gzip -t ${BACKUP_FILE}
if [ $? -eq 0 ]; then
echo "備份文件完整性檢查: 通過"
else
echo "備份文件完整性檢查: 失敗"
exit 1
fi
# 測試性恢復(fù)(可選)
gunzip -c ${BACKUP_FILE} | head -n 50 | grep -i "CREATE DATABASE"
if [ $? -eq 0 ]; then
echo "備份內(nèi)容有效性檢查: 通過"
else
echo "備份內(nèi)容有效性檢查: 失敗"
exit 1
fi
五、無binlog環(huán)境的最佳實踐
1. 備份頻率建議
- 核心業(yè)務(wù):每天1-3次全備
- 普通業(yè)務(wù):每天1次全備
- 測試環(huán)境:每周1-2次全備
2. 數(shù)據(jù)安全建議
# 1. 開啟定時全備(crontab) 0 1,13 * * * /backup/scripts/daily_backup.sh # 每天1點和13點各備份一次 0 3 * * 0 /backup/scripts/weekly_archive.sh # 每周日3點歸檔 # 2. 異地備份 rsync -avz /backup/mysql/ user@remote-server:/backup/mysql/ # 3. 備份加密 mysqldump ... | openssl enc -aes-256-cbc -salt -pass pass:yourpassword > backup.sql.enc # 4. 備份監(jiān)控 # 如果連續(xù)2天沒有新備份文件,發(fā)送告警 find /backup/mysql -name "*.sql.gz" -mtime -2 | grep . || echo "備份異常" | mail -s "備份告警" admin@example.com
3. 恢復(fù)演練
# 定期(每月)在測試環(huán)境執(zhí)行恢復(fù)測試 gunzip -c latest_backup.sql.gz | mysql -utest -ptest test_database
六、重要提醒
立即建議開啟binlog:
-- 修改my.cnf配置 [mysqld] server-id = 1 log_bin = /var/log/mysql/mysql-bin.log expire_logs_days = 7 -- 重啟生效 sudo systemctl restart mysql
無binlog環(huán)境的風(fēng)險:
- 無法時間點恢復(fù)(Point-in-Time Recovery)
- 無法增量備份
- 誤刪數(shù)據(jù)只能恢復(fù)到最近一次全備
必須的補償措施:
- 增加備份頻率(核心表每小時全備)
- 保留多版本備份(7天日備 + 4周周備 + 12個月備)
- 備份自動驗證機制
無binlog環(huán)境下,全量備份就是唯一的保命手段,建議在業(yè)務(wù)低峰期增加備份頻率,并確保備份文件的完整性和可用性。
到此這篇關(guān)于未開啟binlog時mysql全量備份的實現(xiàn)的文章就介紹到這了,更多相關(guān)mysql未開啟binlog全量備份內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
mysql查線上數(shù)據(jù)注意數(shù)據(jù)庫的隔離級別
數(shù)據(jù)庫的隔離級別關(guān)乎事務(wù)對其他并發(fā)事務(wù)的可見性及其對數(shù)據(jù)庫的影響,隔離級別的選擇決定了并發(fā)性能和數(shù)據(jù)一致性的平衡,SQL標(biāo)準(zhǔn)定義了四種隔離級別,每種級別都有不同的應(yīng)用場景和防止并發(fā)問題的能力,感興趣的可以了解一下2024-10-10
mysql group by 多個行轉(zhuǎn)換為一個字段
本文主要介紹了mysql group by 多個行轉(zhuǎn)換為一個字段,可以使用聚合函數(shù)GROUP_CONCAT()函數(shù),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-08-08
Docker Dockerfile構(gòu)建MySQL并初始化數(shù)據(jù)方式

