mysql定期全量备份脚本
在工作过程中,因为问题排查的需要,可能需要将数据进行备份,
创建全量备份脚本 /data/scripts/full_backup.sh,内容如下:
#!/bin/bash
# mysql 全量备份脚本(使用 xtrabackup 或 mysqldump)
backup_dir="/data/backup/mysql/full"
date=$(date +%y%m%d_%h%m%s)
backup_path="$backup_dir/$date"
log_file="/data/logs/binlog_backup/full_backup.log"
log() {
echo "[$(date '+%y-%m-%d %h:%m:%s')] $1" | tee -a "$log_file"
}
# 方法1:使用 mysqldump(适用于数据量较小的情况)
log "开始 mysqldump 全量备份..."
mysqldump \
-h192.168.56.80 \
-uroot \
-pyourrootpassword \
--all-databases \
--events \
--routines \
--triggers \
--master-data=2 \
--single-transaction \
--flush-logs \
> "$backup_path.sql"
if [ $? -eq 0 ]; then
log "全量备份完成: $backup_path.sql"
# 记录 binlog 位置
head -50 "$backup_path.sql" | grep "change master to" > "$backup_path.pos"
# 压缩备份
gzip "$backup_path.sql"
log "备份已压缩"
else
log "备份失败"
exit 1
fi
# 删除7天前的旧备份
find "$backup_dir" -type f -name "*.sql.gz" -mtime +7 -delete
find "$backup_dir" -type f -name "*.pos" -mtime +7 -delete
log "清理7天前的旧备份完成"将备份脚本添加到 crontab
# 每天凌晨2点执行全量备份 0 2 * * * /data/scripts/full_backup.sh > /dev/null 2>&1
当主库发生灾难性故障需要恢复时,按以下步骤操作:
# 1. 找到最近的备份
cd /data/backup/mysql/full
latest_backup=$(ls -1t *.sql.gz | head -1)
latest_date=$(echo $latest_backup | cut -d. -f1)
# 2. 查看备份时的 binlog 位置
cat "$latest_date.pos"
# 3. 解压并恢复全量备份
gunzip -c "$latest_backup" | mysql -hnewmaster -uroot -p
# 4. 找到恢复点之后的 binlog
cd /data/backup/mysql/binlog
# 假设备份时位置是 'mysql-bin.000123', 45678
# 5. 从备份点之后开始应用 binlog
mysqlbinlog \
--start-position=45678 \
mysql-bin.000123 mysql-bin.000124 mysql-bin.000125 \
| mysql -hnewmaster -uroot -p备份文件清理策略创建清理脚本
/data/scripts/cleanup_binlog.sh:
#!/bin/bash # 清理过期的 binlog 备份 binlog_dir="/data/backup/mysql/binlog" retention_days=30 # 删除30天前的 binlog 文件 find "$binlog_dir" -name "mysql-bin.*" -type f -mtime +$retention_days -delete # 记录清理日志 echo "[$(date)] 清理 $retention_days 天前的 binlog 文件" >> /data/logs/binlog_backup/cleanup.log
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论