PostgreSQL pg_basebackup

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
云原生数据库 PolarDB MySQL 版,通用型 2核4GB 50GB
云原生数据库 PolarDB PostgreSQL 版,标准版 2核4GB 50GB
简介: 本文探讨 pg_basebackup工具,本地备份、远程备份、单一表空间本地数据库的备份、表空间重定向

需要注意的地方:

1. pg_basebackup被用于获取一个正在运行中的pg数据库集簇的基础备份。该备份并不影响其他连接到该数据库的客户端。
2. 可以用做时间点恢复
3. 可以做流复制后备服务器的开始点
4. pg_basebackup创建数据库集簇文件的一份2进制副本。同时自动让系统进入和退出备份模式。
5. 备份整个数据库集簇,而不是单个数据库或数据库对象,如果你备份单个数据库,可以使用pg_dump
6. 备份是通过pg的网络连接进行的,而且要有权限,所以你要配置pg_hba.conf和使用postgres超级用户。
7. 如果你使用流复制,则max_wal_senders必须设置的足够高,你也必须保留一个会话、一个wal日志用于发送给流复制的备端。
8. 同一时间可以有多个pg_basebackup运行。但是从性能的角度来看,最好只有一个。
9. pg_basebackup也可以用于备机上的备份。但是在备机上备份有一些限制。有啥限制详细请参考http://postgres.cn/docs/11/app-pgbasebackup.html
10. 该工具是通过流复制来备份的,所以你的pg_hba.conf中得有replication权限。
11. 该工具并不用连接到任何数据库之中,所以不需要指定数据库名字
12. 当你备份的时候pg_wal下的任何归档文件都不会给你备份上。你需要用archive_command另存一份归档。
13. 当你备份的时候log目录下的log会给你备份上,但是该log日志一般用不到,可以提前删掉,或者备份的时候排除掉。

注意:

备份的时候,备份两部分,$PGDATA和自定义表空间;$PGDATA是会放到你指定的备份目录下;自定义表空间会放到跟它原来相同的路径下。比如说未备份前你的$PGDATA是/gao/data,表空间是/jia/ts;那你备份的时候pg_basebackup会把表空间还给你放在/jia/ts下,这样就会报错退出备份,同时提示你文件已存在。

所以,如果你在本机备份本机pg,会报目录下的文件已经存在,报错退出。因为PG默认就会这么存放。如果你想不存放相同路径,则可以用参数-Ft把表空间生成为tar文件,从而避免文件和路径同名的情况。默认参数是-Fp,就是放在同路径,叫同名字。

举例:
创建目录,用户,表空间,数据库,表,索引

数据创建好后,pg_hba.conf中要设置访问权限

是replication的,表示允许流复制连接,而不是允许连接到一个replication名字的数据库上。
没有允许流复制连接的规则,则报错。

需要注意的是你的这条访问规则要么写成

允许所有用户,所有IP地址访问

要么写成

指定用户或者all用户,指定具体的IP来访问

要么写成

所有用户,指定IP区间来访问

要么写成

虽然这里具体的IP 31.123跟/24不太搭,但是也可以使用,不信你就试试。

首先必须要写replicaton表示允许流复制连接,其次是没有0.0.0.0/24这种写法,
如果你写成0.0.0.0/24这种,那么你将无法使用pg_basebackup -h 主机名/IP 备份,会报你的pg_hba.conf里没有指定IP地址的设置。

实验1:本地备份
在自己的服务器上备份自己
[postgres@gao backup]$ pg_basebackup -D gaobk -Ft -z -P
40608/40608 kB (100%), 3/3 tablespaces

-D就是生成什么目录,可以写绝对路径,如果有重名路径则报错
-Ft -F就是输出格式,输出为t格式,就是将输出写成目标目录中的tar文件。pg的主数据目录被写入到一个名为base.tar文件中,其他表空间将已其OID命名
-z 启用对tar文件进行gzip压缩,使用默认的压缩级别,只有使用tar格式时才可用。压缩后在所有tar文件后加上.gz后缀。
-P 启用进度报告,备份期间生成一个大致的进度报告,会计算整个数据库尺寸、wal日志等、总数据量无法准确预估。启用该参数会增加一点点备份时间。

看上面的内容,显示大小,百分比,几个表空间;大小和百分比都是不准的。表空间数量是准确的。

有3个表空间被备份了,是哪3个呢?

16470、16471、base(就是pg_default表空间)

可是我有4个表空间,为啥pg_global没备份啊

pg_default是pg系统表空间,对应的物理位置为$PGDATA/base目录。template0和template1数据库默认表空间就是这个。用来存储系统目录对象、用户表、用户index、临时表、临时表index、内部临时表的默认表空间。相对来说比较重要,所以备份上。

