PG物理备份与恢复之pg_basebackup

2023-10-29 10:44

本文主要是介绍PG物理备份与恢复之pg_basebackup,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

PG物理备份与恢复之pg_basebackup

  • 开启WAL日志归档
  • pg_basebackup备份工具
  • 全库恢复:recovery.conf

🐘 数据库版本:PostgreSQL 10.4

开启WAL日志归档

通过数据库的全量备份和WAL日志,可以将数据库恢复到任意时间点。每个WAL日志文件大小通常是16MB。WAL日志文件个数增长到wal_keep_segments + 1个后,会覆盖已有的WAL日志文件。因此最好根据业务需求定时对WAL日志进行归档。

🕷 在PG 13版本中,wal_keep_segments被参数wal_keep_size取代。

创建归档目录:

mkdir /pg_arch
chown -R postgres:postgres /pg_arch

编辑配置文件postgresql.conf

wal_level = replica
archive_mode = on
archive_command = 'DATE=`date +%Y%m%d`; DIR="/pg_arch/$DATE"; (test -d $DIR || mkdir -p $DIR) && cp %p $DIR/%f'
wal_keep_segments = 128

其中,%p表示包含完整路径的WAL日志文件名,%f表示不包含路径信息的WAL日志文件名。

重启数据库:

pg_ctl stop
pg_ctl start

手动触发日志切换:

postgres=# checkpoint;               --刷新内存脏页到磁盘
CHECKPOINTpostgres=# select pg_switch_wal();   --手动归档WAL日志pg_switch_wal 
---------------0/50003C0
(1 row)

验证归档:

[postgres@dbhost ~]$ ls -lh /pgdata/pg_wal/
total 32M
-rw------- 1 postgres postgres 16M Oct 26 11:17 000000010000000000000009
-rw------- 1 postgres postgres 16M Oct 26 11:17 00000001000000000000000A
drwx------ 2 postgres postgres 244 Oct 26 11:17 archive_status[postgres@dbhost ~]$ ls -lh /pg_arch/20231026/
total 16M
-rw------- 1 postgres postgres 16M Oct 26 11:17 000000010000000000000009

pg_basebackup备份工具

从PostgreSQL 9.1开始,支持使用pg_basebackup进行数据库物理备份(热备份)。pg_basebackup通过replication协议连接到数据库,因此在pg_hba.conf中要允许replication连接。

[postgres@dbhost ~]$ cat /pgdata/pg_hba.conf | grep replica | grep -v '^#'
local   replication     all                                     trust
host    replication     all             127.0.0.1/32            trust
host    replication     all             ::1/128                 trust
host    replication     repl            0.0.0.0/0               md5

出于安全考虑,也可以创建单独的流复制用户配置到pg_hba.conf中,并禁用其他replication连接。

create role repl nosuperuser replication login connection limit 32 encrypted password 'Pwdabc123';

对本地数据库进行全库备份:

[postgres@dbhost ~]$ pg_basebackup -Urepl -Ft -Xf -z -Z5 -R -Pv -D /home/postgres/backup
39635/39635 kB (100%), 2/2 tablespaces[postgres@dbhost ~]$ ls backup/
16386.tar.gz  base.tar.gz  pg_wal.tar.gz

其中,纯数字命名的备份文件是对/pgdata/pg_tblspc目录下表空间的备份。

pg_basebackup支持的常用参数选项如下:

  • -h host:指定要连接的源数据库地址;
  • -p port:指定要连接的源数据库端口;
  • -U username:指定连接用户名;
  • -D path:指定备份的存放路径。如果不存在,会自动创建;如果已存在且非空,则会执行失败。
  • -F p|t:指定备份输出格式,默认为plain,t表示备份为tar包。
  • -X f|fetch|s|stream:f或fetch表示把备份过程中产生的xlog文件也备份。需要设置wal_keep_segments参数以保证备份过程中WAL日志不会被覆写。s或stream表示备份开始后,启动另一个连接从源库接收WAL日志。需要设置max_wal_senders参数至少大于2。
  • -R:生成用于恢复的recovery.conf文件。
  • -z:与-Ft连用,表示对备份输出的tar包进行gzip压缩,得到格式为.tar.gz的备份文件。
  • -Z level:指定gzip的压缩级别,取值范围为1~9,数字越大压缩率越高。
  • -l label:为备份指定标签,便于识别和管理备份文件。
  • -P:在备份过程中实时显示备份进度。
  • -v:备份过程中显示详细信息。

