开发者学堂课程【PolarDB for PostgreSQL 开源人才初级认证培训课程:备份与恢复】学习笔记,与课程紧密连接,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/1077/detail/15556
备份与恢复
内容介绍
一、polar DB PG 变换和恢复
二、目录结构
三、搭建 RO
一、polar DB PG 变换和恢复
1.将主要从开源官网来进行说明。进入我们的开源文档,我们可以从polar DB PG的仓库点击链接就可以进入到我们的文档 polar DB PG变换和恢复的文档主要是由这一栏打开。
接下来利用这篇文档学习PG备份恢复 PolarDB是基于共享存储的存算分离架构,因此 PolarDB的备份恢复和PostgreSQL存在部分差异。本文将指导您如何对PolarDB做备份恢复,搭建只读节点,搭建 Standby实例等:PolarDB备份恢复原理,PolarDB的目录结构,polar_basebackup备份工具,PolarDB 搭建RO,PolarDB搭建Standby,PolarDB 按时间点恢复。
(1)如何按时间节点恢复因为不单单的要依靠一个本地存储还需要依赖一个归档文件,这一部分是主要给大家一个文档链接,来进行学习我们的前置条件是要先准备一个 polar DB 实力。
(2)备份恢复原理PolarDB的备份恢复原理整体上和PostgreSQL几乎一致,总结为以下几步:
①执行 pg_start_backup 命令
②使用各种方式对数据库进行复制
③执行 pg_stop_backup 命令
(3)进行备份的更简单方法是使用 polar_basebackup,但它其实是在内部发出这些级命令,并且支持使用网络将文件发送到远端。pg_start_backup:准备进行基备份。恢复过程从REDO点开始,因此pg_start_backup必须执行检查点以在开始行基本备份时显式创建REDO点。此外,其检查点的检查点位置必须保存在pg_control 以外的文件中,因为在备份期间可能会多次执行常规检查点。因此pg_start_backup执行以下四个操作:
①强制进入整页写模式。
②切换到当前的WAL段文件。
③做检查点。
④创建一个 backup_lobel文件—该文件在基础目录的顶层创建,包含关于基础份本身的基本信息,例如该检查点的检查点位置。
第三和第四个操作是这个命令核心;执行第一和第二操作以更可靠地恢复数据库集群。
(4)第1第2步主要是为了一个更可靠的能够恢复数据库集群。第3 第4点则是通过命令的一个执行关键。
之后会执行一个pg_stop_backup:执行以下五个操作来完成备份。如果已被 pg_start_backup 强制更改,则重置为非整页写入模式。写一条备份端的 XLOG 记录。切换 WAL 段文件。
创建备份历史文件——该文件包含 backup_label 文件的内容和 pg_stop_backup 已执行的时间戳。删除 backup_label 文件 – 从基本备份恢复需要 backup_label 文件,一旦复制,在原始数据库集群中就不需要了。
二、目录结构
接下来我们来讲如何拷贝,里面的一个数据在讲拷贝数据之前我们先要了解拷贝数据它主要有3种方式 PolarDB 备份过程总体可以概括为三步,其中第二步是使用各种方式对数据库进行复制:手动 copy使用网络工具传输基于存储进行打快照。
因此,这里介绍一下 PolarDB 数据目录结构,以便于进一步理解备份恢复。
如上图,PolarDB 是基于共享存储的,所以 PolarDB 在物理上有两个重要的数据目录,分别是 本地存储目录 和 共享存储目录。
1.本地存储目录 postgres=# show data_directory;
data_directory
------------------------
/home/postgres/primary
(1 row)
可以通过上述命令在数据库中获取本地存储目录的位置,可以看到它是类似于 PostgreSQL 的数据目录。
├── base
│ ├── 1
│ ├── 13938
│ ├── 13939
│ └── 13940
├── global
├── pg_commit_ts
├── pg_csnlog
├── pg_dynshmem
├── pg_log
├── pg_logical
│ ├── mappings
│ └── snapshots
├── pg_logindex
├── pg_multixact
│ ├── members
│ └── offsets
├── pg_notify
├── pg_replslot
├── pg_serial
├── pg_snapshots
├── pg_stat
├── pg_stat_tmp
├── pg_subtrans
├── pg_tblspc
├── pg_xact
├── polar_cache_trash
├── polar_fullpage
└── polar_rel_size_cache
本地存储目录中,大多都是通过 initdb 命令生成的文件或目录。随着数据库服务运行,这里会生成更多的本地文件,如临时文件、缓存文件、配置文件、日志文件。
由于本地存储目录中的文件不涉及核心数据,因此在做备份时本地存储目录是可选的。您可以仅备份共享存储上的数据目录,然后用 initdb 重新生成一份新的本地存储目录。但是需要记住之前的本地配置信息,如 postgresql.conf,pg_hba.conf 等。
提示如果您不能记住历史配置,或者您需要保留历史日志,建议您将本地存储目录也进行备份。可以将这个目录完全复制后修改配置文件来搭建 RO 或者 Standby。
2.共享存储目录
postgres
=# show polar_datadir;
polar_datadir
-----------------------
/
nvme0n1
/
shared_data
/(1
row)
├── base
│ ├── 1
│ ├── 16555
│ ├── 16556
│ ├── 16557
│ └── 16558
├── global
├── pg_commit_ts
├── pg_csnlog
├── pg_logindex
├── pg_multixact
│ ├── members
│ └── offsets
├── pg_replslot
├── pg_tblspc
├── pg_twophase
├── pg_wal
│ └── archive_status
├── pg_xact
├── polar_dma
│ ├── consensus_cc_log
│ └── consensus_log
├── polar_flog
├── polar_flog_index
├── polar_fraindex
│ ├── fbpoint
│ └── pg_xact
└── polar_fullpage
共享存储目录中存放 PolarDB 的核心数据文件,如表文件、索引文件、WAL 日志、DMA、LogIndex、Flashback 等。这些文件被一个 RW 节点和多个 RO 节点共享,因此是必须备份的。
您可以使用 copy 命令、存储快照、网络传输等方式进行备份。如果您没有更好的选择,推荐使用 polar_basebackup 命令。
3.polar_basebackup 备份工具
下面介绍一下 PolarDB 的备份工具 polar_basebackup,它由 pg_basebackupopen in new window 改造而来,且完全兼容 pg_baseabckup,也就是说它同样可以用于对 PostgreSQL 做备份恢复。polar_basebackup 在 PolarDB 二进制安装目录下的 bin/ 目录中,您可以配置 export 环境变量来直接使用它。polar_basebackup takes a base backup of a running PostgreSQL server.
Usage:
polar_basebackup
[
OPTION
]..
.
Options controlling the output:
-D, --pgdata
=
DIRECTORY receive base backup into directory
-F, --format
=
p
|
t output
format
(
plain
(
default
)
,
tar)
-r, --max-rate
=
RATE maximum transfer rate to transfer data directory
(
in kB/s, or use suffix
"k"
or
"M")
-R, --write-recovery-conf
write
recovery.conf
for
replication
-T, --tablespace-mapping
=
OLDDIR
=
NEWDIR
relocate tablespace
in
OLDDIR to NEWDIR
--waldir
=
WALDIR location
for
the write-ahead log directory
-X, --wal-method
=
none
|
fetch
|
stream
include required WAL files with specified method
-z, --gzip compress
tar
output
-Z, --compress
=0
-9 compress
tar
output with given compression level
General options:
-c, --checkpoint
=
fast
|
spread
set
fast or spread checkpointing
-C, --create-slot create replication slot
-l, --label
=
LABEL
set
backup label
-n, --no-clean
do
not clean up after errors
-N, --no-sync
do
not
wait
for
changes to be written safely to disk
-P, --progress show progress information
-S, --slot
=
SLOTNAME replication slot to use
-v, --verbose output verbose messages
-V, --version output version information,
then
exit
--no-slot prevent creation of temporary replication slot
--no-verify-checksums
do
not verify checksums
-?, --help show this help,
then
exit
Connection options:
-d, --dbname
=
CONNSTR connection string
-h, --host
=HOSTNAME
database server
host
or socket directory
-p, --port
=
PORT database server port number
-s, --status-interval
=
INTERVAL
time
between status packets sent to server
(
in seconds
)
-U, --username
=
NAME connect as specified database user
-w, --no-password never prompt
for
password
-W, --password force password prompt
(
should happen automatically
)
--polardata
=
datadir receive polar data backup into directory
--polar_disk_home
=
disk_home polar_disk_home
for
polar data backup
--polar_host_id
=
host_id polar_host_id
for
polar data backup
--polar_storage_cluster_name
=
cluster_name polar_storage_cluster_name
for
polar data backup
5.可以看到 polar_basebackup 的大部分参数及用法都和 pg_basebackupopen in new window 一致,只是多了以下几个参数,下面重点来介绍一下:
polardata: 如果您备份的实例是 PolarDB 共享存储架构,这个参数用于指定 PolarDB 共享存储目录的位置。如果您不指定,将会使用默认目录 polar_shared_data,并且放在本地存储目录(即 -D / --pgdata 所指定的参数)下面。如果您对 PostgreSQL 备份则无需关心他。
polar_disk_home: 如果您备份的实例是 PolarDB 共享存储架构,且您希望将共享存储目录通过 PFS 写入共享存储设备,则需要指定这个参数,它是 PFS 的使用参数。polar_host_id: 如果您备份的实例是 PolarDB 共享存储架构,且您希望将共享存储目录通过 PFS 写入共享存储设备,则需要指定这个参数,它是 PFS 的使用参数。polar_storage_cluster_name: 如果您备份的实例是 PolarDB 共享存储架构,且您希望将共享存储目录通过 PFS 写入共享存储设备,则需要指定这个参数,它是 PFS 的使用参数。
如下3个参数也都是专门针对PFS来进行一个使用,如果说你没有用PFS就不用设定这3个参数.这3个参数对应的pfi参数大家可以参照.
三、搭建 RO
1.您可以通过以下两种方式来搭建 RO node。使用 initdb 来搭建 RO主要步骤是使用 initdb 初始化 RO 的本地存储目录,然后修改配置文件,启动实例。
具体请参考 只读节点部署。备份 RW 的本地存储目录来搭建 RO.这里使用备份 RW 的本地存储目录。下面通过 polar_basebakcup 来演示.polar_basebackup --host=[主节点所在IP] --port=5432 -D /home/postgres/replica1 -X stream --progress --write-recovery-conf -v
通过命令来进行一个演示,因为RWRO是共享存储,所以对于RO来讲你只需要备份一个本地存储就可以,共享存储直接通过共享存储目录来进行一个读取.
完成 polar_basebackup 命令后,我们可以看到 /home/postgres/replica1 中存在一个 polar_shared_data, 搭建 RO 时不需要它,将它删除:
rm -rf /home/postgres/replica1/polar_shared_data
我们需要分别修改一个postgrad recovery跟一个recovery com两个配置文件,两个配置文件这一记得修改端口以及pfs如下的几个参数,如果是本地重组文件则只需要修改一个POLODAYTADNA就可以修改于COVER的一个参数最后通过如下的命令来冲洗节点通过如下的一个命令来检查是否能够正常运行。
打开 /home/postgres/replica1/postgresql.conf,修改如下配置项:port=5433polar_hostid=2polar_enable_shared_storage_mode=onpolar_disk_name='nvme0n1'polar_datadir='/nvme0n1/shared_data/'polar_vfs.localfs_mode=offshared_preload_libraries='$libdir/polar_vfs,$libdir/polar_worker'polar_storage_cluster_name='disk'logging_collector=onlog_line_prefix='%p\t%r\t%u\t%m\t'log_directory='pg_log'listen_addresses='*'max_connections=1000synchronous_standby_names=''
打开 /home/postgres/replica1/recovery.conf,使用以下配置项替换文件中的所有内容:polar_replica='on'recovery_target_timeline='latest'primary_slot_name='replica1'primary_conninfo='host=[主节点所在IP] port=5432 user=postgres dbname=postgres application_name=replica1'
最后,启动只读节点:
$HOME
/tmp_basedir_polardb_pg_1100_bld/bin/pg_ctl start -D
$HOME
/replica1
检查只读节点能否正常运行:
$HOME
/tmp_basedir_polardb_pg_1100_bld/bin/psql
\
-p
5433
\
-d postgres
\
-c
'select version();'
version
--------------------------------
PostgreSQL
11.9
(
POLARDB
11.9)(1
row
)
2.搭建 Standby
您可以使用全量备份集搭建 Standby,这里推荐使用 polar_basebackup 进行搭建,下面介绍搭建流程。
#使用 polar_basebakcup 对实例作全量备份
polar_basebackup --host
=[
主节点所在IP
]
--port
=5432
-D /home/postgres/standby --polardata
=
/nvme0n2/shared_data/ --polar_storage_cluster_name
=
disk --polar_disk_name
=
nvme0n2 --polar_host_id
=3
-X stream --progress --write-recovery-conf -v
在这条命令当中--host跟--port都是表示主节点链接到一个主节点在此基础上我们需要指名polardata=/nvme0n2/shared_data就共享存储目录以及如下的pfs的3个参数。如果如果能够正常备份成功则会有如下的一个提示
也是有一个完成,在pfs层面会创建一些目录,提示注意:这里是构建共享存储的 Standby首先您需要找一台机器部署好 PolarDB 及其文件系统 PolarFS,且已经搭建好了共享存储nvme0n2,具体操作请参考 准备块设备与搭建文件系统,备份完成后如下图所示:
提示如果您没有共享存储设备,则不需要指定 --polar_storage_cluster_name,--polar_disk_name,--polar_host_id 参数。
下面我们简单介绍下其他形态的 PolarDB 备份:
-- 单节点本地备份
polar_basebackup -D /polardb/data-standby -X stream --progress --write-recovery-conf -v
--共享存储本地备份
polar_basebackup -D /polardb/data-standby --polardata
=
/polardb/data-local -X stream --progress --write-recovery-conf -v
-- 共享存储写入pfs
polar_basebackup -D /polardb/data-standby --polardata
=
/nvme7n1/data --polar_storage_cluster_name
=
disk --polar_disk_name
=
nvme7n1 --polar_host_id
=3
3.本地备份就是PG原生的备份法是共享成组,本地备份就是你不需要指定pfs的3个插入,只需要指定一个 polardb/data 的一个共享充足目录就可以,进行一个备份pfs 共享充足要写入一个pfs只需要指定pfs的相关参数。我们也可以检查本地目录是否正常,是否有如下的几个文件
查看本地目录:
查看共享存储目录:
修改 postgresql.conf
将参数修改为如下所示:polar_hostid = 3polar_disk_name = 'nvme0n2'polar_datadir = '/nvme0n2/shared_data'polar_storage_cluster_name = 'disk'synchronous_standby_names=''
#在主库中创建复制槽
psql --host=[主节点所在IP] --port=5432 -d postgres -c 'SELECT * FROM pg_create_physical_replication_slot('standby1');'
slot_name | lsn
-----------+-----
standby1 |(1 row)
#修改 Standby 本地目录配置
在 Standby 的本地存储目录中 recovery.conf 文件中增加如下参数:
recovery_target_timeline = 'latest'primary_slot_name = 'standby1'
#启动 Standby
$HOME/tmp_basedir_polardb_pg_1100_bld/bin/pg_ctl start -D $HOME/standby
#验证 Standby
psql --host=[master所在IP] --port=5432 -d postgres -c "create table t(t1 int primary key, t2 int);insert into t values (1, 1),(2, 3),(3, 3);"
CREATE TABLE
INSERT 0 3
psql --host=[standby所在IP] --port=5432 -d postgres -c ' select * from t;'
t1 | t2
----+----
1 | 1
2 | 3
3 | 3(3 rows)
4.按时间点恢复
按时间进行恢复就是说通过一个具体的一个数据目录来恢复,某个记录点下的一个数据,如果要按确定按哪个时间点恢复则需要在 redo point 之外加上我们的归档日志里面的文件数据,来恢复任意时刻的数据库。
可以参考 PostgreSQL 按时间点恢复 PITRopen in new window。其原理如图所示,使用备份集加上归档日志,可以恢复出任意历史时刻的 PolarDB 实例: