【DBA实战】删库跑路?不存在的!生产环境MySQL自动备份全攻略

简介: 本文介绍如何用Shell脚本结合`mysqldump`实现MySQL数据库的自动备份,涵盖备份、压缩、按日期命名及30天自动清理策略,并通过Crontab定时执行,确保数据安全。

前言

在 IT 圈流传着一句玩笑话:“从删库到跑路”。虽然是玩笑,但数据安全绝对是后端开发的生命线。

无论是人为误操作(DELETE 忘加 WHERE)、系统故障,还是黑客勒索,唯一能救你命的只有一样东西——备份

很多开发者在开发环境习惯了手动导出 SQL,但在生产环境,我们需要一套全自动、可追溯、带清理策略的备份方案。今天我们就用 Linux Shell + mysqldump 来实现它。

1. 选择备份工具:mysqldump

MySQL 备份主要分为两种:

  1. 物理备份(XtraBackup): 直接复制磁盘文件,速度快,适合超大数据量(TB级)。
  2. 逻辑备份(mysqldump): 将数据导出为 SQL 语句,可读性好,跨版本兼容性强,适合中小规模数据(几十G以内)。

对于大多数中小型项目,mysqldump 是最通用、最简单的选择。

2. 编写自动备份脚本

我们将编写一个 Shell 脚本,完成以下“一条龙”服务:

  1. 导出数据库。
  2. 压缩文件(节省磁盘空间)。
  3. 按日期命名。
  4. 自动删除 30 天前的旧备份。

创建脚本文件:

Bash

vim /data/scripts/mysql_backup.sh

脚本内容(请根据你的实际情况修改配置项):

Bash

#!/bin/bash
# ================= 配置区域 =================
# 数据库用户名
DB_USER="root"
# 数据库密码 (建议使用 .my.cnf 配置文件以免密码泄露,此处仅为演示)
DB_PASS="你的数据库密码"
# 需要备份的数据库名
DB_NAME="my_app_db"
# 备份文件存放路径
BACKUP_DIR="/data/backup/mysql"
# 获取当前时间,用于文件名
DATE=$(date +%Y%m%d_%H%M%S)
# ===========================================
# 1. 检查备份目录是否存在
if [ ! -d "$BACKUP_DIR" ]; then
    mkdir -p "$BACKUP_DIR"
fi
echo "[Start] 开始备份数据库: $DB_NAME ..."
# 2. 执行备份并压缩
# --single-transaction: 保证InnoDB备份时的数据一致性,不锁表
# --routines --events: 备份存储过程和事件
# | gzip: 管道传输,直接压缩,不占用临时磁盘空间
mysqldump -u$DB_USER -p$DB_PASS --single-transaction --routines --events "$DB_NAME" | gzip > "$BACKUP_DIR/${DB_NAME}_${DATE}.sql.gz"
# 3. 检查备份结果
if [ $? -eq 0 ]; then
    echo "[Success] 备份文件已生成: $BACKUP_DIR/${DB_NAME}_${DATE}.sql.gz"
else
    echo "[Error] 备份失败!"
    exit 1
fi
# 4. 清理旧备份 (保留最近30天)
find "$BACKUP_DIR" -type f -name "*.sql.gz" -mtime +30 -exec rm -rf {} \;
echo "[Cleanup] 已清理30天前的旧备份。"

3. 赋予权限并测试

千万别写完就丢那不管,一定要手动运行一次!

Bash

# 赋予执行权限
chmod +x /data/scripts/mysql_backup.sh
# 手动执行脚本
./mysql_backup.sh

如果看到 [Success] 并且在备份目录下生成了 .sql.gz 文件,说明脚本没问题。

4. 自动化:加入 Crontab

我们通常选择在业务低峰期(比如凌晨 3 点)进行备份。

Bash

crontab -e

添加如下一行:

Bash

# 每天凌晨 03:00 执行数据库备份
0 3 * * * /data/scripts/mysql_backup.sh >> /var/log/mysql_backup.log 2>&1

5. 关键时刻:如何恢复?

备份的目的是为了恢复。如果不会恢复,备份就是一堆废文件。

