pg_basebackup是一种广泛使用的PostgreSQL备份工具,允许我们采取网上和一致的文件系统级备份。这些备份可用于point-in-time-recovery或建立一个奴隶/备用。你可以参考我们之前的博文,PostgreSQL的备份策略,在PostgreSQL流复制和更快的PITR PostgreSQL我们描述我们如何pg_basebackup用于不同的目的。在这篇文章中,我将演示的步骤恢复备份使用pg_basebackup当我们有很多底层对象存储数据库或表空间。
备份和恢复一个PostgreSQL集群
一个简单的备份可以使用以下语法。
|
1
2
3
4
5
|
焦油
和
压缩
格式
美元
pg_basebackup
- - - - - -
h
本地主机
- - - - - -
p
5432年
- - - - - -
U
postgres
- - - - - -
D
/
backupdir
/
latest_backup
- - - - - -
英国《金融时报》
- - - - - -
z
- - - - - -
Xs
- - - - - -
P
平原
格式
美元
pg_basebackup
- - - - - -
h
本地主机
- - - - - -
p
5432年
- - - - - -
U
postgres
- - - - - -
D
/
backupdir
/
latest_backup
- - - - - -
《外交政策》
- - - - - -
Xs
- - - - - -
P
|
使用tar和压缩格式是有利的,当你想使用更少的磁盘空间来备份和存储所有表空间、数据目录和WAL段,一切只是一个目录(目标目录备份)。
而普通的格式存储数据目录的副本,在目标目录中。当你有一个或多个非默认表空间、表空间可能存储在一个单独的目录中。这通常是一样的原始位置,除非你使用- - -表空间- - - - - -映射修改目的地存储表空间备份。
PostgreSQL支持表空间的概念。在简单的词语,一个表空间可以帮助我们保持多个位置分散数据库或对象。通过这种方式,我们可以将跨多个磁盘IO和平衡负载。
了解发生了什么当我们备份一个PostgreSQL集群包含多个表空间,让我们考虑下面的例子。我们将这些步骤:
- 创建两个表空间在一个现有的主从复制设置。
- 进行备份在备份目录,看看是什么。
- 恢复备份。
- 总结我们的研究结果
创建两个表空间,使用pg_basebackup备份(tar格式)
步骤1:
我建立了一个复制集群使用PostgreSQL 11.2。你可以参考我们的博客在PostgreSQL流复制复制相同的场景。下面是用于创建两个表空间的步骤:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
美元
sudo
mkdir
/
数据
_pgbench
美元
sudo
mkdir
/
数据
_页面表
美元
psql
- - - - - -
c
“创建表空间data_pgbench位置/ data_pgbench”
美元
psql
- - - - - -
c
“创建表空间data_pgtest位置/ data_pgtest”
美元
psql
- - - - - -
c
“选择oid、spcname pg_tablespace_location pg_tablespace (oid)”
oid
|
spcname
|
pg_tablespace_location
- - -
- - -
- - -
- - - - - -
+
- - -
- - -
- - -
- - -
- - -
- - -
- - -
+
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
1663年
|
pg_default
|
1664年
|
pg_global
|
16419年
|
data_pgbench
|
/
数据
_pgbench
16420年
|
data_pgtest
|
/
data_pgtest
(
4
行
)
|
步骤2:
现在,我在两个不同的表空间创建两个数据库,使用pgbench创建一些表和加载数据。
|
1
2
3
4
|
美元
psql
- - - - - -
c
“创建数据库表空间data_pgbench pgbench”
美元
psql
- - - - - -
c
“创建数据库页面表的表空间data_pgtest”
美元
pgbench
- - - - - -
我
pgbench
美元
pgbench
- - - - - -
我
页面表
|
在使用流媒体构建的主从设置复制,您必须确保目录中存在的奴隶,在运行之前“创建表空间……”的主人。这是因为同样的语句用于创建一个表空间/应用运往奴隶通过wal -这是不可避免的。奴隶崩溃与以下消息,当这些目录不存在:
|
1
2
3
4
5
6
7
8
9
10
11
|
2018年
- - - - - -
12
- - - - - -
15
12
:
00
:
56.319
UTC
(
13121年
]
日志
:
一致的
复苏
状态
达到了
在
0
/
80000 f8
2018年
- - - - - -
12
- - - - - -
15
12
:
00
:
56.319
UTC
(
13119年
]
日志
:
数据库
系统
是
准备好了
来
接受
读
只有
连接
2018年
- - - - - -
12
- - - - - -
15
12
:
00
:
56.327
UTC
(
13125年
]
日志
:
开始
流媒体
细胞膜
从
主
在
0
/
9000000
在
时间轴
1
2018年
- - - - - -
12
- - - - - -
15
12
:
26
:
36.310
UTC
(
13121年
]
致命的
:
目录
“/ data_pgbench”
做
不
存在
2018年
- - - - - -
12
- - - - - -
15
12
:
26
:
36.310
UTC
(
13121年
]
提示
:
创建
这
目录
为
的
表空间
之前
重新启动
的
服务器
。
2018年
- - - - - -
12
- - - - - -
15
12
:
26
:
36.310
UTC
(
13121年
]
上下文
:
细胞膜
重做
在
0
/
9000448
为
表空间
/
创建
:
16417年
“/ data_pgbench”
2018年
- - - - - -
12
- - - - - -
15
12
:
26
:
36.311
UTC
(
13119年
]
日志
:
启动
过程
(
PID
13121年
)
退出
与
退出
代码
1
2018年
- - - - - -
12
- - - - - -
15
12
:
26
:
36.311
UTC
(
13119年
]
日志
:
终止
任何
其他
活跃的
服务器
流程
2018年
- - - - - -
12
- - - - - -
15
12
:
26
:
36.314
UTC
(
13119年
]
日志
:
数据库
系统
是
关闭
下来
2018年
- - - - - -
12
- - - - - -
15
12
:
27
:
01.906
UTC
(
13147年
]
日志
:
数据库
系统
是
打断了
而
在
复苏
在
日志
时间
2018年
- - - - - -
12
- - - - - -
15
12
:
06
:
13
UTC
2018年
- - - - - -
12
- - - - - -
15
12
:
27
:
01.906
UTC
(
13147年
]
提示
:
如果
这
有
发生
更多的
比
一次
一些
数据
可能
是
损坏
和
你
可能
需要
来
选择
一个
早些时候
复苏
目标
。
|
步骤3:
现在让我们使用pg_basebackup备份。在这个例子中,我使用一个tar格式备份。
|
1
2
|
美元
pg_basebackup
- - - - - -
h
本地主机
- - - - - -
p
5432年
- - - - - -
U
postgres
- - - - - -
D
/
备份
/
latest_backup
- - - - - -
英国《金融时报》
- - - - - -
z
- - - - - -
Xs
- - - - - -
P
94390年
/
94390年
kB
(
One hundred.
%
)
,
3
/
3
表空间
|
在上面的日志,可以看到有三个表空间备份:一个违约,和两个新创建的表空间。如果我们回去看看两个表空间中的数据分发到合适的目录中,我们看到,里面有符号链接创建pg_tblspc目录(在数据目录)的oid的表空间。这些链接指向的实际位置表空间,我们在步骤1中指定。
|
1
2
3
4
|
美元
ls
- - - - - -
l
PGDATA美元
/
pg_tblspc
总
0
lrwxrwxrwx
。
1
postgres
postgres
5
12月
15
12
:
31日
16419年
- >
/
data_pgbench
lrwxrwxrwx
。
1
postgres
postgres
6
12月
15
12
:
31日
16420年
- >
/
data_pgtest
|
步骤4:
这里有备份目录内的内容,通过生成备份在步骤3中。
|
1
2
3
4
5
6
|
美元
ls
- - - - - -
l
/
备份
/
latest_backup
总
8520年
- - - - - -
rw
- - -
- - -
- - -
- - - - - -
。
1
postgres
postgres
1791930
12月
15
12
:
54
16419. tar.gz
- - - - - -
rw
- - -
- - -
- - -
- - - - - -
。
1
postgres
postgres
1791953
12月
15
12
:
54
16420. tar.gz
- - - - - -
rw
- - -
- - -
- - -
- - - - - -
。
1
postgres
postgres
5113532
12月
15
12
:
54
基地
. tar
. gz
- - - - - -
rw
- - -
- - -
- - -
- - - - - -
。
1
postgres
postgres
17097年
12月
15
12
:
54
pg_wal
. tar
. gz
|
Tar文件:16419. tar.gz和16420. tar.gz创建两个表空间备份。这些都是用相同的名称创建的oid各自的表空间。
现在让我们看看我们如何可以恢复备份数据和表空间完全不同的位置。
恢复一个PostgreSQL集群与多个表空间备份
步骤1:
为了进行进一步的恢复,我们首先提取base.tar。gz文件。这个文件包含一些重要文件,帮助我们进一步进行。
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20.
21
22
23
24
25
26
27
28
29日
30.
31日
|
美元
焦油
xzf
/
备份
/
latest_backup
/
基地
. tar
. gz
- - - - - -
C
/
pgdata
美元
ls
- - - - - -
滑坡体
/
pgdata
总
76 k
drwx
- - -
- - -
- - -
。
2
postgres
postgres
18
12月
14
14
:
15
pg_xact
- - - - - -
rw
- - -
- - -
- - -
- - - - - -
。
1
postgres
postgres
3
12月
14
14
:
15
PG_VERSION
drwx
- - -
- - -
- - -
。
2
postgres
postgres
6
12月
14
14
:
15
pg_twophase
drwx
- - -
- - -
- - -
。
2
postgres
postgres
6
12月
14
14
:
15
pg_subtrans
drwx
- - -
- - -
- - -
。
2
postgres
postgres
6
12月
14
14
:
15
pg_snapshots
drwx
- - -
- - -
- - -
。
2
postgres
postgres
6
12月
14
14
:
15
pg_serial
drwx
- - -
- - -
- - -
。
4
postgres
postgres
36
12月
14
14
:
15
pg_multixact
- - - - - -
rw
- - -
- - -
- - -
- - - - - -
。
1
postgres
postgres
1.6 k
12月
14
14
:
15
pg_ident
. conf
drwx
- - -
- - -
- - -
。
2
postgres
postgres
6
12月
14
14
:
15
pg_dynshmem
drwx
- - -
- - -
- - -
。
2
postgres
postgres
6
12月
14
14
:
15
pg_commit_ts
drwx
- - -
- - -
- - -
。
6
postgres
postgres
54
12月
14
14
:
18
基地
- - - - - -
rw
- - -
- - -
- - -
- - - - - -
。
1
postgres
postgres
4.5 k
12月
14
16
:
16
pg_hba
. conf
- - - - - -
rw
- - -
- - -
- - -
- - - - - -
。
1
postgres
postgres
208年
12月
14
16
:
18
postgresql
翻
. conf
drwx
- - -
- - -
- - -
。
2
postgres
postgres
6
12月
14
16
:
18
pg_stat
drwx
- - -
- - -
- - -
。
2
postgres
postgres
58
12月
15
00
:
00
日志
drwx
- - -
- - -
- - -
。
2
postgres
postgres
6
12月
15
12
:
54
pg_stat_tmp
drwx
- - -
- - -
- - -
。
2
postgres
postgres
6
12月
15
12
:
54
pg_replslot
drwx
- - -
- - -
- - -
。
4
postgres
postgres
68年
12月
15
12
:
54
pg_logical
- - - - - -
rw
- - -
- - -
- - -
- - - - - -
。
1
postgres
postgres
224年
12月
15
12
:
54
backup_label
drwx
- - -
- - -
- - -
。
3
postgres
postgres
28
12月
15
12
:
57
pg_wal
drwx
- - -
- - -
- - -
。
2
postgres
postgres
4.0 k
12月
15
12
:
57
全球
drwx
- - -
- - -
- - -
。
2
postgres
postgres
32
12月
15
13
:
01
pg_tblspc
- - - - - -
rw
- - -
- - -
- - -
- - - - - -
。
1
postgres
postgres
55
12月
15
13
:
01
tablespace_map
- - - - - -
rw
- - -
- - -
- - -
- - - - - -
。
1
postgres
postgres
24 k
12月
15
13
:
04
postgresql
. conf
- - - - - -
rw
- - - - - -
r
- - -
r
- - -
。
1
postgres
postgres
64年
12月
15
13
:
07年
复苏
. conf
- - - - - -
rw
- - -
- - -
- - -
- - - - - -
。
1
postgres
postgres
44
12月
15
13
:
07年
邮政局长
.opts
drwx
- - -
- - -
- - -
。
2
postgres
postgres
18
12月
15
13
:
07年
pg_notify
- - - - - -
rw
- - -
- - -
- - -
- - - - - -
。
1
postgres
postgres
30.
12月
15
13
:
07年
current_logfiles
|
步骤2:
恢复的文件,我们需要考虑:
- backup_label
- tablespace_map
当你打开backup_label文件,我们看到WAL位置,开始备份开始时间等。这些都是帮助我们一些细节执行point-in-time-recovery。
|
1
2
3
4
5
6
7
8
|
美元
猫
backup_label
开始
细胞膜
位置
:
0
/
B000028
(
文件
00000001000000000000000 b
)
检查点
位置
:
0
/
B000060
备份
方法
:
流
备份
从
:
主
开始
时间
:
2018年
- - - - - -
12
- - - - - -
15
12
:
54
:
10
UTC
标签
:
pg_basebackup
基地
备份
开始
时间轴
:
1
|
现在,让我们看看在什么tablespace_map文件。
|
1
2
3
|
美元
猫
表空间
_地图
16419年
/
数据
_pgbench
16420年
/
data_pgtest
|
在上面的日志,你可以看到有两个条目,一个用于每个表空间。这是一个文件,将一个表空间(oid)映射到它的位置。当你开始PostgreSQL后提取表空间和WAL tar文件,自动创建符号链接postgres - pg_tblspc目录中的每个表空间到适当的表空间位置,使用映射在这个文件。
步骤3:
现在,为了恢复这个相同的postgres备份服务器的备份了,您必须在原表空间删除现有的数据目录。这允许您提取每个表空间的tar文件到相应的表空间的位置。
实际的命令提取表空间的备份,在这种情况下,以下:
|
1
2
|
美元
焦油
xzf
16419. tar.gz
- - - - - -
C
/
data_pgbench
(
原始
表空间
位置
)
美元
焦油
xzf
16420. tar.gz
- - - - - -
C
/
data_pgtest
(
原始
表空间
位置
)
|
在一个场景,你想恢复备份的备份到同一台机器从最初,我们必须使用不同的位置而提取的数据目录和表空间备份。为了达到这个目的,tar文件提取单个表空间可能比原来的目录中指定不同的目录中tablespace_map的文件,我们可以修改tablespace_map与新表空间文件位置。接下来的两个步骤帮助你应该看到这是如何工作的。
步骤3:
创建两个不同的目录并提取表空间。
|
1
2
|
美元
焦油
xzf
16419. tar.gz
- - - - - -
C
/
pgdata_pgbench
(
不同的
位置
为
表空间
比
原始
)
美元
焦油
xzf
16420. tar.gz
- - - - - -
C
/
pgdata_pgtest
(
不同的
位置
为
表空间
比
原始
)
|
步骤3 b:
编辑tablespace_map与新表空间文件位置。每个表空间的原始位置替换为新位置,我们提取前一步的表空间。以下是编辑后似乎。
|
1
2
3
|
美元
猫
表空间
_地图
16419年
/
pgdata
_pgbench
16420年
/
pgdata_pgtest
|
步骤4:
提取pg_wal.tar。广州新数据备份pg_wal目录的目录。
|
1
|
美元
焦油
xzf
pg_wal
. tar
. gz
- - - - - -
C
/
pgdata
/
pg_wal
|
步骤5:
创建复苏. conf指定时间当您希望执行point-in-time-recovery。请参考我们之前的博客步骤3,理解复苏。conf PITR的细节。
步骤6:
一旦完成上面所有的步骤你就可以开始PostgreSQL。
您应该能看到以下文件重命名后的复苏。
|
1
2
3
|
backup_label
- - -
>
backup_label
.old
tablespace_map
- - -
>
tablespace_map
.old
复苏
. conf
- - -
>
复苏
.done
|
避免行使手动修改tablespace_map文件,您可以使用- - -表空间- - - - - -映射。这是一个选项,当您使用普通格式备份工作,但不是与焦油。让我们看看为什么你可能更喜欢一个tar格式相比平原。
PostgreSQL集群的备份表空间使用普通格式
考虑同样的场景,你有一个PostgreSQL集群有两个表空间。您可能会看到下面的错误,当你不使用- - -表空间- - - - - -映射。
|
1
2
3
4
5
6
7
|
美元
pg_basebackup
- - - - - -
h
本地主机
- - - - - -
p
5432年
- - - - - -
U
postgres
- - - - - -
D
/
备份
/
latest_backup
- - - - - -
《外交政策》
- - - - - -
Xs
- - - - - -
P
- - - - - -
v
pg_basebackup
:
启动
基地
备份
,
等待
为
检查点
来
完整的
pg_basebackup
:
检查点
完成
pg_basebackup
:
写
- - - - - -
之前
日志
开始
点
:
0
/
22000028
在
时间轴
1
pg_basebackup
:
目录
“/ data_pgbench”
存在
但
是
不
空
pg_basebackup
:
删除
内容
的
数据
目录
“/备份/ latest_backup”
|
上述错误意味着什么是pg_basebackup试图将表空间存储在相同的位置与原始表空间目录。在这里/data_pgbench表空间的位置:data_pgbench。现在,pg_basebackup试图将表空间备份存储在相同的位置。为了克服这个错误,您可以使用以下语法应用表空间的映射。
|
1
|
美元
pg_basebackup
- - - - - -
h
本地主机
- - - - - -
p
5432年
- - - - - -
U
postgres
- - - - - -
D
/
备份
/
latest_backup
- - - - - -
T
“/ data_pgbench = / pgdata_pgbench”
- - - - - -
T
“/ data_pgtest = / pgdata_pgtest”
- - - - - -
《外交政策》
- - - - - -
Xs
- - - - - -
P
|
- - - - - -T用于指定表空间的映射。- - - - - -T可以更换的- - -表空间- - - - - -映射。
使用- t的优势(- - -表空间- - - - - -映射)单独的表空间存储在映射目录。在这个例子中使用简单格式备份,必须提取所有以下三个目录,以恢复使用备份/恢复数据库。
- /备份/ latest_backup
- / pgdata_pgtest
- / pgdata_pgbench
然而,你不需要一个tablespace_map文件在这个场景中,它是自动照顾PostgreSQL。
如果你把一个备份tar格式,你看到所有的tar文件为基础,和细胞膜段存储在相同的表空间备份目录,就可以提取这个目录执行恢复/复苏。然而,您必须手动提取表空间和细胞膜部分适当的位置和编辑tablespace_map文件,正如上面所讨论的。
- - - - - -
基于照片的图像艾伦·詹姆斯·亨得利在Unsplash和坦纳Boriack在Unsplash






嗨Avinash,
我是新到Postgresql。在我们的项目我们要迁移到Postgresql。
当有需要大量的数据加载到一个表,通常的过程遵循在大型机DB2是如下提到的
•设置停顿点或把图片复制的表空间(这只是一个备份/恢复点如果在加载数据有问题)
•负载表
•修复表空间——这是检查复制等待状态,并检查数据
•Reorg和Runstats索引的表空间——这是确保索引重建后质量负载。
如果负载体积较低或局限于几百的记录并非所有这些步骤执行。根据上述过程的唯一原因是性能。
请让我知道Postgres进行一般的流程是什么,我相信并不是所有上述步骤是必需的。请澄清。
谢谢,
沙R。