数据库备份这件事,说实话,我一直没怎么上心。平时服务器跑得好好的,谁会想着备份呢?直到某天真出问题了,才意识到自己平时有多“懒”。
我相信很多人跟我一样,觉得这东西看起来麻烦,等到数据库挂了、数据丢失了,才感叹自己怎么就没提前准备好呢?
有一次数据库问题搞得我手忙脚乱,最后还好有个朋友给了我个备份文件,才算是有惊无险。
经历了这次以后,我决定不能再拖了,必须把备份这事儿自动化起来。所以,我写了一个简单的 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
DB_USER="数据库账号" DB_PASS="数据库密码"
BACKUP_DIR="/数据库备份目录"
LOG_FILE="/数据库备份日志目录/$(date +'%Y%m%d').log"
REMOTE_USER="目标服务器账号" REMOTE_HOST="目标服务器IP" REMOTE_DIR="/目标服务器存储路径/$(date +'%Y%m%d')"
SSH_CONNECT_TIMEOUT=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 -o ConnectTimeout=$SSH_CONNECT_TIMEOUT $REMOTE_USER@$REMOTE_HOST "mkdir -p $REMOTE_DIR"
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
|
总结
虽然数据库备份在日常中似乎并不重要,但等到真正出问题时,备份的价值就凸显出来了。
有了这个脚本后,我再也不用手动备份数据库,也不怕丢数据了。
希望这份脚本能帮到大家。
星河避难所
本篇文章分享一个简单的 Shell 脚本,用于定期备份 MySQL 数据库,并自动将备份传输到远程服务器,帮助防止数据丢失。
本文是原创文章,采用CC BY-NC-SA 4.0协议,完整转载请注明来自星河避难所