假设数据库崩了,我们需要用备份文件 my_app_db_20231027.sql.gz 进行恢复:

Bash

# 1. 解压并导入
# gunzip -c : 解压输出到标准输出
# | mysql : 管道输入给 mysql 命令执行
gunzip -c /data/backup/mysql/my_app_db_20231027.sql.gz | mysql -u root -p my_app_db

或者分两步走:

Bash

# 1. 解压
gzip -d my_app_db_20231027.sql.gz
# 2. 导入
mysql -u root -p my_app_db < my_app_db_20231027.sql

6. DBA的忠告

  1. 异地备份: 不要把鸡蛋放在同一个篮子里。脚本生成的备份文件,最好再同步一份到**对象存储(如阿里云OSS)**或者另一台服务器上。否则服务器硬盘坏了,备份和原数据一起没。
  2. 定期演练: 每个季度至少在测试环境试着恢复一次,确保你的备份文件是完好可用的。

总结

数据备份是运维工作的底线。通过这个简单的脚本,我们实现了:

  • 全自动运行
  • 压缩省空间
  • 定期清理

睡个安稳觉,从做好备份开始。

相关文章
|
监控 Kubernetes 负载均衡
spring boot应用优化,6s内启动,内存减半
taptap-developer是一个spring boot框架驱动的纯Grpc服务,所以,只用了四步,移除了web和spring cloud相关的模块后,启动速度就稳稳的保持在了6s内。除了启动速度提升外,在服务待机状态下,内存锐减了50%左右,从500M左右的内存占用,缩减到了250M不到。
10383 113
spring boot应用优化,6s内启动,内存减半
|
2月前
|
弹性计算 人工智能 数据库
阿里云价格最便宜云服务器选购指南:轻量应用服务器38元与9.9元,云服务器99元与199元
2026年阿里云推出多款高性价比云服务器特惠活动,覆盖个人开发者到中小企业的全场景需求。新用户可每日10点、15点抢购轻量应用服务器,2核2G仅38元/年,2核4G低至9.9元/月或199元/年,支持OpenClaw AI助理、Hermes智能体等镜像一键部署。新老用户同享ECS特惠,2核2G固定3M带宽99元/年、2核4G固定5M带宽199元/年,续费同价政策可锁定低价至2029年3月31日。进阶场景还有u2i实例年付3折、第九代企业级ECS 6.4折优惠,兼顾极致性价比与高性能需求。
|
9月前
|
SQL 监控 druid
【性能优化】拒绝性能瓶颈!数据库连接池配置详解与调优实战
本文深入讲解数据库连接池核心原理与调优技巧,涵盖HikariCP和Druid配置要点,解析四大关键参数、黄金连接数公式及Druid监控功能,助你科学设置连接池,避免性能瓶颈。
|
8月前
|
存储 缓存 Ubuntu
Ubuntu 24.04一键重置全攻略(小白必看:快速恢复系统到初始状态)
本文详细介绍Ubuntu 24.04一键重置方法,通过命令行快速恢复系统至初始状态。涵盖更新软件、重装桌面环境、清理系统及创建自动化脚本等步骤,适合新手学习,助您轻松完成系统维护与恢复。
|
9月前
|
缓存 前端开发 安全
数据同步原理
Soul网关通过推拉模式实现配置数据同步,支持WebSocket、HTTP长轮询和Zookeeper三种策略。管理员在后台变更配置后,事件被发布并根据同步策略推送到网关,实现秒级更新。HTTP长轮询借鉴Apollo与Nacos设计,结合异步Servlet机制,确保准实时且高效。
数据同步原理
|
SQL 数据库
SQL Server 如何进行备份?
【8月更文挑战第20天】SQL Server 如何进行备份?
701 3
|
定位技术
eharts 中国地图添加城市(散点图实现,含获取城市坐标、图片转base64、自定义散点样式)
eharts 中国地图添加城市(散点图实现,含获取城市坐标、图片转base64、自定义散点样式)
2866 9
|
人工智能 自然语言处理 语音技术
通用大模型VS垂直大模型
【7月更文挑战第16天】通用大模型VS垂直大模型