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

posted @   xd99  阅读(28)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示