【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. 定期演练: 每个季度至少在测试环境试着恢复一次,确保你的备份文件是完好可用的。

总结

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

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

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

相关文章
|
20天前
|
SQL 监控 druid
【性能优化】拒绝性能瓶颈!数据库连接池配置详解与调优实战
本文深入讲解数据库连接池核心原理与调优技巧,涵盖HikariCP和Druid配置要点,解析四大关键参数、黄金连接数公式及Druid监控功能,助你科学设置连接池,避免性能瓶颈。
|
监控 Kubernetes 负载均衡
spring boot应用优化,6s内启动,内存减半
taptap-developer是一个spring boot框架驱动的纯Grpc服务,所以,只用了四步,移除了web和spring cloud相关的模块后,启动速度就稳稳的保持在了6s内。除了启动速度提升外,在服务待机状态下,内存锐减了50%左右,从500M左右的内存占用,缩减到了250M不到。
10142 113
spring boot应用优化,6s内启动,内存减半
|
21天前
|
Java Linux 开发工具
Linux
本文介绍如何将一个简单的SpringBoot应用打包并部署到Linux服务器。包括项目搭建、JAR包打包、JDK安装配置、应用上传与启动,以及通过心跳接口验证服务是否正常运行的完整流程,适用于Java应用的Linux部署入门学习。
|
15天前
|
Ubuntu Linux 开发者
Ubuntu 24.04 安装 Docker 与 Compose:完整稳定版教程(小白必看)
本教程详细介绍在Ubuntu 24.04上安装Docker与Docker Compose的完整步骤,适合新手操作。涵盖环境准备、软件安装、验证及常见问题解决,助你快速掌握容器化部署技能,提升开发效率。
|
21天前
|
缓存 前端开发 安全
数据同步原理
Soul网关通过推拉模式实现配置数据同步,支持WebSocket、HTTP长轮询和Zookeeper三种策略。管理员在后台变更配置后,事件被发布并根据同步策略推送到网关,实现秒级更新。HTTP长轮询借鉴Apollo与Nacos设计,结合异步Servlet机制,确保准实时且高效。
数据同步原理
|
20天前
|
人工智能 Java 微服务
微服务保护方案
Spring Cloud微服务中,服务保护机制对保障系统稳定性至关重要,主要包括熔断、降级、超时、线程隔离和限流。熔断快速失败避免雪崩,降级提供默认响应保证核心功能,超时防止长时间等待,线程隔离限制故障影响范围,限流控制流量峰值,共同提升系统容错与可用性。
微服务保护方案
|
20天前
|
Java 数据库连接 调度
xxljob执行源码分析
包含中文注释的XXL-JOB源码包及分析流程,涵盖架构设计与核心源码解析。重点包括任务调度、线程池管理、心跳注册、失败重试与告警机制、日志清理及时间轮调度原理,全面剖析分布式任务调度系统实现细节。(238字)
|
弹性计算 Linux 网络安全
阿里云服务器怎么登陆,常见登陆方式教程参考
在连接实例时,首先需要完成身份验证,确保只有授权用户能够访问和管理服务器资源,以增强安全性。创建实例时,您可以选择一个系统预设的用户作为初始登陆用户。实例创建完成后,即可用该用户身份登陆。本文将详细介绍不同用户的特点与区别,以及如何管理这些用户和添加额外的远程连接用户。
5368 12
|
SQL 关系型数据库 MySQL
数据库灾难应对:MySQL误删除数据的救赎之道,技巧get起来!之binlog
《数据库灾难应对:MySQL误删除数据的救赎之道,技巧get起来!之binlog》介绍了如何利用MySQL的二进制日志(Binlog)恢复误删除的数据。主要内容包括: 1. **启用二进制日志**:在`my.cnf`中配置`log-bin`并重启MySQL服务。 2. **查看二进制日志文件**:使用`SHOW VARIABLES LIKE &#39;log_%&#39;;`和`SHOW MASTER STATUS;`命令获取当前日志文件及位置。 3. **创建数据备份**:确保在恢复前已有备份,以防意外。 4. **导出二进制日志为SQL语句**:使用`mysqlbinlog`
997 2
|
弹性计算 监控 安全
slb使用中安全问题
【11月更文挑战第1天】
354 4