全库恢复:recovery.conf

利用pg_basebackup备份恢复整个数据库。

检查表空间备份对应的恢复路径:

[postgres@dbhost ~]$ ll /pgdata/pg_tblspc/
total 0
lrwxrwxrwx 1 postgres postgres 14 Oct 26 13:08 16386 -> /pgdata/sekiro

可以得知16386.tar.gz是表空间sekiro的备份。

也可以查询pg_tablespace系统表获知:

postgres=# select oid,* from pg_tablespace;oid  |  spcname   | spcowner | spcacl | spcoptions 
-------+------------+----------+--------+------------1663 | pg_default |       10 |        | 1664 | pg_global  |       10 |        | 16386 | sekiro     |    16384 |        | 
(3 rows)

切换WAL日志:

postgres=# checkpoint;
postgres=# select pg_switch_wal();

删除数据:

#停库
pg_ctl stop#移除数据目录下所有数据库文件
cd /pgdata && rm -rf *#解压基础备份到数据目录
tar -xvf /home/postgres/backup/base.tar.gz -C /pgdata#解压表空间备份到对应的数据库表空间路径(如果有)
tar -xvf /home/postgres/backup/16386.tar.gz -C /pgdata/sekiro#解压日志备份到WAL日志路径(如果有)
tar -xvf /home/postgres/backup/pg_wal.tar.gz -C /pgdata/pg_wal

$PGDATA路径下创建用于恢复的配置文件recovery.conf

cp /usr/local/pgsql/share/recovery.conf.sample /pgdata/recovery.conf
chmod 600 recovery.conf

recovery.conf中添加恢复命令,拷贝归档日志到数据库原始路径下;

echo "restore_command='cp /pg_arch/20231026/%f %p'" > /pgdata/recovery.conf
echo "recovery_target_timeline = 'latest'" >> /pgdata/recovery.conf

启动数据库,自动读取recovery.conf进入恢复恢复:

[postgres@dbhost ~]$ pg_ctl start -D /pgdata
waiting for server to start....2023-10-26 14:08:30.862 CST [10503] LOG:  listening on IPv4 address "0.0.0.0", port 5432
2023-10-26 14:08:30.862 CST [10503] LOG:  listening on IPv6 address "::", port 5432
2023-10-26 14:08:30.864 CST [10503] LOG:  listening on Unix socket "/tmp/.s.PGSQL.5432"
2023-10-26 14:08:30.939 CST [10503] LOG:  redirecting log output to logging collector process
2023-10-26 14:08:30.939 CST [10503] HINT:  Future log output will appear in directory "log".done
server started

恢复完成后,recovery.conf会被重命名为recovery.done

检查告警日志中的恢复信息:

[postgres@dbhost ~]$ tail -f /pgdata/log/server_Thu.log 
cp: cannot stat ‘/pg_arch/20231026/000000020000000000000010’: No such file or directory
2023-10-26 14:08:31.609 CST [10505] LOG:  redo done at 0/F0000D0
2023-10-26 14:08:31.621 CST [10505] LOG:  restored log file "00000002000000000000000F" from archive
cp: cannot stat ‘/pg_arch/20231026/00000003.history’: No such file or directory
2023-10-26 14:08:32.032 CST [10505] LOG:  selected new timeline ID: 3
2023-10-26 14:08:32.531 CST [10505] LOG:  archive recovery complete
2023-10-26 14:08:32.533 CST [10505] LOG:  restored log file "00000002.history" from archive
2023-10-26 14:08:32.638 CST [10503] LOG:  database system is ready to accept connections

References
【1】https://blog.csdn.net/jnrjian/article/details/129945206
【2】https://www.postgresql.org/docs/9.4/runtime-config-replication.html
【3】https://www.modb.pro/db/332203

这篇关于PG物理备份与恢复之pg_basebackup的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/300107

相关文章

使用Python实现网络设备配置备份与恢复

