MySQL 备份与恢复

数据库定期备份在生产环境中是很重要的。

它能极大地提高数据库的健壮性,可以在误操作修改或删除数据后及时恢复,也可以通过查看备份了解数据的近期情况。

下面以每天凌晨 2 点定时备份指定数据库,且只保留 7 天的备份为例,介绍下 Docker 部署的 MySQL 的备份与恢复。

备份

  1. 编写备份脚本
vim /home/docker/mysql/backup/mysql_backup.sh
#!/bin/bash

# 保存天数
SAVE_DAYS=7
# 数据库配置
CONTAINER_NAME="数据库容器名"
MYSQL_USER="数据库账号"
MYSQL_PASSWORD="数据库密码"
# 如果要备份所有数据库,可以将 DATABASE_NAME 设置为 "--all-databases"
DATABASE_NAME="要备份的数据库(多个以空格分隔)"

# 备份目录配置
BACKUP_DIR="/home/docker/mysql/backup"

# 生成备份文件名
CURRENT_DATE=$(date +"%Y%m%d_%H%M%S")
BACKUP_FILE="$BACKUP_DIR/backup_$CURRENT_DATE.sql.gz"

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

# 执行备份并压缩
# 警告:在命令行使用密码有安全风险,请根据需要考虑使用配置文件
# 由于数据库是 Docker 部署的,所以执行时需要在前面加上 docker exec 容器名
docker exec "$CONTAINER_NAME" mysqldump -u"$MYSQL_USER" -p"$MYSQL_PASSWORD" --databases $DATABASE_NAME | gzip > "$BACKUP_FILE"

echo "Backup completed successfully: $BACKUP_FILE"

# 删除旧备份,只保留最新的几个文件
# 列出备份文件,按时间倒序,然后从指定行开始删除
ls -t "$BACKUP_DIR"/*.sql.gz 2>/dev/null | tail -n +$(($SAVE_DAYS + 1)) | xargs -r rm -f
  1. 给脚本赋予执行权限
chmod +x /home/docker/mysql/backup/mysql_backup.sh
  1. 编写定时任务
crontab -e
在最后一行添加如下脚本
0 2 * * * /home/docker/mysql/backup/mysql_backup.sh
  1. 查看定时任务脚本
crontab -l
0 1 * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null
0 2 * * * /home/docker/mysql/backup/mysql_backup.sh

恢复

方法一:直接使用 zcat 管道恢复(推荐)

解压并直接恢复到 MySQL

zcat 备份文件 | mysql -u 数据库用户名 -p 数据库密码

方法二:先解压再恢复

gunzip -c 备份文件名.sql.gz > 备份文件名.sql
mysql -u 数据库用户名 -p 数据库密码 < 备份文件名.sql
posted @ 2025-10-21 22:22  天航星  阅读(35)  评论(0)    收藏  举报