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

总结

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

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

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

相关文章
|
5月前
|
SQL 监控 druid
【性能优化】拒绝性能瓶颈!数据库连接池配置详解与调优实战
本文深入讲解数据库连接池核心原理与调优技巧,涵盖HikariCP和Druid配置要点,解析四大关键参数、黄金连接数公式及Druid监控功能,助你科学设置连接池,避免性能瓶颈。
|
监控 Kubernetes 负载均衡
spring boot应用优化,6s内启动,内存减半
taptap-developer是一个spring boot框架驱动的纯Grpc服务,所以,只用了四步,移除了web和spring cloud相关的模块后,启动速度就稳稳的保持在了6s内。除了启动速度提升外,在服务待机状态下,内存锐减了50%左右,从500M左右的内存占用,缩减到了250M不到。
10266 113
spring boot应用优化,6s内启动,内存减半
|
6月前
|
SQL JSON 分布式计算
【跨国数仓迁移最佳实践6】MaxCompute SQL语法及函数功能增强,10万条SQL转写顺利迁移
本系列文章将围绕东南亚头部科技集团的真实迁移历程展开,逐步拆解 BigQuery 迁移至 MaxCompute 过程中的关键挑战与技术创新。本篇为第六篇,MaxCompute SQL语法及函数功能增强。 注:客户背景为东南亚头部科技集团,文中用 GoTerra 表示。
581 20
|
5月前
|
缓存 前端开发 安全
数据同步原理
Soul网关通过推拉模式实现配置数据同步,支持WebSocket、HTTP长轮询和Zookeeper三种策略。管理员在后台变更配置后,事件被发布并根据同步策略推送到网关,实现秒级更新。HTTP长轮询借鉴Apollo与Nacos设计,结合异步Servlet机制,确保准实时且高效。
数据同步原理
|
弹性计算 Linux 网络安全
阿里云服务器怎么登陆,常见登陆方式教程参考
在连接实例时,首先需要完成身份验证,确保只有授权用户能够访问和管理服务器资源,以增强安全性。创建实例时,您可以选择一个系统预设的用户作为初始登陆用户。实例创建完成后,即可用该用户身份登陆。本文将详细介绍不同用户的特点与区别,以及如何管理这些用户和添加额外的远程连接用户。
5831 12
|
前端开发 算法 测试技术
前端大模型应用笔记(五):大模型基础能力大比拼-计数篇-通义千文 vs 文心一言 vs 智谱 vs 讯飞vsGPT
本文对比测试了通义千文、文心一言、智谱和讯飞等多个国产大模型在处理基础计数问题上的表现,特别是通过链式推理(COT)提示的效果。结果显示,GPTo1-mini、文心一言3.5和讯飞4.0Ultra在首轮测试中表现优秀,而其他模型在COT提示后也能显著提升正确率,唯有讯飞4.0-Lite表现不佳。测试强调了COT在提升模型逻辑推理能力中的重要性,并指出免费版本中智谱GLM较为可靠。
977 0
前端大模型应用笔记(五):大模型基础能力大比拼-计数篇-通义千文 vs 文心一言 vs 智谱 vs 讯飞vsGPT
|
缓存 前端开发 JavaScript
为什么用Vite框架?来看它的核心组件案例详解
Vite 是一款前沿的前端构建工具,以其闪电般的开发服务器和高效的生产构建而著称。它利用现代浏览器对 ES 模块的支持,在开发环境中提供快速启动及按需加载,显著提升了开发体验。Vite 的核心组件包括开发服务器、按需编译、依赖预构建、热模块替换(HMR)、缓存机制、模块路径重写、构建优化和插件系统。通过这些功能,Vite 实现了快速的模块加载、高效的模块更新、减少网络请求、以及生产环境下的代码压缩和优化。Vite 还支持多种前端框架和技术栈,内置 TypeScript 支持,并能处理 CSS 和静态资源,极大地方便了开发者的日常开发工作。
753 9
|
人工智能 自然语言处理 语音技术
通用大模型VS垂直大模型
【7月更文挑战第16天】通用大模型VS垂直大模型
|
Linux Shell
在Linux中,如何使用grep命令查找文件中的内容?
在Linux中,如何使用grep命令查找文件中的内容?
|
Java API
SpringBoot系列之切换log4j日志框架
SpringBoot系列之切换log4j日志框架