linux环境下数据库备份和还原

linux环境下数据库备份和还原

准备工作

将脚本放到文件夹下(我是在/work/docker/mysql/bak/mysql-backup.sh)
脚本可执行权限
chmod +x mysql-backup.sh
文件夹权限
chmod +x /work/docker/ mysql /bak
格式转换(window写的linux脚本会因为回车问题导致在Linux无法执行)
dos2unix mysql-backup.sh
先运行./mysql-backup.sh看看能不能生成备份文件

设置定时任务

yum install crontabs (安装 crontabs)
systemctl enable crond (设为开机启动)
systemctl start crond(启动crond服务)
systemctl status crond (查看状态)
crontab -e 编辑定时任务
1 1 * * * sh /home/mysql/mysql-backup.sh 每天凌晨一点一分运行
esc --> :wq 保存

保存定时任务之后出现这个 就表示成功了
crontab: installing new crontab
crontab -l 查看定时任务
注:为了测试定时任务是否可用 可以把前两个1 改成当前时间的晚几分钟进行测试
    定时任务 第一个数是分 第二个数是时(0-23

mysql备份的恢复

使用以下步骤来还原备份的SQL文件: 1. 确保您已经创建了一个空的MySQL数据库,用于还原备份。 2. 将备份文件传输到MySQL容器中,可以使用 docker cp 命令将备份文件复制到容器中的任意位置,例如:

docker cp /path/to/backup_file.sql mysql8:/tmp/backup_file.sql

其中 /path/to/backup_file.sql 是您备份文件的本地路径, mysql8 是MySQL容器的名称或ID3. 进入MySQL容器,可以使用 docker exec -it mysql8 bash 命令进入容器的bash终端。 4. 使用 mysql 命令还原备份文件,例如:

mysql -u root -p < /tmp/backup_file.sql

验证还原是否成功,可以使用 mysql 命令登录到MySQL数据库并检查数据是否已还原。

pgsql备份的恢复

docker exec -i [容器名称] psql -U [用户名] -d [数据库名称] < /work/docker/postgres/bak/backup_file.sql

确保将 [容器名称] 替换为PostgreSQL Docker 容器的名称或 ID[用户名] 替换为适当的数据库用户名,[数据库名称] 替换为目标数据库的名称。 例如,容器名称是 "my-postgres",用户名是 "postgres",数据库名称是 " postgres ",那么命令将如下所示:

docker exec -i my-postgres psql -U postgres -d postgres < /work/docker/postgres/bak/backup_20230711.sql

mysql备份脚本

#!/bin/bash
 echo '开始备份数据'
 # 定义 MySQL 容器名称和备份目录
MYSQL_CONTAINER=mysql8
BACKUP_DIR=/work/docker/mysql/bak/
 # 定义 MySQL 容器中的数据库用户名、密码和备份文件名
MYSQL_USER=root
MYSQL_PASSWORD=123456
BACKUP_FILE=${BACKUP_DIR}db_backup_$(date +%Y%m%d%H%M%S).sql
 # 执行备份命令
docker exec ${MYSQL_CONTAINER} mysqldump --single-transaction -u ${MYSQL_USER} -p${MYSQL_PASSWORD} --all-databases > ${BACKUP_FILE}
 # 检查备份是否成功
if [ $? -eq 0 ]; then
  echo "MySQL 数据库备份成功:${BACKUP_FILE}"
else
  echo "MySQL 数据库备份失败"
fi
 # 删除7天前的备份文件
find ${BACKUP_DIR} -type f -name "*.sql" -mtime +7 -delete
 echo '完成备份'

postgres备份脚本

#!/bin/bash
# 定义备份目录和文件名
backup_dir="/work/docker/postgres/bak/"
backup_file="backup_$(date +%Y%m%d).sql"
# 定义要保留的备份天数
retention_days=7
# 定义Docker容器名称
container_name="my-postgres"
# 定义数据库连接参数
db_host="localhost"
db_port="5432"
db_name="postgres"
db_user="postgres"
db_password="123456"
# 创建备份目录(如果不存在)
mkdir -p "$backup_dir"
# 在Docker容器内执行备份命令
docker exec -t "$container_name" pg_dump -h "$db_host" -p "$db_port" -U "$db_user" -d "$db_name" -F plain -f "/tmp/$backup_file" -w
# 检查备份命令是否成功执行
if [ $? -eq 0 ]; then
    echo "Database backup created successfully"
else
    echo "Error creating database backup"
    exit 1
fi
# 将备份文件从Docker容器复制到主机
docker cp "$container_name:/tmp/$backup_file" "$backup_dir/$backup_file"
# 检查文件复制是否成功
if [ $? -eq 0 ]; then
    echo "Backup file copied successfully"
else
    echo "Error copying backup file"
    exit 1
fi
# 从Docker容器中删除备份文件
docker exec -t "$container_name" rm "/tmp/$backup_file"
# 删除旧的备份文件
find "$backup_dir" -name "backup_*.sql" -type f -mtime +$retention_days -delete
# 检查旧备份文件的删除是否成功
if [ $? -eq 0 ]; then
    echo "Old backup files deleted successfully"
else
    echo "Error deleting old backup files"
    exit 1
fi

如果按照表为单位的备份,完成后放到一个文件夹下

#!/bin/bash
# 定义备份目录和文件名
backup_dir="/work/docker/postgres/bak/$(date +%Y%m%d)"
mkdir -p "$backup_dir"
chmod 777 "$backup_dir"
# 定义要保留的备份天数
retention_days=5
# 定义Docker容器名称
container_name="mypostgres"
# 定义数据库连接参数
db_host="localhost"
db_port="5432"
db_name="postgres"
db_user="postgres"
db_password="postgres"
# 定义要备份的表名 需要用空格隔开
tables=("table1" "table3" "table5")
# 循环备份每个表到备份的文件夹
for table in "${tables[@]}"; do
    backup_file="${table}_$(date +%Y%m%d).sql"
    docker exec -t "$container_name" pg_dump -h "$db_host" -p "$db_port" -U "$db_user" -d "$db_name" -t "$table" -F plain -f "/tmp/$backup_file" -w
    if [ $? -eq 0 ]; then
        echo "表 $table 的数据库备份已成功创建"
        docker cp "$container_name:/tmp/$backup_file" "$backup_dir/$backup_file"
        chmod 777 "$backup_dir/$backup_file"
        if [ $? -eq 0 ]; then
            echo "表 $table 的备份文件已成功复制"
            docker exec -t "$container_name" rm "/tmp/$backup_file"
        else
            echo "复制表 $table 的备份文件时出错"
            exit 1
        fi
    else
        echo "创建表 $table 的数据库备份时出错"
        exit 1
    fi
done
# 删除旧的备份文件夹
find "$backup_dir" -type d -mtime +$retention_days -exec rm -r {} \;
# 检查旧备份文件夹的删除是否成功
if [ $? -eq 0 ]; then
    echo "旧备份文件夹已成功删除"
else
    echo "删除旧备份文件夹时出错"
    exit 1
fi
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

奔跑的五花肉~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值