博客
关于我
mysql mysqldump数据备份和增量备份(转)
阅读量:797 次
发布时间:2023-04-04

本文共 2694 字,大约阅读时间需要 8 分钟。

MySQL 数据备份与恢复:全量与增量备份方案

在实际操作中,MySQL 数据库的备份与恢复是至关重要的操作。通过合理设计备份策略,可以有效避免数据丢失风险。本文将详细介绍如何利用 Shell 脚本实现 MySQL 的全量备份与增量备份,并结合 crontab 进行自动化调度。


1. 全量备份策略

1.1 全量备份脚本

全量备份的主要目的是对数据库进行一次完整的数据备份,通常在数据库较为空的时间段进行。以下是一个典型的全量备份脚本示例:

#!/bin/bash# 脚本名称脚本名: DBFullyBak.sh# 脚本用途用 mysqldump 实现全量备份,将所有数据库的数据备份到指定目录,并记录操作日志。# 脚本路径备份目录: /home/mysql/backup日志文件: /home/mysql/backup/bak.log# 获取当前日期日期: $(date +%Y%m%d)# 开始时间与结束时间开始时间: $(date +"%Y年%m月%d日 %H:%M:%S")结束时间: $(date +"%Y年%m月%d日 %H:%M:%S")# 进入备份目录cd $备份目录# 生成备份文件备份文件名: $日期.sql压缩文件名: $日期.sql.tgz# 执行 mysqldump 命令mysqldump -uroot -p123456 --quick --all-databases --flush-logs --delete-master-logs --single-transaction > $备份文件名# 压缩备份文件tar czvf $压缩文件名 $备份文件名# 删除临时文件rm -f $备份文件名# 记录日志echo "开始:$开始时间 结束:$结束时间 $压缩文件名 成功!" >> $日志文件# 清理临时目录cd $备份目录/dailyrm -f *

1.2 脚本执行说明

  • mysqldump:用于生成完整的数据库备份。

    • -uroot:以数据库 root 用户执行备份。
    • -p123456:指定数据库密码。
    • --quick:减少输出信息,提高备份效率。
    • --all-databases:备份所有数据库。
    • --flush-logs:在备份完成后刷新日志文件。
    • --delete-master-logs:删除旧的主日志文件。
    • --single-transaction:确保备份在单个事务中完成,避免数据不一致。
  • 压缩与清理:将生成的 SQL 文件压缩为 .tgz 格式,并删除原文件以节省空间。

  • 日志记录:通过 bak.log 文件记录备份操作的时间和结果,便于追踪和验证。


  • 2. 增量备份脚本

    2.1 增量备份脚本

    增量备份的核心思想是基于前一次备份的基础上,仅复制自上次备份以后的数据变化。以下是一个增量备份脚本的示例:

    #!/bin/bash# 脚本名称脚本名: DBDailyBak.sh# 脚本用途实现每日对 MySQL 数据库的增量备份。# 脚本路径备份目录: /home/mysql/backup/daily数据目录: /home/mysql/data日志文件: /home/mysql/backup/bak.log# 获取当前日期日期: $(date +%Y%m%d)# 获取当前 binlog 文件数量binlog 文件名: mysql-bin.index当前 binlog 数量: $(wc -l $binlog 文件名 | awk '{print $1}')# 执行增量备份for 文件 in $(cat $binlog 文件名):{    base=$(basename $文件)    NextNum=$当前 binlog 数量 + 1    if [ $NextNum -eq $当前 binlog 数量 ]    {        echo "$base skip!" >> $日志文件    }    else    {        目标路径=$备份目录/$base        if [ -e $目标路径 ]        {            echo "$base exist!" >> $日志文件        }        else        {            cp $数据目录/$base $目标路径            echo "$base copying!" >> $日志文件        }    }}# 记录日志echo "开始:$(date +"%Y年%m月%d日 %H:%M:%S") $NextNum Bakup success!" >> $日志文件

    2.2 脚本执行说明

  • 获取 binlog 文件数量:通过 mysqladmin flush-logs 命令生成新的 binlog 文件。

  • 遍历 binlog 文件:通过 cat 读取当前 binlog 文件列表,逐一处理。

  • 判断文件状态

    • 如果当前 binlog 文件不存在,说明这是一个全量备份的第一次执行,直接复制所有 binlog 文件。
    • 如果 binlog 文件已存在,比较文件名和计数器,确定是否需要增量备份。
  • 日志记录:记录每个 binlog 文件的状态变化(如 skip!exist!copying!)。


  • 3. 设置自动化任务(crontab)

    为了实现自动化备份,我们可以使用 crontab 定期调度备份脚本的执行。

    3.1 crontab 配置

    # 每周日凌晨3:00执行全量备份0 3 * * 0 /root/DBFullyBak.sh > /dev/null 2>&1# 每周一至周六凌晨3:00执行增量备份0 3 * * 1-6 /root/DBDailyBak.sh > /dev/null 2>&1

    3.2 配置说明

  • 全量备份:每周日凌晨3:00运行 DBFullyBak.sh 脚本,生成全量备份文件。

  • 增量备份:工作日(周一至周六)凌晨3:00运行 DBDailyBak.sh 脚本,进行增量备份。


  • 4. 附录:脚本检测与调试

    为了确保脚本的语法正确,可以使用以下命令检测脚本:

    sh -n /root/DBFullyBak.shsh -n /root/DBDailyBak.sh

    通过此命令可以在屏幕上模拟脚本执行过程,检查是否存在语法错误或其他问题。


    通过以上方案,可以实现 MySQL 数据库的全量备份与增量备份,结合 crontab 自动化调度,确保数据安全与高效恢复。

    转载地址:http://wjrfk.baihongyu.com/

    你可能感兴趣的文章
    mysqldump 导出数据库中每张表的前n条
    查看>>
    mysqldump: Got error: 1044: Access denied for user ‘xx’@’xx’ to database ‘xx’ when using LOCK TABLES
    查看>>
    Mysqldump参数大全(参数来源于mysql5.5.19源码)
    查看>>
    mysqldump备份时忽略某些表
    查看>>
    mysqldump实现数据备份及灾难恢复
    查看>>
    mysqldump数据库备份无法进行操作只能查询 --single-transaction
    查看>>
    mysqldump的一些用法
    查看>>
    mysqli
    查看>>
    MySQLIntegrityConstraintViolationException异常处理
    查看>>
    mysqlreport分析工具详解
    查看>>
    MySQLSyntaxErrorException: Unknown error 1146和SQLSyntaxErrorException: Unknown error 1146
    查看>>
    Mysql_Postgresql中_geometry数据操作_st_astext_GeomFromEWKT函数_在java中转换geometry的16进制数据---PostgreSQL工作笔记007
    查看>>
    mysql_real_connect 参数注意
    查看>>
    mysql_secure_installation初始化数据库报Access denied
    查看>>
    MySQL_西安11月销售昨日未上架的产品_20161212
    查看>>
    Mysql——深入浅出InnoDB底层原理
    查看>>
    MySQL“被动”性能优化汇总
    查看>>
    MySQL、HBase 和 Elasticsearch:特点与区别详解
    查看>>
    MySQL、Redis高频面试题汇总
    查看>>
    MYSQL、SQL Server、Oracle数据库排序空值null问题及其解决办法
    查看>>