MySQL、PostgreSQL 数据库通过定时任务进行完整备份
介绍:此博客可以将服务器A中 Docker容器中 的MySQL、PostgreSQL 数据库通过脚本进行备份,传输,恢复到服务器B中Docker容器中的MySQL、PostgreSQL 数据库中。
前置条件,需要在服务器A上对服务器B进行免密登录
在服务器A上执行 ssh-keygen -t rsa -b 2048
按回车 使用默认路径 /root/.ssh/id_rsa
ssh-copy-id root@192.168.115.139
输入 root 用户的密码
测试免密登录 ssh root@192.168.115.139
MySQL数据库备份脚本
1、只将服务器A的数据备份到服务器B,适用于服务器B没有MySQL容器的情况,会生成一个sql文件保存到服务器B的指定文件夹中
backup_mysql_to_B_1.sh
# 需要在服务器A上执行 ssh-keygen -t rsa -b 2048 按回车 使用默认路径 /root/.ssh/id_rsa
# ssh-copy-id root@192.168.115.139 输入 root 用户的密码。
# 测试免密登录 ssh root@192.168.115.139
# 自动备份docker中的pg数据库的OA数据库到服务器B的/root/backup
# 添加可执行权限 chmod +x /root/backup_mysql_to_B.sh
# 运行脚本命令 /root/backup_mysql_to_B.sh
#!/bin/bash
# 源数据库信息
SOURCE_CONTAINER="2a169d86a725" # MySQL 容器ID或名称
SOURCE_DB="OA" # MySQL 数据库名称
SOURCE_USER="root" # MySQL 数据库用户名
SOURCE_PASSWORD="root" # MySQL 数据库密码
BACKUP_DIR="/root/backups" # 本地备份存放目录
BACKUP_FILE="${BACKUP_DIR}/mysql_backup_$(date +%Y%m%d).sql" # 本地备份文件路径
# 目标机器信息
TARGET_USER="root" # 目标服务器B的用户名
TARGET_IP="192.168.115.139" # 目标服务器B的IP地址
TARGET_DIR="/root/backup" # 目标机器上的备份目录
# Step 1: 创建本地备份目录(如果不存在)
mkdir -p $BACKUP_DIR
# Step 2: 备份 MySQL 数据库
echo "Starting MySQL database backup..."
docker exec $SOURCE_CONTAINER mysqldump -u$SOURCE_USER -p$SOURCE_PASSWORD $SOURCE_DB > $BACKUP_FILE
# Step 3: 检查备份文件是否成功生成
if [ -f $BACKUP_FILE ]; then
echo "Backup successful: $BACKUP_FILE"
else
echo "Backup failed. Exiting."
exit 1
fi
# Step 4: 将备份文件传输到目标服务器B
echo "Transferring backup to ${TARGET_USER}@${TARGET_IP}:${TARGET_DIR}..."
scp $BACKUP_FILE ${TARGET_USER}@${TARGET_IP}:${TARGET_DIR}
# Step 5: 检查传输是否成功
if [ $? -eq 0 ]; then
echo "Backup transferred successfully to ${TARGET_IP}:${TARGET_DIR}"
else
echo "Backup transfer failed. Please check SSH connectivity."
exit 1
fi
# Step 6: 清理本地备份文件(可选)
# rm -f $BACKUP_FILE
echo "MySQL database backup and transfer completed successfully."
2、将服务器A的数据库备份到服务器B,并将备份的sql恢复到服务器B的 Docker中 的 MySQL容器中 适用于服务器B有 MySQL容器的情况,可以进行自动备份,传输,恢复操作
backup_mysql_to_B.sh
# 需要在服务器A上执行 ssh-keygen -t rsa -b 2048 按回车 使用默认路径 /root/.ssh/id_rsa
# ssh-copy-id root@192.168.115.139 输入 root 用户的密码。
# 测试免密登录 ssh root@192.168.115.139
# 自动备份docker中的pg数据库的OA数据库到服务器B的/root/backup 并写入到服务器B的pg数据库中,需要提前在服务器B创建相应的OA数据库
# 添加可执行权限 chmod +x /root/backup_mysql_to_B.sh
# 运行脚本命令 /root/backup_mysql_to_B.sh
#!/bin/bash
# 源数据库信息
SOURCE_CONTAINER="2a169d86a725" # MySQL 容器ID或名称
SOURCE_DB="OA" # 源数据库名称
SOURCE_USER="root" # 源数据库用户名
SOURCE_PASSWORD="root" # 源数据库密码
BACKUP_DIR="/root/backups" # 本地备份目录
BACKUP_FILE="${BACKUP_DIR}/mysql_backup_$(date +%Y%m%d).sql" # 本地备份文件路径
# 目标机器信息
TARGET_USER="root" # 目标服务器B的用户名
TARGET_IP="192.168.115.139" # 目标服务器B的IP地址
TARGET_DIR="/root/backup" # 目标机器上的备份目录
TARGET_DB="OA" # 目标数据库名称
TARGET_CONTAINER="9907f7704987" # 服务器B上的目标MySQL容器名称
TARGET_USER_DB="root" # 目标数据库用户名
TARGET_PASSWORD_DB="root" # 目标数据库密码
# Step 1: 创建本地备份目录(如果不存在)
mkdir -p $BACKUP_DIR
# Step 2: 备份 MySQL 数据库
echo "Starting MySQL database backup..."
docker exec $SOURCE_CONTAINER mysqldump -u$SOURCE_USER -p$SOURCE_PASSWORD $SOURCE_DB > $BACKUP_FILE
# Step 3: 检查备份文件是否成功生成
if [ -f $BACKUP_FILE ]; then
echo "Backup successful: $BACKUP_FILE"
else
echo "Backup failed. Exiting."
exit 1
fi
# Step 4: 将备份文件传输到目标服务器B
echo "Transferring backup to ${TARGET_USER}@${TARGET_IP}:${TARGET_DIR}..."
scp $BACKUP_FILE ${TARGET_USER}@${TARGET_IP}:${TARGET_DIR}
# Step 5: 检查传输是否成功
if [ $? -eq 0 ]; then
echo "Backup transferred successfully to ${TARGET_IP}:${TARGET_DIR}"
else
echo "Backup transfer failed. Please check SSH connectivity."
exit 1
fi
# Step 6: 恢复备份到目标服务器B的Docker容器数据库
echo "Restoring backup to MySQL container database on machine B..."
ssh ${TARGET_USER}@${TARGET_IP} << EOF
docker exec -i ${TARGET_CONTAINER} mysql -u${TARGET_USER_DB} -p${TARGET_PASSWORD_DB} ${TARGET_DB} < ${TARGET_DIR}/$(basename ${BACKUP_FILE})
EOF
if [ $? -eq 0 ]; then
echo "Backup successfully restored to target MySQL database."
else
echo "Database restore failed. Please check the target container and database settings."
exit 1
fi
# Step 7: 清理本地备份文件(可选)
# rm -f $BACKUP_FILE
echo "MySQL database backup, transfer, and restore completed successfully."
PostgreSQL 数据库备份脚本
1、只将服务器A的数据备份到服务器B,适用于服务器B没有 PostgreSQL 容器的情况,会生成一个sql文件保存到服务器B的指定文件夹中
backup_pg_to_B_1.sh
# 需要在服务器A上执行 ssh-keygen -t rsa -b 2048 按回车 使用默认路径 /root/.ssh/id_rsa
# ssh-copy-id root@192.168.115.139 输入 root 用户的密码。
# 测试免密登录 ssh root@192.168.115.139
# 自动备份docker中的pg数据库的OA数据库到服务器B的/root/backup
# 添加可执行权限 chmod +x /root/backup_mysql_to_B.sh
# 运行脚本命令 /root/backup_mysql_to_B.sh
#!/bin/bash
# 源数据库信息
SOURCE_CONTAINER="2a169d86a725" # PostgreSQL 容器ID或名称
SOURCE_DB="OA" # 数据库名称
SOURCE_USER="root" # 数据库用户名
SOURCE_PASSWORD="root" # 数据库密码
BACKUP_DIR="/root/backups" # 本地备份存放目录
BACKUP_FILE="${BACKUP_DIR}/backup_$(date +%Y%m%d).sql" # 备份文件路径
# 目标机器信息
TARGET_USER="root" # 服务器B用户名
TARGET_IP="192.168.115.139" # 服务器B的IP地址
TARGET_DIR="/root/backup" # 目标机器上的备份目录
# 设置 PostgreSQL 密码环境变量
export PGPASSWORD=$SOURCE_PASSWORD
# Step 1: 创建本地备份目录(如果不存在)
mkdir -p $BACKUP_DIR
# Step 2: 备份 PostgreSQL 数据库
echo "Starting database backup..."
docker exec $SOURCE_CONTAINER pg_dump -U $SOURCE_USER $SOURCE_DB > $BACKUP_FILE
# Step 3: 检查备份文件是否成功生成
if [ -f $BACKUP_FILE ]; then
echo "Backup successful: $BACKUP_FILE"
else
echo "Backup failed. Exiting."
exit 1
fi
# Step 4: 将备份文件传输到目标服务器B
echo "Transferring backup to ${TARGET_USER}@${TARGET_IP}:${TARGET_DIR}..."
scp $BACKUP_FILE ${TARGET_USER}@${TARGET_IP}:${TARGET_DIR}
# Step 5: 检查传输是否成功
if [ $? -eq 0 ]; then
echo "Backup transferred successfully to ${TARGET_IP}:${TARGET_DIR}"
else
echo "Backup transfer failed. Please check SSH connectivity."
exit 1
fi
# Step 6: 清理本地备份文件(可选)
# rm -f $BACKUP_FILE
echo "Database backup and transfer completed successfully."
2、将服务器A的数据库备份到服务器B,并将备份的sql恢复到服务器B的 Docker中 的 PostgreSQL 容器中 适用于服务器B有 PostgreSQL 容器的情况,可以进行自动备份,传输,恢复操作
backup_pg_to_B.sh
# 需要在服务器A上执行 ssh-keygen -t rsa -b 2048 按回车 使用默认路径 /root/.ssh/id_rsa
# ssh-copy-id root@192.168.115.139 输入 root 用户的密码。
# 测试免密登录 ssh root@192.168.115.139
# 自动备份docker中的pg数据库的OA数据库到服务器B的/root/backup 并写入到服务器B的pg数据库中,需要提前在服务器B创建相应的OA数据库
# 添加可执行权限 chmod +x /root/backup_mysql_to_B.sh
# 运行脚本命令 /root/backup_mysql_to_B.sh
#!/bin/bash
# 源数据库信息
SOURCE_CONTAINER="2a169d86a725" # PostgreSQL 容器ID或名称
SOURCE_DB="OA" # 源数据库名称
SOURCE_USER="root" # 源数据库用户名
SOURCE_PASSWORD="root" # 源数据库密码
BACKUP_DIR="/root/backups" # 本地备份目录
BACKUP_FILE="${BACKUP_DIR}/backup_$(date +%Y%m%d).sql" # 本地备份文件路径
# 目标机器信息
TARGET_USER="root" # 服务器B用户名
TARGET_IP="192.168.115.139" # 服务器B的IP地址
TARGET_DIR="/root/backup" # 目标机器上的备份目录
TARGET_DB="OA" # 目标数据库名称
TARGET_CONTAINER="9907f7704987" # 服务器B上的目标PostgreSQL容器名称
TARGET_USER_DB="root" # 目标数据库用户名
TARGET_PASSWORD_DB="root" # 目标数据库密码
# 设置 PostgreSQL 密码环境变量
export PGPASSWORD=$SOURCE_PASSWORD
# Step 1: 创建本地备份目录(如果不存在)
mkdir -p $BACKUP_DIR
# Step 2: 备份 PostgreSQL 数据库
echo "Starting database backup..."
docker exec $SOURCE_CONTAINER pg_dump -U $SOURCE_USER $SOURCE_DB > $BACKUP_FILE
# Step 3: 检查备份文件是否成功生成
if [ -f $BACKUP_FILE ]; then
echo "Backup successful: $BACKUP_FILE"
else
echo "Backup failed. Exiting."
exit 1
fi
# Step 4: 将备份文件传输到目标服务器B
echo "Transferring backup to ${TARGET_USER}@${TARGET_IP}:${TARGET_DIR}..."
scp $BACKUP_FILE ${TARGET_USER}@${TARGET_IP}:${TARGET_DIR}
# Step 5: 检查传输是否成功
if [ $? -eq 0 ]; then
echo "Backup transferred successfully to ${TARGET_IP}:${TARGET_DIR}"
else
echo "Backup transfer failed. Please check SSH connectivity."
exit 1
fi
# Step 6: 恢复备份到目标服务器B的Docker容器数据库
echo "Restoring backup to Docker container database on machine B..."
ssh ${TARGET_USER}@${TARGET_IP} << EOF
export PGPASSWORD=${TARGET_PASSWORD_DB}
docker exec -i ${TARGET_CONTAINER} psql -U ${TARGET_USER_DB} -d ${TARGET_DB} < ${TARGET_DIR}/$(basename ${BACKUP_FILE})
EOF
if [ $? -eq 0 ]; then
echo "Backup successfully restored to target database."
else
echo "Database restore failed. Please check the target container and database settings."
exit 1
fi
# Step 7: 清理本地备份文件(可选)
# rm -f $BACKUP_FILE
echo "Database backup, transfer, and restore completed successfully."
选择好相应的脚本文件之后还需要
添加可执行权限 chmod +x /root/backup_mysql_to_B.sh
运行脚本命令/root/backup_mysql_to_B.sh
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构