定期备份数据库:基于 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

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

总结

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

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

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

相关文章
|
2月前
|
存储 关系型数据库 分布式数据库
PolarDB开源数据库进阶课5 在线备份
本文介绍了如何在PolarDB RAC一写多读集群中进行在线备份,特别针对共享存储模式。通过使用`polar_basebackup`工具,可以将实例的本地数据和共享数据备份到本地盘中。实验环境依赖于Docker容器中用loop设备模拟的共享存储。
64 1
|
4天前
|
存储 关系型数据库 MySQL
利用Cron表达式实现MySQL数据库的定时备份
以上就是如何使用Cron表达式和mysqldump命令实现MySQL数据库的定时备份。这种方法的优点是简单易用,而且可以根据需要定制备份的时间和频率。但是,它也有一些限制,例如,它不能备份MySQL服务器的配置文件和用户账户信息,也不能实现增量备份。如果需要更复杂的备份策略,可能需要使用专门的备份工具或服务。
33 15
|
1月前
|
关系型数据库 MySQL Java
【YashanDB知识库】原生mysql驱动配置连接崖山数据库
【YashanDB知识库】原生mysql驱动配置连接崖山数据库
【YashanDB知识库】原生mysql驱动配置连接崖山数据库
|
1月前
|
关系型数据库 MySQL 数据库连接
docker拉取MySQL后数据库连接失败解决方案
通过以上方法,可以解决Docker中拉取MySQL镜像后数据库连接失败的常见问题。关键步骤包括确保容器正确启动、配置正确的环境变量、合理设置网络和权限,以及检查主机防火墙设置等。通过逐步排查,可以快速定位并解决连接问题,确保MySQL服务的正常使用。
291 82
|
6天前
|
SQL 关系型数据库 MySQL
大数据新视界--大数据大厂之MySQL数据库课程设计:MySQL 数据库 SQL 语句调优方法详解(2-1)
本文深入介绍 MySQL 数据库 SQL 语句调优方法。涵盖分析查询执行计划,如使用 EXPLAIN 命令及理解关键指标;优化查询语句结构,包括避免子查询、减少函数使用、合理用索引列及避免 “OR”。还介绍了索引类型知识,如 B 树索引、哈希索引等。结合与 MySQL 数据库课程设计相关文章,强调 SQL 语句调优重要性。为提升数据库性能提供实用方法,适合数据库管理员和开发人员。
|
5天前
|
关系型数据库 MySQL 大数据
大数据新视界--大数据大厂之MySQL 数据库课程设计:MySQL 数据库 SQL 语句调优的进阶策略与实际案例(2-2)
本文延续前篇,深入探讨 MySQL 数据库 SQL 语句调优进阶策略。包括优化索引使用,介绍多种索引类型及避免索引失效等;调整数据库参数,如缓冲池、连接数和日志参数;还有分区表、垂直拆分等其他优化方法。通过实际案例分析展示调优效果。回顾与数据库课程设计相关文章,强调全面认识 MySQL 数据库重要性。为读者提供综合调优指导,确保数据库高效运行。
|
1天前
|
负载均衡 算法 关系型数据库
大数据新视界--大数据大厂之MySQL数据库课程设计:MySQL集群架构负载均衡故障排除与解决方案
本文深入探讨 MySQL 集群架构负载均衡的常见故障及排除方法。涵盖请求分配不均、节点无法响应、负载均衡器故障等现象,介绍多种负载均衡算法及故障排除步骤,包括检查负载均衡器状态、调整算法、诊断修复节点故障等。还阐述了预防措施与确保系统稳定性的方法,如定期监控维护、备份恢复策略、团队协作与知识管理等。为确保 MySQL 数据库系统高可用性提供全面指导。
|
3月前
|
关系型数据库 MySQL 数据库连接
数据库连接工具连接mysql提示:“Host ‘172.23.0.1‘ is not allowed to connect to this MySQL server“
docker-compose部署mysql8服务后,连接时提示不允许连接问题解决
|
1月前
|
消息中间件 缓存 NoSQL
缓存与数据库的一致性方案,Redis与Mysql一致性方案,大厂P8的终极方案(图解+秒懂+史上最全)
缓存与数据库的一致性方案,Redis与Mysql一致性方案,大厂P8的终极方案(图解+秒懂+史上最全)
|
2月前
|
关系型数据库 MySQL 数据库
Docker Compose V2 安装常用数据库MySQL+Mongo
以上内容涵盖了使用 Docker Compose 安装和管理 MySQL 和 MongoDB 的详细步骤,希望对您有所帮助。
262 42

热门文章

最新文章