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

 更新时间:2026年02月19日 09:38:01   作者:SenCube  
本文针对未开启binlog的MySQL环境提供了多种备份方案,实现日/周/月备份分级管理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

未开启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

六、重要提醒

  1. 立即建议开启binlog

    -- 修改my.cnf配置
    [mysqld]
    server-id = 1
    log_bin = /var/log/mysql/mysql-bin.log
    expire_logs_days = 7
    
    -- 重启生效
    sudo systemctl restart mysql
    
  2. 无binlog环境的风险

    • 无法时间点恢复(Point-in-Time Recovery)
    • 无法增量备份
    • 误删数据只能恢复到最近一次全备
  3. 必须的补偿措施

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

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

到此这篇关于未开启binlog时mysql全量备份的实现的文章就介绍到这了,更多相关mysql未开启binlog全量备份内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 数据库SQL SELECT查询的工作原理

    数据库SQL SELECT查询的工作原理

    今天小编就为大家分享一篇关于数据库SQL SELECT查询的工作原理,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-03-03
  • win10 mysql导出csv的两种方式

    win10 mysql导出csv的两种方式

    win10导出csv有两种方式,第一种是借助工具,第二种是原始SQL语句导出,这篇文章主要介绍了win10 mysql导出csv的两种方式,需要的朋友可以参考下
    2019-12-12
  • MySQL 的 21 个规范、优化最佳实践!

    MySQL 的 21 个规范、优化最佳实践!

    每一个好习惯都是一笔财富,本文分 SQL 后悔药,SQL 性能优化,SQL 规范优雅三个方向,分享写 SQL 的 21 个好习惯和最佳实践
    2020-12-12
  • MySql数据库基础之分组查询详解

    MySql数据库基础之分组查询详解

    这篇文章主要介绍了mysql按照时间分组查询的语句,非常实用,sql语句简单易懂,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-09-09
  • MySQL MGR搭建过程中常遇见的问题及解决办法

    MySQL MGR搭建过程中常遇见的问题及解决办法

    这篇文章主要介绍了MySQL MGR搭建过程中常遇见的问题及解决办法,帮助大家更好的理解和学习使用MySQL,感兴趣的朋友可以了解下
    2021-03-03
  • mysql使用insert into select插入查出的数据

    mysql使用insert into select插入查出的数据

    这篇文章主要介绍了mysql使用insert into select插入查出的数据方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • MySQL中datetime时间字段的四舍五入操作

    MySQL中datetime时间字段的四舍五入操作

    这是由一则生产环境问题引出的MySQL对于datetime时间类型字段中毫秒的处理的深究,这篇文章主要给大家介绍了关于MySQL中datetime时间字段的四舍五入操作的相关资料,需要的朋友可以参考下
    2021-09-09
  • 解决Node.js mysql客户端不支持认证协议引发的问题

    解决Node.js mysql客户端不支持认证协议引发的问题

    这篇文章主要介绍了解决Node.js mysql客户端不支持认证协议引发的问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,,需要的朋友可以参考下
    2019-06-06
  • mysql中decimal数据类型小数位填充问题详解

    mysql中decimal数据类型小数位填充问题详解

    这篇文章主要介绍了mysql中decimal数据类型小数位填充问题详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-02-02
  • windows下mysql 8.0.13 解压版安装图文教程

    windows下mysql 8.0.13 解压版安装图文教程

    这篇文章主要为大家详细介绍了windows下mysql 8.0.13 解压版安装图文教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-02-02

最新评论