MySQL数据库实现本地和异地备份的全面指南

 更新时间:2025年09月02日 10:06:16   作者:XMYX-0  
本文将分享一份改进版的数据库备份脚本,并结合实际案例,阐述如何定期备份MySQL数据库,并实现本地和异地备份,有需要的小伙伴可以参考一下

在Linux环境下,mysqldump工具是进行MySQL数据库备份的常见方式。本文将分享一份改进版的数据库备份脚本,并结合实际案例,阐述如何定期备份MySQL数据库,并实现本地和异地备份。通过本文,您将掌握一个高效、安全的备份方案,确保数据的安全性和可恢复性。

一定要全部看完,再操作,因为数据库密码我没有再脚本中体现,当然也可以体现,看具体需求

备份脚本概述

我们创建一个改进版的备份脚本,命名为mysql_backup.sh。该脚本的目标是:

  • 自动备份MySQL数据库,并排除系统数据库(如mysqlinformation_schema等)。
  • 将备份数据打包并进行本地压缩。
  • 同步备份到异地备份服务器(通过rsync)。
  • 自动清理30天前的备份文件,节省存储空间。
  • 记录详细的备份日志,便于排查问题。

编写备份脚本

脚本内容

#!/bin/bash
set -eo pipefail
trap 'echo "错误发生在行 $LINENO"; exit 1' ERR

# 配置区
USER="root"                           # MySQL用户名
BACKUP_DIR="/data/backup"             # 备份存储目录
EXCLUDE_DBS="mysql|information_schema|performance_schema|sys"  # 排除的系统数据库
RSYNC_TARGET="rsync_backup@192.168.1.2::mysqlbackup/192.168.1.3/"     # 异地备份目标
LOGFILE="$BACKUP_DIR/data_backup.log" # 日志文件路径
DATE=$(date +%Y%m%d_%H%M)             # 当前日期时间

# 创建备份目录
mkdir -p "$BACKUP_DIR" || exit 1
cd "$BACKUP_DIR" || exit 1

# 记录开始时间
echo "==== 备份开始 $(date +"%Y-%m-%d %H:%M:%S") ====" >> "$LOGFILE"

# 获取数据库列表并备份
DATABASES=$(mysql -e "SHOW DATABASES;" | grep -Ev "$EXCLUDE_DBS" | tr '\n' ' ')
echo "备份数据库: $DATABASES" >> "$LOGFILE"
mysqldump --routines --single-transaction --master-data=2 --databases $DATABASES > "wzqmysql_bak${DATE}.sql"

# 压缩备份
if [ -s "wzqmysql_bak${DATE}.sql" ]; then
  tar -czf "wzqmysql_bak${DATE}.tar.gz" "wzqmysql_bak${DATE}.sql"
  rm -f "wzqmysql_bak${DATE}.sql"
  echo "压缩完成,文件大小: $(du -sh wzqmysql_bak${DATE}.tar.gz)" >> "$LOGFILE"
else
  echo "备份文件为空,终止流程!" >> "$LOGFILE"
  exit 1
fi

# 同步到异地
rsync -avz --password-file=/etc/rsync.password "wzqmysql_bak${DATE}.tar.gz" "$RSYNC_TARGET"

# 清理30天前备份
find "$BACKUP_DIR" -type f -mtime +30 -name "*.gz" -delete

echo "==== 备份完成 $(date +"%Y-%m-%d %H:%M:%S") ====" >> "$LOGFILE"

主要参数解释

  • --single-transaction:对于InnoDB表,确保备份的一致性。
  • --master-data=2:将主服务器的二进制日志位置写入备份文件,适用于主从复制环境。
  • --routines:备份存储过程和函数。
  • rsync:用于将备份文件同步到异地服务器。
  • find -mtime +30:清理30天前的备份文件。

设置脚本权限

在Linux系统中,为脚本添加执行权限:

chmod +x /data/mysql_backup.sh

定期执行备份

为了实现自动备份,可以将该脚本添加到定时任务中(例如每天凌晨1点执行)。

设置crontab任务

编辑crontab配置文件:

crontab -e

添加如下行,设定每天凌晨1点执行备份脚本:

0 1 * * * /data/mysql_backup.sh

保存退出后,crontab会自动更新。

安全性建议

避免明文密码

将MySQL密码存储在~/.my.cnf配置文件中,并设置严格权限:

[client]
user = root
password = 123456

设置配置文件权限:

chmod 600 ~/.my.cnf

rsync密码文件安全

确保/etc/rsync.password权限为600:

chmod 600 /etc/rsync.password

进阶功能和优化

增量备份

mysqldump不支持增量备份,建议使用二进制日志或Percona XtraBackup。以下是简要步骤:

查看二进制日志位置:

head -n 30 wzqmysql_bak${DATE}.sql | grep "CHANGE MASTER TO"

使用mysqlbinlog导出增量日志:

mysqlbinlog --start-datetime="2025-02-21 00:00:00" /var/lib/mysql/binlog.000001 > incremental.sql

备份验证

定期验证备份文件是否可以成功恢复:

# 解压备份
tar -wzqf wzqmysql_bak20250221_0100.tar.gz
# 恢复数据库
mysql -e "CREATE DATABASE test_restore;"
mysql test_restore < wzqmysql_bak20250221_0100.sql

