定期备份数据库:基于 Shell 脚本的自动化方案

简介: 本篇文章分享一个简单的 Shell 脚本,用于定期备份 MySQL 数据库,并自动将备份传输到远程服务器,帮助防止数据丢失。

数据库备份这件事,说实话,我一直没怎么上心。平时服务器跑得好好的,谁会想着备份呢?直到某天真出问题了,才意识到自己平时有多“懒”。

我相信很多人跟我一样,觉得这东西看起来麻烦,等到数据库挂了、数据丢失了,才感叹自己怎么就没提前准备好呢?

有一次数据库问题搞得我手忙脚乱,最后还好有个朋友给了我个备份文件,才算是有惊无险。

经历了这次以后,我决定不能再拖了,必须把备份这事儿自动化起来。所以,我写了一个简单的 Shell 脚本,每天自动帮我把数据库备份好,还自动传到远程服务器上,再也不用担心数据丢失了。

今天就把这个脚本分享出来,或许能帮到和我一样平时“佛系”的朋友。脚本简单好用,拿来直接用就行,具体的实现逻辑也不复杂,如果你有其他需求,可以自行优化。

备份脚本内容

#!/bin/bash

# MySQL连接参数(可以使用 ~/.my.cnf 文件代替)
DB_USER="数据库账号"
DB_PASS="数据库密码"

# 备份目录
BACKUP_DIR="/数据库备份目录"

# 日志文件路径
CURRENT_DATE=$(date +'%Y%m%d%H%M%S')
LOG_FILE="/数据库备份日志目录/$CURRENT_DATE.log"

# 目标服务器的 SSH 用户名和 IP 地址,如果不需要同步到其他服务器则不需要填写
# -----------------------------
REMOTE_USER="" # 目标服务器账号
REMOTE_HOST="" #目标服务器IP
REMOTE_DIR="" # 目标服务器存储路径
# -----------------------------

# SSH 连接超时时间(单位:秒)
SSH_CONNECT_TIMEOUT=10

# 创建备份和日志目录(如果不存在)
mkdir -p "$BACKUP_DIR"
mkdir -p "$(dirname "$LOG_FILE")"

# 获取所有数据库列表
DATABASES=$(mysql -e "SHOW DATABASES;" | grep -Ev "(Database|information_schema|performance_schema|mysql)")

# 循环备份每个数据库
BACKUP_FILES=()
for DB in $DATABASES; do
    BACKUP_FILE="$BACKUP_DIR/$DB-$CURRENT_DATE.sql.gz"
    echo "$(date +%Y%m%d%H%M%S) 备份数据库 $DB 到文件 $BACKUP_FILE" >> $LOG_FILE
    if ! mysqldump -u $DB_USER -p$DB_PASS --single-transaction --databases $DB | gzip > $BACKUP_FILE; then
        echo "$(date +%Y%m%d%H%M%S) 备份数据库 $DB 失败" >> $LOG_FILE
        continue  # 跳过当前数据库,继续备份其他数据库
    fi
    echo "$(date +%Y%m%d%H%M%S) 备份完成" >> $LOG_FILE
    BACKUP_FILES+=($BACKUP_FILE)
done

