未开启binlog时mysql全量备份的实现

来源:这里教程网 时间:2026-02-20 14:14:21 作者:
一、mysqldump全量备份(推荐)1. 基础全量备份命令2. 按数据库粒度备份脚本二、文件系统物理备份1. 冷备方案(需要停机)2. 使用MySQL Enterprise Backup(商业版)三、针对无binlog的备份策略1. 多周期备份方案四、避免数据丢失的预防措施1. 备份前校验表2. 备份后完整性验证五、无binlog环境的最佳实践1. 备份频率建议2. 数据安全建议3. 恢复演练六、重要提醒

未开启binlog的情况下,MySQL无法进行增量备份和时间点恢复,只能进行全量备份。以下是针对无binlog环境的备份方案:

一、mysqldump全量备份(推荐)

1. 基础全量备份命令

# 备份整个数据库实例 mysqldump -u root -p \ --all-databases \ --single-transaction \ --routines \ --triggers \ --events \ --flush-logs \ --master-data=2 \ > full_backup_$(date +%Y%m%d).sql

参数说明:

--single-transaction: InnoDB一致性读,不锁表--flush-logs: 刷新日志,虽然无binlog但不影响--master-data=2: 记录备份位置信息,虽然无binlog但保留格式

2. 按数据库粒度备份脚本

#!/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" # 创建备份目录 mkdir -p ${BACKUP_DIR}/${DATE} # 获取所有数据库列表(排除系统库) databases=$(mysql -h${MYSQL_HOST} -u${MYSQL_USER} -p${MYSQL_PASSWORD} \ -e "SHOW DATABASES;" | grep -Ev "Database|information_schema|performance_schema|sys") # 逐个备份数据库 for db in $databases; do echo "正在备份数据库: $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}"

二、文件系统物理备份

1. 冷备方案(需要停机)

#!/bin/bash # cold_backup.sh # 1. 停止MySQL服务 sudo systemctl stop mysql # 2. 复制数据文件 BACKUP_DIR="/backup/mysql/cold_backup_$(date +%Y%m%d)" mkdir -p ${BACKUP_DIR} # 复制整个数据目录 sudo cp -rp /var/lib/mysql ${BACKUP_DIR}/ # 复制配置文件 sudo cp -rp /etc/mysql ${BACKUP_DIR}/ # 3. 启动MySQL服务 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(商业版)

# 热备,无需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} # 执行备份函数 do_backup() { local target_dir=$1 mysqldump -uroot -pyourpassword \ --all-databases \ --single-transaction \ --routines \ --triggers \ --events | gzip > ${target_dir}/full_backup.sql.gz # 记录备份元数据 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 } # 每天执行日备份 do_backup ${DAILY_DIR} "daily" # 每周日执行周备份(周日的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号执行月备份 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 {} \;

四、避免数据丢失的预防措施

1. 备份前校验表

# 备份前检查表状态 mysqlcheck -u root -p --all-databases --check-only # 修复表(如果需要) 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 # 测试性恢复(可选) gunzip -c ${BACKUP_FILE} | head -n 50 | grep -i "CREATE DATABASE" if [ $? -eq 0 ]; then echo "备份内容有效性检查: 通过" else echo "备份内容有效性检查: 失败" exit 1 fi

五、无binlog环境的最佳实践

1. 备份频率建议

核心业务:每天1-3次全备普通业务:每天1次全备测试环境:每周1-2次全备

2. 数据安全建议

# 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. 备份监控 # 如果连续2天没有新备份文件,发送告警 find /backup/mysql -name "*.sql.gz" -mtime -2 | grep . || echo "备份异常" | mail -s "备份告警" admin@example.com

3. 恢复演练

# 定期(每月)在测试环境执行恢复测试 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环境的风险

    无法时间点恢复(Point-in-Time Recovery)无法增量备份误删数据只能恢复到最近一次全备

    必须的补偿措施

    增加备份频率(核心表每小时全备)保留多版本备份(7天日备 + 4周周备 + 12个月备)备份自动验证机制

无binlog环境下,全量备份就是唯一的保命手段,建议在业务低峰期增加备份频率,并确保备份文件的完整性和可用性。

到此这篇关于未开启binlog时mysql全量备份的实现的文章就介绍到这了,

相关推荐

热文推荐