日志轮转

使用logrotate管理日志文件:

/data/backup/data_backup.log {
  daily
  rotate 30
  compress
  missingok
}

详细解释

  • daily: 这表示日志文件将每天进行轮换。如果日志文件每天更新或者你希望每次备份后都生成一个新的日志文件,可以使用这个选项。
  • rotate 30: 这表示系统将保留最近30个轮换过的日志文件,其余的将被删除。比如,你的日志文件每天生成一个新备份,当系统积累到30个日志文件时,最旧的日志文件将会被删除,确保只保留最新的30个日志备份。
  • compress: 这个选项告诉logrotate在轮换日志时,对旧的日志文件进行压缩(通常是.gz格式),从而节省磁盘空间。压缩文件的名字一般会附加.gz扩展名,例如data_backup.log.1.gzdata_backup.log.2.gz等。
  • missingok: 如果指定的日志文件不存在,不会抛出错误,而是跳过处理。例如,如果/data/backup/data_backup.log文件在某一天没有生成,logrotate会忽略这个情况,不会报错或中止执行。

总结

通过本文的改进版脚本,您可以实现MySQL数据库的定期备份、本地压缩、异地同步以及旧备份文件的自动清理。结合安全性建议和进阶功能,您可以构建一个高效、可靠的数据库备份方案,确保数据的安全性和可恢复性。

附录:脚本依赖

  • MySQL客户端和mysqldump工具。
  • rsync用于异地备份。
  • cron用于定时任务调度。
  • mailutils(可选)用于邮件通知。

到此这篇关于MySQL数据库实现本地和异地备份的全面指南的文章就介绍到这了,更多相关MySQL数据库备份内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • mysql 5.7 docker 主从复制架构搭建教程

    mysql 5.7 docker 主从复制架构搭建教程

    这篇文章主要为大家详细介绍了mysql 5.7 docker 主从复制架构搭建教程,感兴趣的小伙伴们可以参考一下
    2016-07-07
  • mysql 5.7.13 winx64安装配置教程

    mysql 5.7.13 winx64安装配置教程

    这篇文章主要为大家分享了windows下mysql 5.7.13winx64安装配置教程,总结在安装mysql5.7时遇到的坑,感兴趣的朋友可以参考一下
    2016-12-12
  • Linux系统下Mysql使用简单教程(一)

    Linux系统下Mysql使用简单教程(一)

    这篇文章主要介绍了Linux系统下Mysql使用简单教程(一)的相关资料,需要的朋友可以参考下
    2016-05-05
  • MySQL处理重复数据的各种技术和方法(预防、检测与删除)

    MySQL处理重复数据的各种技术和方法(预防、检测与删除)

    这篇文章主要介绍了MySQL中处理重复数据的技术和方法,包括重复数据的产生原因、影响、预防方案、删除方案(临时表法、直接删除法、窗口函数)以及高级应用场景和性能优化建议,需要的朋友可以参考下
    2025-11-11
  • MySQL窗口函数 over(partition by)的用法

    MySQL窗口函数 over(partition by)的用法

    本文主要介绍了MySQL窗口函数 over(partition by)的用法, partition by相比较于group by,能够在保留全部数据的基础上,只对其中某些字段做分组排序,下面就来介绍一下具体用法,感兴趣的可以了解一下
    2024-02-02
  • MySQL游标和触发器的操作流程

    MySQL游标和触发器的操作流程

    本文介绍了MySQL中的游标和触发器的使用方法,游标可以对查询结果集进行逐行处理,而触发器则可以在数据表发生更改时自动执行预定义的操作,感兴趣的朋友跟随小编一起看看吧
    2025-12-12
  • MySQL添加索引的5种方式

    MySQL添加索引的5种方式

    在MySQL中索引(Index)是数据库优化的核心机制,它像书的目录,帮助快速定位数据,而非全表扫描,本详解聚焦5种常见添加索引方式,基于官方手册与Percona基准,这些方式覆盖80%场景,需要的朋友可以参考下
    2026-03-03
  • mysql中数据库与数据表编码格式的查看、创建及修改

    mysql中数据库与数据表编码格式的查看、创建及修改

    这篇文章给大家介绍了如何查看、创建以及修改数据库与数据表的编码格式,另外还给大家分享了添加和删除外键的示例代码,文中介绍的很详细,对大家的理解和学习具有一定的参考借鉴价值,有需要的朋友们下面来一起学习学习吧。
    2016-11-11
  • MySql数据库触发器使用教程

    MySql数据库触发器使用教程

    MySQL从5.0.2版本开始支持触发器,MySQL的触发器和存储过程一样,都是嵌入到MySQL服务器的一段程序,这篇文章主要给大家介绍了关于MySql数据库触发器使用的相关资料,需要的朋友可以参考下
    2022-05-05
  • Mysql索引合并的实现示例

    Mysql索引合并的实现示例

    MySQL索引合并通过多索引扫描与结果集合并优化查询,本文主要介绍了Mysql索引合并的实现示例,具有一定的参考价值,感兴趣的可以了解一下
    2025-07-07

最新评论