# 创建远程备份目录
if [ -n "$REMOTE_USER" ] && [ -n "$REMOTE_HOST" ] && [ -n "$REMOTE_DIR" ]; then
    ssh -o ConnectTimeout=$SSH_CONNECT_TIMEOUT $REMOTE_USER@$REMOTE_HOST "mkdir -p $REMOTE_DIR"

    # 批量传输备份文件
    if [ ${#BACKUP_FILES[@]} -gt 0 ]; then
        echo "$(date +%Y%m%d%H%M%S) 将备份文件发送到远程服务器..." >> $LOG_FILE
        scp -o ConnectTimeout=$SSH_CONNECT_TIMEOUT ${BACKUP_FILES[@]} $REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR
        echo "$(date +%Y%m%d%H%M%S) 备份文件发送完成" >> $LOG_FILE
    fi

    # 删除本地备份文件
    echo "删除本地备份文件..." >> $LOG_FILE
    for BACKUP_FILE in "${BACKUP_FILES[@]}"; do
        rm -f $BACKUP_FILE
    done
    echo "本地备份文件删除完成" >> $LOG_FILE
fi

# 完成
echo "------------------------------" >> $LOG_FILE

关于同步到其他服务器

如果需要同步到远程服务器的话,为了避免每次执行脚本时都手动输入密码,可以使用 SSH 密钥对(公钥和私钥)来实现免密登录

具体步骤如下:

在数据库所在机器上生成 SSH 密钥对

首先,确保你在数据库机器上没有已有的 SSH 密钥对(如果有,跳过这一步)。在 A 机器上运行以下命令来生成一个新的 SSH 密钥对:

ssh-keygen -t rsa -b 2048

按照提示操作,默认保存路径是 ~/.ssh/id_rsa​,可以选择直接按 Enter 使用默认路径。生成密钥后,你会得到两个文件:

  • id_rsa:私钥文件,保存在数据库所在机器上。
  • id_rsa.pub:公钥文件,用于复制到需要同步的机器。

将公钥复制到需要同步的机器

你需要将 id_rsa.pub​ 的内容复制到需要同步的机器上,添加到目标用户的 ~/.ssh/authorized_keys​ 文件中。你可以使用以下命令来实现这一点:

ssh-copy-id -i ~/.ssh/id_rsa.pub 需要同步的机器目标用户@需要同步的机器的IP

如果你的目标用户在需要同步的机器上是 remote_user​,IP 地址是 192.168.1.100​,那么命令会是:

ssh-copy-id -i ~/.ssh/id_rsa.pub remote_user@192.168.1.100

执行后,你将被提示输入需要同步的机器的密码,输入一次后,公钥将被自动添加到需要同步的机器上的 ~/.ssh/authorized_keys​ 文件中。

验证免密登录

此时,你应该能够从数据库所在机器免密登录到需要同步的机器,试试这个命令:

ssh remote_user@192.168.1.100

如果成功登录且没有要求输入密码,则说明配置成功。

总结

虽然数据库备份在日常中似乎并不重要,但等到真正出问题时,备份的价值就凸显出来了。

有了这个脚本后,我再也不用手动备份数据库,也不怕丢数据了。

希望这份脚本能帮到大家。

相关文章
|
6天前
|
存储 安全 Unix
七、Linux Shell 与脚本基础
别再一遍遍地敲重复的命令了,把它们写进Shell脚本,就能一键搞定。脚本本质上就是个存着一堆命令的文本文件,但要让它“活”起来,有几个关键点:文件开头最好用#!/usr/bin/env bash来指定解释器,并用chmod +x给它执行权限。执行时也有讲究:./script.sh是在一个新“房间”(子Shell)里跑,不影响你;而source script.sh是在当前“房间”里跑,适合用来加载环境变量和配置文件。
119 9
|
5月前
|
人工智能 自然语言处理 算法
AI智能混剪视频大模型开发方案:从文字到视频的自动化生成·优雅草卓伊凡
AI智能混剪视频大模型开发方案:从文字到视频的自动化生成·优雅草卓伊凡
376 0
AI智能混剪视频大模型开发方案:从文字到视频的自动化生成·优雅草卓伊凡
|
6天前
|
存储 Shell Linux
八、Linux Shell 脚本:变量与字符串
Shell脚本里的变量就像一个个贴着标签的“箱子”。装东西(赋值)时,=两边千万不能有空格。用单引号''装进去的东西会原封不动,用双引号""则会让里面的$变量先“变身”再装箱。默认箱子只能在当前“房间”(Shell进程)用,想让隔壁房间(子进程)也能看到,就得给箱子盖个export的“出口”戳。此外,Shell还自带了$?(上条命令的成绩单)和$1(别人递进来的第一个包裹)等许多特殊箱子,非常有用。
56 2
|
25天前
|
数据采集 监控 Shell
无需Python:Shell脚本如何成为你的自动化爬虫引擎?
Shell脚本利用curl/wget发起请求,结合文本处理工具构建轻量级爬虫,支持并行加速、定时任务、增量抓取及分布式部署。通过随机UA、异常重试等优化提升稳定性,适用于日志监控、价格追踪等场景。相比Python,具备启动快、资源占用低的优势,适合嵌入式或老旧服务器环境,复杂任务可结合Python实现混合编程。
|
4月前
|
Shell
Shell脚本循环控制:shift、continue、break、exit指令
使用这些命令可以让你的Shell脚本像有生命一样动起来。正确使用它们,你的脚本就能像一场精心编排的舞蹈剧目,既有旋律的起伏,也有节奏的跳跃,最终以一场惊艳的表演结束。每一个动作、每一个转折点,都准确、优雅地完成所需要表达的逻辑。如此,你的脚本不只是冰冷的代码,它透过终端的界面,跳着有节奏的舞蹈,走进观众——使用者的心中。
203 60
|
3月前
|
Web App开发 缓存 安全
Linux一键清理系统垃圾:释放30GB空间的Shell脚本实战​
这篇博客介绍了一个实用的Linux系统盘清理脚本,主要功能包括: 安全权限检查和旧内核清理,保留当前使用内核 7天以上日志文件清理和系统日志压缩 浏览器缓存(Chrome/Firefox)、APT缓存、临时文件清理 智能清理Snap旧版本和Docker无用数据 提供磁盘空间使用前后对比和大文件查找功能 脚本采用交互式设计确保安全性,适合定期维护开发环境、服务器和个人电脑。文章详细解析了脚本的关键功能代码,并给出了使用建议。完整脚本已开源,用户可根据需求自定义调整清理策略。
209 1
|
4月前
|
机器学习/深度学习 Kubernetes 监控
Kubernetes 节点故障自愈方案:结合 Node Problem Detector 与自动化脚本
本文深入探讨了Kubernetes节点故障自愈方案,结合Node Problem Detector(NPD)与自动化脚本,提供技术细节、完整代码示例及实战验证。文章分析了硬件、系统和内核层面的典型故障场景,指出现有监控体系的局限性,并提出基于NPD的实时事件捕获与自动化诊断树的改进方案。通过深度集成NPD、设计自动化修复引擎以及展示内核死锁恢复的实战案例,文章详细说明了自愈流程的实现步骤与性能优势。此外,还提供了生产环境部署指南、高可用架构设计及安全防护措施,并展望了机器学习增强故障预测和混沌工程验证的进阶优化方向。全文约1.2万字,适合希望提升Kubernetes集群稳定性的技术人员阅读。
141 1
|
5月前
|
存储 Unix Shell
确定Shell脚本在操作系统中的具体位置方法。
这对于掌握Linux的文件系统组织结构和路径方面的理解很有帮助,是我们日常工作和学习中都可能使用到的知识。以上讲解详细清晰,应用简便,是每一个想要精通操作系统的计算机爱好者必备的实用技能。
105 17
|
7月前
|
关系型数据库 MySQL Shell
MySQL 备份 Shell 脚本:支持远程同步与阿里云 OSS 备份
一款自动化 MySQL 备份 Shell 脚本,支持本地存储、远程服务器同步(SSH+rsync)、阿里云 OSS 备份,并自动清理过期备份。适用于数据库管理员和开发者,帮助确保数据安全。
|
5月前
|
Linux Shell
Centos或Linux编写一键式Shell脚本删除用户、组指导手册
Centos或Linux编写一键式Shell脚本删除用户、组指导手册
126 4