【一文搞懂PGSQL】4.逻辑备份和物理备份 pg_dump/ pg_basebackup

本文涉及的产品
RDS MySQL DuckDB 分析主实例,基础系列 4核8GB
RDS AI 助手,专业版
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
简介: 本文介绍了PostgreSQL数据库的备份与恢复方法,包括数据和归档日志的备份,以及使用`pg_dump`和`pg_basebackup`工具进行逻辑备份和物理备份的具体操作。通过示例展示了单库和单表的备份与恢复过程,并提供了错误处理方案。此外,还详细描述了如何利用物理备份工具进行数据损坏修复及特定时间点恢复(PITR)的操作步骤,以应对误操作导致的数据丢失问题。

备份恢复

需要备份什么?

数据

归档日志

备份方式

逻辑导出工具

pg_dump

pg_dumpall

单库备份

pg_dump  testdatabase  -h 10.10.8.176 -U test  -W -C   > /pgdata/pg_backup/test_$(date +"%Y_%m_%d").sql

-C   # 备份的时候备份创建库的指令

单表备份

pg_dump testdatabase  -h 10.10.8.176 -U test  -W -C  -t t1 > /pgdata/pg_backup/test_$(date +"%Y_%m_%d").sql

单库恢复 // 必须先创建库

# 必须加 -d 参数指定库  不然会导入默认库 如果想修改导入的库 需要修改 备份的 dump 文件
psql -h 10.10.8.176 -U test -p 5432 -d test -f /pgdata/pg_backup/test_$(date +"%Y_%m_%d").sql

单表恢复

# 必须加 -d 参数指定库  不然会导入默认库
psql -h 10.10.8.176 -U test -p 5432 -d test -f /pgdata/pg_backup/t1_$(date +"%Y_%m_%d").sql

pg_basebackup 物理备份工具的使用

必须是同版本才能使用

备份的流程

pg_basebackup:检查点已完成
pg_basebackup:提前写入日志起点:0/B000028 时间线 1
pg_basebackup:启动后台WAL接收器
pg_basebackup:已创建临时复制插槽“pg_basebackup_39298”
40533/40533 kB(100%),1/1表空间
pg_basebackup:预写日志结束点:0/B000138
pg_basebackup:正在等待后台进程完成流式处理。。。
pgbasebackup:正在将数据同步到磁盘。。。
pg
基本备份:基本备份已完成

备份

# 创建备份目录
# 必须是空目录才能备份成功
mkdir -p /pgdata/pg_backup

# 执行备份命令
pg_basebackup -D /pgdata/pg_backup/ -F t -Pv -U postgres -h 127.0.0.1 -p 5432 -R  -Z 3


-D    # 指定备份路径
-F t  # 备份的方式  tar包
-Pv   # 显示执行的详细信息
-Z 3  # 压缩备份 并选择压缩等级 (1-9级)


报错:
2022-04-22 16:20:42.046 CST [27858] FATAL:  no pg_hba.conf entry for replication connection from host "10.10.8.176", user "postgres", SSL off
pg_basebackup: error: FATAL:  no pg_hba.conf entry for replication connection from host "10.10.8.176", user "postgres", SSL off

# 添加防火墙规则
vim /pgdata/12/data/pg_hba.conf
host    replication     all             10.10.8.0/24            md5

# 重载 pg 配置
# pg_ctl reload
select pg_reload_conf();

模拟损坏修复

# 强制关闭所有进程
pkill  postgres

