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

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
简介: 本文介绍了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'
相关实践学习
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
相关文章
|
存储 关系型数据库 数据库
PostgreSQL的逻辑备份与物理备份
制定备份和恢复计划是每一个DBA最重要的工作之一,它决定了数据的有效性和完整性。也可以搭建跨越不同数据中心的流复制集群,能有效的帮助你避免单点故障。但是只有一份有效的备份能够帮助从delete或者drop的误操中恢复数据。
3854 0
|
关系型数据库 数据库 PostgreSQL
PostgreSQL 12: Recovery.conf 文件参数合并到 postgresql.conf
PostgreSQL 12 的一个重要变化是 recovery.conf 配置文件中的参数合并到 postgresql.conf,recovery.conf 不再使用,我们看看手册的说明,如下: 发行说明 Move recovery.
5074 0
|
关系型数据库 数据库 PostgreSQL
postgresql|【基于pg_basebackup命令的归档备份和恢复---热备冷恢复方式】
postgresql|【基于pg_basebackup命令的归档备份和恢复---热备冷恢复方式】
672 0
|
存储 固态存储 关系型数据库
PostgreSQL核心操作之数据备份恢复
PostgreSQL核心操作之数据备份恢复
958 0
|
存储 NoSQL 网络协议
PG内核解读-第1节PostgreSQL系统概述
本文整理自阿里云数据库开源社区Maintainer于巍(花名漠雪),在PostgreSQL数据库内核解读系列的分享。本篇内容主要分为四个部分: 1. 本系列教程介绍 2. PostgreSQL概述(历史、架构) 3. PostgreSQL安装启动 4. PostgreSQL常用命令、调试
PG内核解读-第1节PostgreSQL系统概述
|
存储 监控 关系型数据库
监控 PostgreSQL 的性能指标
监控 PostgreSQL 的性能指标
586 3
|
运维 监控 关系型数据库
【一文搞懂PGSQL】7. PostgreSQL + repmgr + witness 高可用架构
该文档介绍了如何构建基于PostgreSQL的高可用架构,利用repmgr进行集群管理和故障转移,并引入witness节点增强网络故障检测能力。repmgr是一款轻量级的开源工具,支持一键部署、自动故障转移及分布式节点管理。文档详细描述了环境搭建步骤,包括配置postgresql参数、安装与配置repmgr、注册集群节点以及配置witness节点等。此外,还提供了故障手动与自动切换的方法及常用命令,确保集群稳定运行。
|
SQL 数据库 关系型数据库
pg_dump 详解/使用举例
pg_dump是一个用于备份PostgreSQL数据库的实用工具。即使当前数据库正在使用,也能够生成一致性的备份,且不会阻塞其他用户访问数据库(包括读、写) pg_dump只能备份一个数据库。如果要备份Cluster中数据库共有的全局对象,例如角色和表空间,需要使用pg_dumpall。
11646 0
|
存储 容灾 关系型数据库
7 PostgreSQL 物理备份和还原,逻辑备份和还原|学习笔记
快速学习7 PostgreSQL 物理备份和还原,逻辑备份和还原
7 PostgreSQL 物理备份和还原,逻辑备份和还原|学习笔记