【docker】之linux写shell脚本备份和恢复线上数据库(备份dump文件与dump文件恢复到数据库)

本文详细介绍了如何在Linux容器(Docker)环境中编写Shell脚本,包括备份线上数据库(如PostgreSQL)生成dump文件,以及如何执行恢复操作。还涵盖了如何设置定时任务定期执行备份任务。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

环境:linux
容器:docker
博客链接
linux写shell脚本备份线上数据库(备份为dump文件)http://t.csdnimg.cn/VWilN
PostgreSql本地备份为dump文件与恢复数据库的脚本与执行(单表or整个数据库)http://t.csdnimg.cn/WYp4s
linux配置定时任务–设置shell脚本定时执行(定时备份、删除数据库)http://t.csdnimg.cn/WgoTE

1. SH文件

SH文件通常指的是 Shell 脚本文件,文件后缀名为.sh,其中包含一系列要由操作系统的命令解释器执行的命令。
也就是说,我们可以使用shell命令一次性执行.sh文件里面的所有命令(方便、避免重复做事)

1.1 SH文件示例

在 Shell 脚本文件中,可以通过直接编写命令来执行特定的操作。

#!/bin/bash

# 这是一个简单的 Shell脚本 ;echo命令通常是用来打印的
echo "Hello, World!"

# 使用变量
name="John"
echo "Welcome, $name!"

执行这个.sh脚本,控制台(终端)就会输出

Hello, World!
Welcome,John!

1.2 文件解释

#!/bin/bash:指定了用于执行脚本的解释器,这里是 Bash。
echo "Hello, World!":打印 “Hello, World!” 到终端。
name="John":定义了一个变量 name,并赋值为 “John”。
echo "Welcome, $name!":使用变量输出 “Welcome, John!”。

1.3 .sh文件执行

假如我们把上面编辑好的.sh文件进行保存,命名为test.sh
执行命令一般基本上都使用:

bash test.sh
# 或者
sh test.sh

2. 备份线上数据库的.sh文件

#!/bin/bash
#开始进行数据库备份
echo "开始进行数据库备份!"

#备份数据库1
echo "备份数据库1"
docker exec -i postgres14_1 /bin/bash -c 
'pg_dump -h 127.0.0.1 -p 5432 -U postgres -Fc -f /var/lib/postgresql/pgdumpFile/xxx_`date +%Y%m%d%H%M%S`.dump test1'


#备份数据库2
echo "备份数据库2"
docker exec -i postgres14_2 /bin/bash -c 
'pg_dump -h 127.0.0.1 -p 5432 -U postgres -Fc -f /var/lib/postgresql/pgdumpFile/xxx_`date +%Y%m%d%H%M%S`.dump test2'
echo "备份数据库成功!"

2.1 文件命令解析

