目录
环境: | 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文件的地方去看是否有备份文件已存在:如下