《使用Python实现网络设备配置备份与恢复》网络设备配置备份与恢复在网络安全管理中起着至关重要的作用,本文为大家介绍了如何通过Python实现网络设备配置备份与恢复,需要的可以参考下... 目录一、网络设备配置备份与恢复的概念与重要性二、网络设备配置备份与恢复的分类三、python网络设备配置备份与恢复实

MySQL使用binlog2sql工具实现在线恢复数据功能

《MySQL使用binlog2sql工具实现在线恢复数据功能》binlog2sql是大众点评开源的一款用于解析MySQLbinlog的工具,根据不同选项,可以得到原始SQL、回滚SQL等,下面我们就来... 目录背景目标步骤准备工作恢复数据结果验证结论背景生产数据库执行 SQL 脚本,一般会经过正规的审批

通过ibd文件恢复MySql数据的操作方法

《通过ibd文件恢复MySql数据的操作方法》文章介绍通过.ibd文件恢复MySQL数据的过程,包括知道表结构和不知道表结构两种情况,对于知道表结构的情况,可以直接将.ibd文件复制到新的数据库目录并... 目录第一种情况:知道表结构第二种情况:不知道表结构总结今天干了一件大事,安装1Panel导致原来服务

MySQL InnoDB引擎ibdata文件损坏/删除后使用frm和ibd文件恢复数据

《MySQLInnoDB引擎ibdata文件损坏/删除后使用frm和ibd文件恢复数据》mysql的ibdata文件被误删、被恶意修改,没有从库和备份数据的情况下的数据恢复,不能保证数据库所有表数据... 参考:mysql Innodb表空间卸载、迁移、装载的使用方法注意!此方法只适用于innodb_fi

mysql通过frm和ibd文件恢复表_mysql5.7根据.frm和.ibd文件恢复表结构和数据

《mysql通过frm和ibd文件恢复表_mysql5.7根据.frm和.ibd文件恢复表结构和数据》文章主要介绍了如何从.frm和.ibd文件恢复MySQLInnoDB表结构和数据,需要的朋友可以参... 目录一、恢复表结构二、恢复表数据补充方法一、恢复表结构(从 .frm 文件)方法 1:使用 mysq

mysql8.0无备份通过idb文件恢复数据的方法、idb文件修复和tablespace id不一致处理

《mysql8.0无备份通过idb文件恢复数据的方法、idb文件修复和tablespaceid不一致处理》文章描述了公司服务器断电后数据库故障的过程,作者通过查看错误日志、重新初始化数据目录、恢复备... 周末突然接到一位一年多没联系的妹妹打来电话,“刘哥,快来救救我”,我脑海瞬间冒出妙瓦底,电信火苲马扁.

Rsnapshot怎么用? 基于Rsync的强大Linux备份工具使用指南

《Rsnapshot怎么用?基于Rsync的强大Linux备份工具使用指南》Rsnapshot不仅可以备份本地文件,还能通过SSH备份远程文件,接下来详细介绍如何安装、配置和使用Rsnaps... Rsnapshot 是一款开源的文件系统快照工具。它结合了 Rsync 和 SSH 的能力,可以帮助你在 li

SQL Server使用SELECT INTO实现表备份的代码示例

《SQLServer使用SELECTINTO实现表备份的代码示例》在数据库管理过程中,有时我们需要对表进行备份,以防数据丢失或修改错误,在SQLServer中,可以使用SELECTINT... 在数据库管理过程中,有时我们需要对表进行备份,以防数据丢失或修改错误。在 SQL Server 中,可以使用 SE

虚拟机与物理机的文件共享方式

《虚拟机与物理机的文件共享方式》文章介绍了如何在KaliLinux虚拟机中实现物理机文件夹的直接挂载,以便在虚拟机中方便地读取和使用物理机上的文件,通过设置和配置,可以实现临时挂载和永久挂载,并提供... 目录虚拟机与物理机的文件共享1 虚拟机设置2 验证Kali下分享文件夹功能是否启用3 创建挂载目录4

Git中恢复已删除分支的几种方法

《Git中恢复已删除分支的几种方法》:本文主要介绍在Git中恢复已删除分支的几种方法,包括查找提交记录、恢复分支、推送恢复的分支等步骤,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录1. 恢复本地删除的分支场景方法2. 恢复远程删除的分支场景方法3. 恢复未推送的本地删除分支场景方法4. 恢复