未开启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全量备份内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • mysql查线上数据注意数据库的隔离级别

    mysql查线上数据注意数据库的隔离级别

    数据库的隔离级别关乎事务对其他并发事务的可见性及其对数据库的影响,隔离级别的选择决定了并发性能和数据一致性的平衡,SQL标准定义了四种隔离级别,每种级别都有不同的应用场景和防止并发问题的能力,感兴趣的可以了解一下
    2024-10-10
  • mysql多个left join连接查询用法分析

    mysql多个left join连接查询用法分析

    这篇文章主要介绍了mysql多个left join连接查询用法,结合实例形式对比分析了mysql使用left join进行连接查询相关操作技巧与注意事项,需要的朋友可以参考下
    2018-07-07
  • mysql group by 多个行转换为一个字段

    mysql group by 多个行转换为一个字段

    本文主要介绍了mysql group by 多个行转换为一个字段,可以使用聚合函数GROUP_CONCAT()函数,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-08-08
  • mysql中的四大运算符种类实例汇总(20多项) 

    mysql中的四大运算符种类实例汇总(20多项) 

    这篇文章主要介绍了mysql中的四大运算符种类汇总,运算符连接表达式中的各个操作数,他的作用是用来指明对数据表中的操作数所进行的运算
    2022-07-07
  • MySQL存粹问题面试准备总结大全

    MySQL存粹问题面试准备总结大全

    这篇文章主要介绍了MySQL存粹问题面试准备总结的相关资料,MySQL面试中常见问题,包括但不限于事务,索引,引擎,场景优化等常见问题,有助于面试前的准备,需要的朋友可以参考下
    2026-05-05
  • MySQL通用查询日志和慢查询日志全面分析

    MySQL通用查询日志和慢查询日志全面分析

    这篇文章主要介绍了MySQL通用查询日志和慢查询日志的用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11
  • mysql mycat 中间件安装与使用

    mysql mycat 中间件安装与使用

    MyCAT是MySQL中间件,前身是阿里大名鼎鼎的Cobar,Cobar在开源了一段时间后,不了了之。于是MyCAT扛起了这面大旗,在大数据时代,其重要性愈发彰显。这篇文章主要是MyCAT的入门部署。
    2017-05-05
  • Docker Dockerfile构建MySQL并初始化数据方式

    Docker Dockerfile构建MySQL并初始化数据方式

    这篇文章主要介绍了Docker Dockerfile构建MySQL并初始化数据方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-04-04
  • Mysql怎么存储json格式数据详解

    Mysql怎么存储json格式数据详解

    在开发中遇到存取html值的情况,并且要根据id进行实时返回,在做的时候想到了mysql的json类型存储,下面这篇文章主要给大家介绍了关于Mysql怎么存储json格式数据的相关资料,需要的朋友可以参考下
    2022-06-06
  • MYSQL比对版本号字符串的方法实例

    MYSQL比对版本号字符串的方法实例

    因为mysql的版本较多,所以最近也踩了一个因为版本号字符串的坑,下面这篇文章主要给大家介绍了关于MYSQL比对版本号字符串的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-05-05

最新评论