很多人觉得备份是“有空再说”的事,直到某天误删了一张业务表、服务器磁盘突然报废,或者被同事一条 drop database 直接清库,才追悔莫及。尤其是linux服务器上的mysql,很多人平时连ssh都懒得登,更别说天天盯着数据了。我就是吃过这个亏的人,所以后来老老实实把 crontab + mysqldump 这套定时备份方案搭了起来。这套方案适合绝大多数中小规模业务库,能解决“数据丢了找不回来”这个核心痛点,也适合刚接触linux运维的同学照着抄作业。今天把完整思路、脚本、排障经验一次性讲清楚。
1. 先从需求说起:为什么我建议你认真做定时备份
1.1 备份不是“要不要做”,而是“怎么做得不后悔”
很多新手以为备份就是把数据库导出一下,手动执行一条命令,然后把文件扔在服务器上就完事了。但真实场景里,这个“简单”的做法会引出几个问题:备份文件放在哪?磁盘满了怎么办?备份任务凌晨执行了,但我不知道它到底成没成功?数据库有100gb,直接 mysqldump 会不会把线上业务拖垮?最关键的,万一真要恢复,这份备份到底能不能用?
这些问题不提前想清楚,等到事故发生时,大概率会发现自己手里只有一份“看起来存在、实际上残缺”的备份文件。我在实际维护中见过太多次这样的局面:有人把备份文件放在 /root/ 下,结果 / 分区写满,数据库直接宕机;有人用 mysqldump 不加任何参数,导出到一半网络中断,留下一个半截文件;还有人配了crontab,但因为脚本里写了相对路径,定时任务一跑就报 command not found ,备份从来没成功过。
所以这篇文章不只是教你敲几条命令,而是把整个备份闭环讲清楚:方案选型、目录规划、脚本编写、定时调度、日志监控、恢复演练。你照着做一遍,后面基本不会再为“备份了没”这种问题失眠。
1.2 全量备份、增量备份与binlog:先选对方案
在动手之前,得先明确你到底需要哪种备份。最常见的方案无非这三种:
| 方案 | 原理 | 适合场景 | 缺点 |
|---|---|---|---|
| 全量备份(mysqldump) | 把整个库的逻辑数据导出为sql文件 | 数据量不大,单次导出可在十几分钟内完成 | 备份窗口较长,恢复只能恢复到备份时刻 |
| 物理备份(xtrabackup/mysqlbackup) | 直接拷贝数据文件 | 数据量很大,几十gb以上 | 工具安装、权限配置复杂,恢复对版本敏感 |
| 全量备份 + binlog增量 | 定期全量备份,配合二进制日志做增量恢复 | 数据重要、需要恢复到任意时间点 | 需要开启binlog,恢复流程复杂 |
我的建议很明确:中小型业务、单库大小在10gb以内,优先选择 mysqldump 全量备份 + 定期清理老备份文件。如果数据量到了几十gb,再考虑xtrabackup。如果你的业务要求“恢复到误操作前的几分钟”,那必须提前开启 log_bin ,并且把binlog文件也纳入备份体系。
这里有个关键点:很多人以为开启了binlog就等于有了增量备份,其实不对。binlog文件本身会滚动、会过期,如果你不做全量备份,仅仅靠binlog是没法完整恢复的。正确做法是“全量备份 + binlog归档”,全量负责恢复基线,binlog负责恢复基线之后到故障点之间的所有变更。
我遇到过一个小伙伴,他把 expire_logs_days 设成了7天,却只做了周一一次全量备份。周三数据库坏了,他手里只有周一的备份,而binlog因为过期的原因,中间两天的日志已经被mysql自动清掉了。这个案例提醒我:备份方案和binlog过期策略必须一起设计。
2. 动手前的环境检查与目录规划
2.1 确认mysql安装方式与版本
备份脚本不是拿来就能跑的,首先你得知道你服务器上的mysql是怎么装的。不同安装方式,影响的是 mysqldump 命令的位置、socket文件的路径,以及服务启动方式。
常见的安装方式有几种:
- apt/yum 安装 :例如
apt install mysql-server或yum install mysql-server,二进制文件通常在/usr/bin/mysqldump,配置文件在/etc/mysql/。 - rpm安装 :centos上
rpm -ivh mysql-community-server-*.rpm,相关命令在/usr/bin/下。 - 源码编译安装 :命令通常在你指定的prefix目录下,比如
/usr/local/mysql/bin/mysqldump。 - docker部署 :mysql运行在容器里,备份需要
docker exec进入容器执行,或者使用容器内自带的mysqldump。
排查的方法很简单:
which mysqldump mysql --version
如果 which mysqldump 找不到命令,但mysql是能正常运行的,大概率是因为path环境变量里没有包含mysql bin目录。这时候可以用 find / -name mysqldump -type f 2>/dev/null 全盘找一下。docker部署的话,用 docker ps 找到容器名,再执行 docker exec 容器名 which mysqldump 。
这里我特别强调版本一致性: 备份端和服务端的mysql版本尽量保持一致 。比如你用5.7的 mysqldump 去备份8.0的实例,虽然大多数情况下能用,但遇到特殊字符、权限视图等场景可能出现兼容性问题。最稳妥的方式是:直接使用服务器上对应版本的 mysqldump ,不要图省事从本机随便调一个。
2.2 备份目录与账号规划
很多人的备份脚本跑着跑着突然失败,不是因为命令写错,而是磁盘满了。所以目录规划这一步,建议认真对待。
我推荐的目录结构是这样:
/data/backup/mysql/
├── daily/ # 每日全量备份文件
│ ├── dbname_2024-01-15.sql.gz
│ └── dbname_2024-01-16.sql.gz
├── logs/ # 备份执行日志
│ └── backup.log
└── scripts/ # 备份脚本
└── mysql_backup.sh
把备份目录放在独立的 /data 分区,而不是 /root 或 /home ,是为了避免根分区被备份文件撑爆。你可以用 df -h 看一下各分区使用率,优先选剩余空间最大的挂载点。
mysql账号方面,不要用 root 去跑备份,更不要把root密码直接写在脚本里。我的做法是单独创建一个备份专用账号:
create user 'backup_user'@'localhost' identified by '你的强密码'; grant select, show view, event, trigger, lock tables, process, reload on *.* to 'backup_user'@'localhost'; flush privileges;
各权限的意义我简单说明一下:
select、show view:读取数据。event、trigger:导出事件调度器和触发器。lock tables:备份时锁表,保证一致性。process、reload:mysqldump --single-transaction和刷新日志时需要。
权限最小化原则,既保证了安全,也避免备份账号误操作线上数据。密码不要明文放在所有人可见的脚本里,可以给脚本设置 chmod 700 mysql_backup.sh ,只允许指定用户读取。
2.3 备份脚本需要哪些基础命令
linux定时备份脚本本质上就是一系列shell命令的集合。你在写脚本之前,最好确认以下命令都是可用的:
mysqldump:核心导出工具。gzip:压缩备份文件,建议必装,能节省大量磁盘空间。date:生成日期标记。find:用于清理过期备份。mailx或curl:失败告警通知。
检查命令:
command -v mysqldump gzip date find
缺什么就补什么。比如centos没有mailx,可以 yum install mailx ;如果没有外网邮件服务,可以用 curl 调用企业微信/钉钉机器人接口发告警。
还有一个容易被忽略的点: crontab默认的path非常简单 ,只有 /usr/bin:/bin 。如果你的mysql安装目录不在这个范围内,脚本里直接写 mysqldump 会报 command not found 。解决方案有两种:一种是在脚本开头 export path=/usr/local/mysql/bin:$path ,另一种是全路径调用 /usr/local/mysql/bin/mysqldump 。我习惯两种都做,保险。
3. 编写备份脚本:一版可以直接改的脚本
3.1 脚本主流程与变量设计
下面这版脚本是我在线上用了很久的版本,功能包括全量导出、压缩、过期清理、日志记录。你可以直接复制,把变量改成自己的环境就能用。
#!/bin/bash
#=============================================================
# description: mysql全量备份脚本
# author: 运维老兵
# version: 1.3
#=============================================================
# ---------- 基础变量 ----------
mysql_host="127.0.0.1"
mysql_port="3306"
mysql_user="backup_user"
mysql_pass="这里填你的密码"
mysql_bin="/usr/bin" # mysqldump所在目录
backup_dir="/data/backup/mysql/daily"
log_file="/data/backup/mysql/logs/backup.log"
retention_days=7 # 保留7天备份
date_tag=$(date +%y-%m-%d_%h-%m-%s)
backup_file="${backup_dir}/all_db_${date_tag}.sql"
# ---------- 环境准备 ----------
export path="$mysql_bin:/usr/bin:/bin:$path"
# 如果目录不存在则创建
mkdir -p "${backup_dir}"
mkdir -p "$(dirname "${log_file}")"
# 记录日志函数
log_info() {
echo "[$(date '+%y-%m-%d %h:%m:%s')] [info] $*" >> "${log_file}"
}
log_error() {
echo "[$(date '+y-%m-%d %h:%m:%s')] [error] $*" >> "${log_file}"
}
# ---------- 执行备份 ----------
log_info "开始全量备份"
# 1) 先备份mysql所有库的结构和数据
if mysqldump \
--host="${mysql_host}" \
--port="${mysql_port}" \
--user="${mysql_user}" \
--password="${mysql_pass}" \
--single-transaction \
--routines \
--triggers \
--events \
--set-gtid-purged=off \
--all-databases > "${backup_file}" 2>>"${log_file}"; then
# 2) 压缩备份文件
gzip "${backup_file}"
log_info "备份成功: ${backup_file}.gz"
else
log_error "备份失败,请检查mysql连接和错误日志"
exit 1
fi
# ---------- 清理过期备份 ----------
deleted_files=$(find "${backup_dir}" -name "all_db_*.sql.gz" -mtime +${retention_days} -print)
if [ -n "${deleted_files}" ]; then
find "${backup_dir}" -name "all_db_*.sql.gz" -mtime +${retention_days} -exec rm -f {} \;
log_info "清理过期备份文件:"
echo "${deleted_files}" >> "${log_file}"
fi
log_info "备份任务结束"
这个脚本有几个值得说的设计点。第一,我把所有可控变量集中在脚本头部,换服务器、换密码、调保留天数都只改一个位置,不用满篇找。第二,日志函数统一带了时间戳,后面查问题很方便。第三,备份先落盘、再gzip压缩,这个顺序看起来多了一步,但实际上比直接 mysqldump | gzip > file.sql.gz 更容易排错——如果中间过程出错,你能看到是一个完整的临时sql文件失败,还是压缩失败。
3.2 使用mysqldump做一致性备份
我脚本里用的几个参数,每一个都有讲究,这里拆开讲一下。
--single-transaction 是最关键的一个。它会在备份开始时开启一个可重复读事务,通过innodb的mvcc机制拿到一致性快照。也就是说,备份期间其他会话的增删改不会污染备份数据,同时也不需要锁表。这对于不能停服的线上业务来说,几乎是必选参数。
但要特别注意: --single-transaction 只对innodb表有效 。如果你的库里还有myisam表,那就没办法了,mysql依然会对这部分表加上读锁( lock table ... read ),这是引擎特性决定的。所以当你看到备份日志里有 locking tables 的时候,不用慌,那可能是myisam表在锁。如果myisam表特别多,建议优先把它们迁到innodb,这不仅是备份体验问题,更是数据安全性问题。
--routines --triggers --events 这三个参数分别导出存储过程/函数、触发器、事件调度器。很多人在备份时漏了它们,导致恢复后发现应用大面积报错,因为存储过程全没了。这里有个细节:当后续需要导入的时候,存储过程的定义者是原账号,目标环境的账号不存在时,恢复可能会报 error 1227 ,这个我在后面恢复演练部分会详细说。
--all-databases 表示备份所有库,包括系统库 mysql 、 sys 。我建议默认用这个参数。理由很直接:如果有一天你要把整个实例迁移到新服务器,只备份业务库是远远不够的,授权信息、系统配置都在mysql库里。当然,如果你只关心某个业务库,也可以改成 --databases dbname1 dbname2 ,但请注意: --databases 后面一定要跟库名,而不是裸的 dbname ,这样导出的文件里才会包含 create database if not exists 语句,导入的时候才能自动建库。
--set-gtid-purged=off 这个参数主要给gtid环境用的。如果你的mysql开启了gtid(8.0默认支持),导出时加这个参数可以避免备份文件里带着gtid执行记录,减少后续导入时因为gtid冲突导致的报错。单机没开gtid的可以直接忽略。
3.3 压缩、归档与保留策略
导出的sql文件往往很大,一个500mb的库导出后可能接近1gb,而不压缩的话,每天一个文件,硬盘很快就不够用了。 gzip 压缩率通常能到4:1到10:1,也就是说500mb的sql文件压缩后可能只有几十到一百多mb,这个收益是非常可观的。
使用上就一行:
gzip /data/backup/mysql/daily/all_db_2025-01-15_03-00-01.sql
压缩完之后,原始文件会被替换成 .sql.gz ,记得确认一下。如果你担心gzip没执行成功,可以在脚本里加判断:
if [ -f "${backup_file}.gz" ]; then
log_info "压缩成功"
rm -f "${backup_file}"
else
log_error "压缩失败,保留原始文件"
fi
保留策略我用的是 find -mtime +n 清理n天前的文件。这个 n 要结合你的数据量、磁盘大小、业务需求来决定。我用7天,是因为这个实例每天全量备份一次,7天内的备份文件足够应付绝大多数故障场景。如果你要做月度归档,可以单独把每月1号的备份文件复制到另一个目录,设置不同的保留策略。
清理命令里的一个坑: find 用 -mtime +7 表示“超过7天前修改的文件”,注意它是不含第7天当天的。如果你希望保留正好7天,实际会保留8天的文件,这个细节不算严重,但如果你对保留天数要求精确,建议改用 -mmin +10080 (分钟)。另外,删除文件之前,先 -print 打印出来、写入日志,方便事后审计。
3.4 日志与告警:备份失败要第一时间知道
没有告警的备份是不完整的。凌晨3点跑的备份,如果失败了,总不能等到第二天早上手动登录服务器才发现。我的经验是至少做到两级通知:写日志 + 推送消息。
日志的作用是事后排查,在脚本里已经做了。推送是即时感知,我常用的方式有:
- 邮件 :
mailx -s "mysql备份失败" admin@example.com,需要服务器提前配置好发信服务。 - 企业微信/钉钉机器人 :用
curlpost一段json到机器人webhook,简单直接,不依赖邮箱。
比如推送企业微信机器人,脚本里加一个函数:
notify_wecom() {
local msg="$1"
curl -s -x post 'https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=你的key' \
-h 'content-type: application/json' \
-d "{\"msgtype\":\"text\",\"text\":{\"content\":\"${msg}\"}}"
}
在备份失败的地方调用 notify_wecom "mysql备份失败: $(hostname) $(date)" 。这样出问题第一分钟就能收到消息,而不是第二天被业务方投诉了才知道。
还有一个更“土”但非常有效的办法:把备份日志里的成功记录和备份文件大小汇总成一条消息,每天早上定时发送到运维群。哪怕只是一句“备份成功,文件大小850mb”,大家都安心。失败的时候,消息自然会变成“备份失败”,响应快的多。
4. crontab定时任务配置与日志验证
4.1 crontab语法速查
crontab是linux下的定时任务管理工具,由系统的 cron 守护进程执行。它的语法不复杂:
分 时 日 月 周 命令
* * * * * command
每一位的含义:
| 字段 | 取值范围 | 说明 |
|---|---|---|
| 分 | 0-59 | 每小时的第几分钟 |
| 时 | 0-23 | 每天的第几小时 |
| 日 | 1-31 | 每月的第几天 |
| 月 | 1-12 | 每年的第几个月 |
| 周 | 0-7 | 每周几,0和7都表示周日 |
常用写法举例:
30 3 * * *:每天凌晨3点30分执行。0 */6 * * *:每6小时执行一次。15 2 * * 1:每周一的凌晨2点15分执行。0 0 1 * *:每月1日零点执行。
有几个容易搞混的点: * 是“每一”的意思,比如 * * * * * 就是每分钟执行一次; */5 在分钟位表示每5分钟;周和日同时有限制时,是“或”的关系,不是“与”。这个如果你没接触过,可能觉得绕,但实际用多了就自然记住了。
4.2 配置定时任务并添加环境变量
编辑当前用户的crontab:
crontab -e
加入这样一行:
0 3 * * * /bin/bash /data/backup/mysql/scripts/mysql_backup.sh
这里我建议写全路径 /bin/bash ,而不是直接写脚本路径。因为有些系统的curl初始环境不包含bash的绝对路径,导致cron无法执行脚本。另外,脚本本身需要可执行权限:
chmod +x /data/backup/mysql/scripts/mysql_backup.sh
配置好之后,用 crontab -l 查看当前所有定时任务,确认条目已经写入。
这里有个重要提醒: crontab -e 是每个用户独立的 。你在root用户下配置了任务,它会以root身份执行;你在普通用户下配置,就以普通用户身份执行。脚本里的路径、权限都要匹配对应的执行用户。我见过有人用root配置了备份脚本,脚本里却访问普通用户的家目录,结果执行时权限不够,磁盘写不进去,备份一直失败。所以配置完任务后,第一步就是手动执行一次脚本,确认在目标用户身份下能跑通。
有时候,脚本在手动执行时一切正常,但被crontab调用时却报找不到命令。原因就是我在前面提到的path问题。crontab执行时的path通常被精简为 /usr/bin:/bin ,如果你的 mysqldump 在 /usr/local/mysql/bin ,那就必须把path写进脚本。下面这段放在脚本开头无脑加上:
source /etc/profile export path="/usr/local/mysql/bin:/usr/local/bin:/usr/bin:/bin:$path"
有人觉得加 source /etc/profile 有点多余,但实测下来,它能避免很多“环境变量没加载”的诡异问题,尤其是在 /etc/crontab 里配置任务的时候。
另外,如果你配置了 .my.cnf 或者用密码文件,还要注意cron执行时的家目录和手动执行时可能不一样,密码文件路径会找不到。最稳妥的做法就是在脚本里显式用 --defaults-extra-file=/root/.my.cnf 指定配置文件,或者干脆在脚本变量里写清楚账号密码。
4.3 如何查看crontab执行日志
配置完crontab之后,很多新手做的第一件事是干等第二天,然后打开备份目录看有没有新文件。这种办法太被动了。我一般配置完会立刻做两件事:手动执行脚本一次,然后查看执行日志。
手动执行很简单:
bash /data/backup/mysql/scripts/mysql_backup.sh tail -f /data/backup/mysql/logs/backup.log
如果手动执行正常,说明脚本本身没问题。接着再验证crontab是否真的调用到了脚本。
看crontab的日志,不同的系统位置不太一样:
- centos/rhel 7+ :
/var/log/cron - debian/ubuntu :
/var/log/syslog里过滤cron - systemd杂志 :
journalctl -u crond或journalctl -u cron
比如在centos上:
grep mysql_backup /var/log/cron
能看到类似这样的记录:
jan 15 03:00:01 srv01 crond[12345]: (root) cmd (/bin/bash /data/backup/mysql/scripts/mysql_backup.sh)
如果看到了这条记录,说明crontab确实执行了。接着重点看脚本自己的日志:
cat /data/backup/mysql/logs/backup.log
如果脚本日志里也有了执行记录,那整个链路就通了。接下来几天只需要每天扫一眼日志或等告警消息即可。
这里再分享一个我常用的调试技巧:临时把crontab里的执行时间改成下一分钟,比如当前是14:35,就写 36 14 * * * ,等一分钟后观察 /var/log/cron 和脚本日志,确认没问题后再把时间改回凌晨3点。这样不用等一晚上就能验证整个定时任务是否生效。
5. 常见问题排查与恢复演练
5.1 常见问题速查表
根据我这些年对备份问题的排查经验,把最常踩的坑和对应的解决办法整理成了下面的表,建议收藏:
| 问题现象 | 可能原因 | 排查与解决 |
|---|---|---|
| 手动执行脚本正常,crontab执行后没有新备份 | path环境变量缺失 | 脚本开头加入 export path=/usr/local/mysql/bin:/usr/bin:/bin:$path |
备份日志显示 command not found: mysqldump | mysqldump不在crontab的path中 | 使用全路径调用,或者先 source /etc/profile |
备份时提示 access denied; you need (at least one of) the process privilege | 备份账号权限不足 | 给账号授予 process 和 reload 权限 |
--single-transaction 后仍提示 locking tables | 库中存在myisam表 | myisam必然加锁,建议把核心表转为innodb |
| 备份文件大小为0 | 导出过程中异常中断 | 检查磁盘空间 df -h ;检查mysql是否重启 |
| 磁盘被备份文件写满 | 保留策略未配置或清理失败 | 配置 find -mtime +n -delete ;监控磁盘水位 |
| 日志显示备份成功,但恢复时报语法错误 | mysqldump版本与目标mysql版本差异大 | 保证导出端与导入端版本一致或兼容 |
备份导出的sql文件里有很多 create database 重复 | 使用 --databases 参数包含库名 | 若只想导单个库且不建库,则不加 --databases |
| 收到备份失败告警,但独立重跑成功 | 定时任务执行瞬间业务高峰或锁冲突 | 调整备份时间或加入 --lock-wait-timeout 参数 |
| 邮件告警没收到 | 邮件服务未配置或被限流 | 改用企业微信/钉钉机器人;检查发信日志 |
这里的核心经验是: 不要等到备份真的出问题才开始学排查 。每一条你都应该模拟过一次,知道报错长什么样。比如权限不足的报错,手动执行一次就能看到,完全不用等crontab。
5.2 恢复演练:备份文件能不能用,要演练过才算数
很多人备份做得很勤,但从来没恢复过。等到需要恢复的那一天,才发现备份文件是坏的、缺了依赖库、或者sql版本不兼容。所以我的建议是:新备份方案上线后,强制做一次恢复演练,并且至少每个季度做一次随机抽查。
恢复演练的完整流程分三步。
第一步,选一台测试机或者同一台服务器的测试库。如果有条件,最好用一个新的mysql实例,完全模拟从零恢复。命令很简单:
mysql -uroot -p < /data/backup/mysql/daily/all_db_2025-01-15_03-00-01.sql.gz
但注意,如果文件是 .gz 压缩过的,需要先解压再导入,或者用管道一步完成:
gunzip < /data/backup/mysql/daily/all_db_2025-01-15_03-00-01.sql.gz | mysql -uroot -p
第二步,重点检查恢复后的数据是否完整。不要只是看 mysql> 提示符有没有报错,要实际查表:
use 你的业务库; select count(*) from 核心业务表; show tables;
如果关键表行数和备份前一致,说明这一份备份是可用的。如果行数对不上,那就要排查备份脚本是不是漏了什么表,或者导出过程中有报错被忽略了。
第三步,检查存储过程、触发器、事件有没有恢复成功:
select routine_name from information_schema.routines where routine_schema='你的库'; select trigger_name from information_schema.triggers where trigger_schema='你的库';
这里最常见的坑就是我在前面提到的 error 1227 (42000): access denied; you need (at least one of) the super privilege(s) for this operation 。原因很简单:备份文件里带有原库的 definer 信息,如果目标环境没有那个用户,就会恢复失败。解决办法有两种,一种是恢复前预先创建对应的用户,另一种是导入前把文件里的 definer 去掉:
sed -i 's/definer=[^*]*\*/\*/g' 备份文件.sql
这个命令注意别在生产环境乱用,它只用于恢复演练和灾难恢复场景。
5.3 我的几点实操体会
备份这件事,做得越久越觉得它的重点其实不在“备份”本身,而在“管理”。这里说几点我个人的实操体会。
一是备份时间尽量安排在工作负载最低的时间段。比如凌晨2到4点,大多数业务访问量低,mysqldump对线上影响最小。但也不要盲目选凌晨3点,如果你的业务有凌晨批量任务,最好错开。我一般会看一下慢查询日志和监控面板,挑一个cpu、io都相对空闲的窗口。
二是备份文件一定要定期抽检,不能只看脚本日志写着“成功”就算完。有一次我的备份脚本连续三天都显示成功,但第四天我随手解压了一个文件才发现,里面内容全部是错误日志,原因是磁盘io异常导致mysqldump没有真正读取数据。这个经历让我养成了一个习惯:每次手动检查备份时,不仅看文件存在,还要解压后抽查sql内容,确认里面有关键表的insert语句。
三是脚本上线后不要在没监控的情况下放任不管。哪怕只是每天早上一句“备份成功/失败”的消息推送到工作群,也是非常值得的。人总有忘的时候,系统提醒才是最可靠的。
四是如果业务变化频繁,备份策略也要跟着调整。比如原来一天只有几千条写入,后来某天业务量翻了几十倍,原来的全量备份时间窗口可能就不够了,这时候就要考虑分库备份、增量备份或者升级物理备份工具。没有一劳永逸的备份方案,只有不断跟随业务调整的备份体系。
最后再分享一个小技巧:备份脚本里加一个备份文件完整性校验。压缩完之后,用 md5sum 生成校验值文件,后续无论做异地拷贝还是本地恢复,都能先校验一遍,避免因为文件损坏浪费几个小时。这个习惯不复杂,但关键时刻真的能救命。
我现在的工作流就是:凌晨3点备份,3点10分脚本自动推送一条消息到工作群,里面包含备份文件大小和md5值;我早上到公司扫一眼消息,发现异常就立刻处理。每个月再挑一份备份文件做一次随机解压和恢复验证。这套流程运行到现在,已经帮我避免过至少三次能想象得到的数据灾难。希望你也能搭起自己的这套备份体系,而不是等到数据丢了再去看教程。
以上就是linux服务器下mysql自动备份的实战方案的详细内容,更多关于mysql自动备份的资料请关注代码网其它相关文章!
发表评论