docker exec -i postgres14_1 /bin/bash -c 
'pg_dump -h 127.0.0.1 -p 5432 -U postgres -Fc -f /var/lib/postgresql/pgdumpFile/xxx_`date +%Y%m%d%H%M%S`.dump test1'
  • echo命令用来打印

  • docker exec命令,用于在正在运行的 Docker 容器中执行一个命令(若当前doker容器未在运行,须使用其他命令使其处于运行状态)

    • 运行容器:docker run -d --name mycontainer image_name
    • 这里,mycontainer是你给容器起的名字,image_name是你要使用的Docker镜像的名字。
  • -i: 交互模式选项,允许你与在容器内部运行的命令进行交互。尽管在这个 pg_dump 命令的上下文中可能不是必需的,因为 pg_dump 通常不需要交互输入,但它可能是为了确保任何需要的输入(尽管在这个场景中不太可能)都能正确传递。

  • postgres14_1: 这是你想要执行命令的容器的名称,也就是当前数据库所在数据库服务的容器名。

  • /bin/bash -c: 使用 Bash shell 来执行后面的命令字符串。-c 选项允许你传递一个字符串给 Bash 作为要执行的命令。

 'pg_dump -h 127.0.0.1 -p 5432 -U postgres -Fc -f /var/lib/postgresql/pgdumpFile/xxx_`date +%Y%m%d%H%M%S`.dump test1'
  • 这是实际要在容器内部执行的 pg_dump 命令。
    • pg_dump: PostgreSQL 的备份工具。
    • h 127.0.0.1: 指定 PostgreSQL 数据库服务器的地址,这里指向容器内部的本地地址。
    • p 5432: 指定 PostgreSQL 数据库服务器的端口号。
    • U postgres: 使用 postgres 用户来连接数据库。
    • Fc: 创建一个自包含格式的备份。
    • f /var/lib/postgresql/pgdumpFile/xxx_date +%Y%m%d%H%M%S.dump: 指定备份文件的输出路径和名称。
      • 这里使用了命令替换(反引号中的 date +%Y%m%d%H%M%S),它会执行 date 命令并获取当前的日期和时间(格式为年月日时分秒),然后将这个日期和时间字符串插入到文件名中,从而生成一个带有时间戳的备份文件名。
      • 其中/var/lib/postgresql/pgdumpFile是映射路径 .sh要在docker-compose.yml文件里面当前映射路径对应的实际路径中,否则则会报错:找不到当前路径
    • test1: 这是你想要备份的数据库的名称。(一个数据库服务下可能有多个数据库,所以要写具体备份的数据库)

综上所述,这个命令的作用是:在 postgres14_1 容器中,使用 pg_dump 工具备份名为 test1的 PostgreSQL 数据库,并将备份文件保存在 /var/lib/postgresql/pgdumpFile路径映射的绝对路径中,数据库备份名为xxx_YYYYMMDDHHMMSS.dump ,其中 YYYYMMDDHHMMSS 是当前日期和时间的字符串表示。这样做的好处是每次备份都会生成一个具有唯一时间戳的文件名,从而避免文件名冲突,并使得可以轻易识别备份的创建时间。

3. 恢复的shell脚本

根据上述理解讨论,那么线上恢复数据库的shell命令如下:

docker exec -i postgres14_1 /bin/bash -c 'pg_restore -h 127.0.0.1 -p 5432 -U postgres -d practice /var/lib/postgresql/data/dump_restore/xxxx.dump'

3.1 命令解析

这个命令与之前的命令非常相似,用于在名为postgres14_1的Docker容器内执行pg_restore命令以恢复PostgreSQL数据库。下面是对这个命令的解析(只列出有差异的解析):

  • pg_restore …: 这是要在容器内执行的命令,用于从备份中恢复PostgreSQL数据库。

  • -d practice: 指定要将备份数据恢复到的数据库名称,这里是practice。

  • /var/lib/postgresql/data/dump_restore/xxxx.dump: 这是备份文件的路径,其中xxxx.dump是备份文件的名称。pg_restore将从这个文件中读取数据来恢复数据库。

注意:这里假设:

  • 容器postgres14_1内部已经安装了pg_restore工具。
  • PostgreSQL服务器正在容器内部运行,并且监听在5432端口上。
  • 备份文件xxxx.dump存在于容器内的/var/lib/postgresql/data/dump_restore/目录下。
  • postgres用户有权限连接到PostgreSQL服务器,并且有足够的权限在practice数据库中恢复数据。

如果这些假设不成立,该命令可能会失败。

4. 命令执行

假如我们保存该shell脚本为pgsqldump.sh的文件

我们使用cd命令进入该SH文件所在的绝对目录下使用命令:

bash pgsqldump.sh

输出以下结果:

开始进行数据库备份!
备份数据库1
备份数据库2
备份数据库成功

然后再去保存dump文件的地方去看是否有备份文件已存在:如下
在这里插入图片描述

5. 线下dump文件的恢复与备份

【PostgreSql】本地备份为dump文件与恢复数据库(单表or整个数据库)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

大龄烤红薯

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

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

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

打赏作者

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

抵扣说明:

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

余额充值