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

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

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

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

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

备份脚本内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#!/bin/bash

# MySQL连接参数
DB_USER="数据库账号"
DB_PASS="数据库密码"

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

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

# 目标服务器的 SSH 用户名和 IP 地址
REMOTE_USER="目标服务器账号"
REMOTE_HOST="目标服务器IP"
REMOTE_DIR="/目标服务器存储路径/$(date +'%Y%m%d')"

# SSH 连接超时时间(单位:秒)
SSH_CONNECT_TIMEOUT=10 # 设置为 10 表示超时10秒

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

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

# 循环备份每个数据库
for DB in $DATABASES; do
BACKUP_FILE="$BACKUP_DIR/$DB-$(date +%Y%m%d%H%M%S).sql.gz"
echo "$(date +%Y%m%d%H%M%S) 备份数据库 $DB 到文件 $BACKUP_FILE"
mysqldump -u $DB_USER -p$DB_PASS --single-transaction --databases $DB | gzip > $BACKUP_FILE
echo "$(date +%Y%m%d%H%M%S) 备份完成"

# 使用 ssh 创建远程目录(如果不存在)
ssh -o ConnectTimeout=$SSH_CONNECT_TIMEOUT $REMOTE_USER@$REMOTE_HOST "mkdir -p $REMOTE_DIR"

# 使用 scp 将备份文件发送到远程服务器
echo "$(date +%Y%m%d%H%M%S) 将备份文件发送到远程服务器..."
scp -o ConnectTimeout=$SSH_CONNECT_TIMEOUT $BACKUP_FILE $REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR
echo "$(date +%Y%m%d%H%M%S) 备份文件发送完成"

# 删除本地备份文件
echo "删除本地备份文件 $BACKUP_FILE"
rm -f $BACKUP_FILE
echo "本地备份文件删除完成"

# 完成
echo "------------------------------"
done >> $LOG_FILE 2>&1

总结

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

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

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