pg_global是系统字典表都存在这,哪个PG都有,都一样。所以不备份。

实验2:远程备份
在A服务器上备份B服务器上的PG数据库集簇
[postgres@gao backup]$ pg_basebackup -h gao -D gaobk -Ft -z -P
-h 主机名或者IP地址

实验3:单一表空间本地数据库的备份
备份:
[postgres@gao backup]$ pg_basebackup -D --Ft -X fetch | bzip2 > backup.tar.bz2
如果在该数据库中只有一个表空间,则可以成功,如果有多个表空间,则失败。
我这个就是多表空间的,所以失败了,报错如下图

实验4:表空间重定向
备份:
[postgres@gao gaobkdata]$ pg_basebackup -D gaobkdata -T /pg/pg12/tablespace/gao_ts=/pg/pg12/tablespace2/gao_ts -T /pg/pg12/tablespace/jia_ts=/pg/pg12/tablespace2/jia_ts -Ft -P

把老表空间下的gao_ts、jia_ts重定向到了tablespace2目录下。
比如说新服务器实例的表空间路径要变化,可以用这个来搞。
必须写绝对路径。
如果以这种方法重定位一个表空间,祝数据目录中的符号链接会被更新成指向新位置。

注意:
每当你使用pg_basebackup工具备份后,将会生成一个备份历史文件。
文件存放两份,一份在$PGDATA/pg_wal中,名字叫做

每次你的pg_basebackup,都会生成一个新的备份历史文件中,覆盖老的(即使文件名不相同)。

一份在你自定义归档存放的地方,新的不会覆盖老的,跟放在pg_wal中不同。

该文件的命名分为3段式,用2个点来分隔。
第一段:你的pg_basebackup起始需要的归档文件叫什么名字
第二段:wal文件中的一个准确位置(PG知道就行,用户知道到没必要)
第三段:备份标识,知道是啥命令产生的就行。

向上图这样,我需要的第一个wal日志是1D,后面需要的是1E,1F等等;1D之前的归档就可以删掉了。
像1D和之后的wal日志是必须要保存的,为了方便使用pg_basebackup备份出来的东西恢复。所以你要考虑准备花多长时间来进行恢复,多次pg_basebackup备份之间的归档日志如何保留和删除。

解压缩可以用 tar -xzvf 来解压缩tar.gz文件

如果你用了-Ft参数,则备份出来的文件有4个,其中base.tar.gz目录中的pg_tblspc中是没有软连接文件的。
那我怎么知道表空间软连接哪个是哪个?pg_basebackup备份的时候会在base.tar.gz中生成一个文件叫做tablespace_map文件,查看该文件就会有oid对应表空间的解析

原来的长这样

所以你就可以根据这些信息来恢复$PGDATA和自定义表空间了。但是是手工来操作的,想要靠几条命令来恢复pg是不可能的。
image.png

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
相关文章
|
7月前
|
SQL 关系型数据库 数据库
PG/Greenplum
PG/Greenplum 是指 PostgreSQL(简称 PG)和 Greenplum(简称 GP)两种关系型数据库管理系统。它们都是基于 SQL(结构化查询语言)的开放源代码数据库系统,具有高性能、可扩展性和高可靠性等特点
132 7
|
关系型数据库 PostgreSQL
PostgreSQL pg_orphaned扩展
由于种种原因,PostgreSQL可能会产生一些孤儿文件,这些文件会占用磁盘空间,手工查找费时费力还容易出错,pg_orphaned扩展很好的解决了这个问题。
|
7月前
|
SQL 安全 关系型数据库
postgresql|数据库|【postgresql-12的基于pg_basebackup的主从复制部署】
postgresql|数据库|【postgresql-12的基于pg_basebackup的主从复制部署】
153 0
|
JSON 关系型数据库 数据安全/隐私保护
PG
MYSQL VS PG
337 0
|
消息中间件 关系型数据库 分布式数据库
PolarDB for PG
PolarDB for PG
185 1
|
存储 SQL JSON
PG备份恢复工具pg_probackup
PG备份恢复工具pg_probackup
143 0
|
关系型数据库 数据库 PostgreSQL
PostgreSQL pg_rewind报错分析
PostgreSQL pg_rewind报错分析
206 0
|
关系型数据库 PostgreSQL
PostgreSQL pg_resetwal处理机制
PostgreSQL pg_resetwal处理机制
185 0
|
关系型数据库
pg为什么...?
pg为什么...?
35 0
|
关系型数据库 C++ PostgreSQL
下一篇
DataWorks