# 删除数据目录
rm -fr /pgdata/12/data/*

# 删除归档日志目录
rm -fr /archive/*

# 将备份解压到数据目录
tar xf base.tar.gz   -C /pgdata/12/data/

# 将归档日志解压到归档目录下
tar xf pg_wal.tar.gz -C /archive/

# 配置修复位置
cat >/pgdata/12/data/postgresql.auto.conf<<'EOF'
# 将归档日志拷贝到重做日志目录
restore_command = 'cp /archive/%f %p'

# 指定恢复位置
recovery_target = 'immediate'
EOF

# 启动服务 // 注意现在的pgsql是恢复状态的无法使用!!!
pg_ctl start

# 查看当前PostgreSQL状态
pg_controldata |grep 'Database cluster state:'
Database cluster state:               in archive recovery  # 此状态pg不可用

# 重置恢复状态
select pg_wal_replay_resume();

# 检查状态
pg_controldata |grep 'Database cluster state:'
Database cluster state:               in production

# 完成恢复

PITR恢复演示

场景介绍

每天 0 点进行一次全备 , 下午两点误删除了数据,如何恢复?

恢复逻辑

1、恢复全备数据

2、归档恢复: 备份归档 + 0点到下午两点前删除前一个sql ,在线redo

模拟场景

-- 创建新库
 create database pitdb;

\c pitdb;

-- 创建新表插入数据
create table t1(id int);
insert into t1 values(1),(2),(3),(4);

#  执行全备
pg_basebackup -D /pgdata/pg_backup/ -F t -Pv -U postgres -h 10.10.8.176 -p 5432 -R  -Z 3

-- 创建新表插入数据
create table t2(id int);
insert into t2 values(1),(2),(111);

-- 模拟删库
\c postgres;
drop database pitdb;

-- 查看当前重做文件
select pg_walfile_name(pg_current_wal_lsn());

-- 切换重做日志
select pg_switch_wal();

# 找一台新机器启动相同版本的实例,删除数据目录将备份解压到数据目录
rm -rf /pgdata/12/data/*

# 将备份解压到数据目录
tar xf base.tar.gz -C /pgdata/12/data/

# 将备份的重做文件解压到归档目录
tar xf pg_wal.tar.gz -C /archive/

# 将重做文件目录里新产生的文件拷贝到新机器的归档目录
scp  /archive/*  10.10.8.177:/archive/

# 查找重做日志中的删除语句的位置点
pg_waldump /archive/00000002000000000000000D|grep DROP
rmgr: Database    len (rec/tot):     34/    34, tx:        580, lsn: 0/0D0126E8, prev 0/0D012670, desc: DROP dir 1663/16462

# 编辑配置文件
vim  /pgdata/12/data/postgresql.auto.conf
# 将归档日志拷贝到重做日志目录
restore_command = 'cp /archive/%f %p'

# 指定恢复的位置点 //这里也可以指定lsn号进行恢复
recovery_target_xid = '579'

# 查看数据库状态
[postgres@pg-01 archive]$ pg_controldata |grep 'Database cluster state:'
Database cluster state:               in archive recovery

-- 重置恢复状态
select pg_wal_replay_resume();

# 查看数据库状态
[postgres@pg-01 archive]$ pg_controldata |grep 'Database cluster state:'
Database cluster state:               in production

# 查看数据
postgres=# \c pitdb
You are now connected to database "pitdb" as user "postgres".
pitdb=# select * from t1;
 id 
----
  1
  2
  3
  4
(4 rows)

pitdb=# select * from t2;
 id  
-----
   1
   2
 111
(3 rows)

# 将实例里的pitdb库进行备份,导入到生产库即可
# 完成恢复

# 还可以再执行危险操作前生成保存点,在恢复时直接指定保存点进行恢复 
select pg_create_restore_point('test-t1-index'); # recovery_target_name = 'test-t1-index'
相关实践学习
通过日志服务实现云资源OSS的安全审计
本实验介绍如何通过日志服务实现云资源OSS的安全审计。
相关文章
|
存储 关系型数据库 数据库
PostgreSQL的逻辑备份与物理备份
制定备份和恢复计划是每一个DBA最重要的工作之一,它决定了数据的有效性和完整性。也可以搭建跨越不同数据中心的流复制集群,能有效的帮助你避免单点故障。但是只有一份有效的备份能够帮助从delete或者drop的误操中恢复数据。
4039 0
|
关系型数据库 数据库 PostgreSQL
postgresql|【基于pg_basebackup命令的归档备份和恢复---热备冷恢复方式】
postgresql|【基于pg_basebackup命令的归档备份和恢复---热备冷恢复方式】
908 0
|
存储 固态存储 关系型数据库
PostgreSQL核心操作之数据备份恢复
PostgreSQL核心操作之数据备份恢复
1611 0
|
弹性计算 关系型数据库 数据库
PostgreSQL 数据库实例只读锁定(readonly) - 硬锁定,软锁定,解锁
标签 PostgreSQL , 只读 , 锁定 , readonly , recovery.conf , 恢复模式 , pg_is_in_revoery , default_transaction_read_only 背景 在一些场景中,可能要将数据库设置为只读模式。 例如, 1、云数据库,当使用的容量超过了购买的限制时。切换到只读(锁定)模式,确保用户不会用超。 2、业务上需要对
7880 0
|
运维 监控 关系型数据库
【一文搞懂PGSQL】7. PostgreSQL + repmgr + witness 高可用架构
该文档介绍了如何构建基于PostgreSQL的高可用架构,利用repmgr进行集群管理和故障转移,并引入witness节点增强网络故障检测能力。repmgr是一款轻量级的开源工具,支持一键部署、自动故障转移及分布式节点管理。文档详细描述了环境搭建步骤,包括配置postgresql参数、安装与配置repmgr、注册集群节点以及配置witness节点等。此外,还提供了故障手动与自动切换的方法及常用命令,确保集群稳定运行。
|
关系型数据库 数据库 PostgreSQL
【一文搞懂PGSQL】1.简述和安装
PostgreSQL(简称PG或PGSQL)是一款使用C和C++语言开发的开源关系型数据库管理系统。其官网为 [www.postgresql.org](https://www.postgresql.org/),中文社区为 [www.postgres.cn](http://www.postgres.cn)。PG采用了多层逻辑结构:第一层为实例,第二层为数据库(每个实例下可有多个相互独立的数据库),第三层为Schema(每个数据库下包含多个Schema)。每个Schema下可以创建表、视图、索引、函数等数据库对象。
|
负载均衡 关系型数据库 PostgreSQL
【一文搞懂PGSQL】6. PostgreSQL + pgpool-II 实现读写分离
本文介绍了如何使用 PostgreSQL 和 pgpool-II 实现读写分离。pgpool-II 支持连接池、负载均衡等功能,适用于多种模式。文中详细描述了安装、配置及启动过程,并提供了示例命令,帮助读者快速搭建并验证读写分离环境。通过配置 `pgpool.conf` 文件指定监听地址、端口及节点信息等参数,确保系统的高效运行与故障转移。
|
关系型数据库 Shell 数据库
[postgres]启用归档模式
[postgres]启用归档模式
552 0
|
存储 关系型数据库 MySQL
Percona XtraBackup是否支持PostgreSQL数据库备份?
【5月更文挑战第13天】Percona XtraBackup是否支持PostgreSQL数据库备份?
393 1