PostgreSQL提供了pg_dump以及pg_dumpall的命令来实现逻辑备份。
这两命令差不多,看名字猜的。
pg_dump这种备份,不会造成用户对数据的操作出现阻塞。
查看命令:
这个命令从三点去看:
操作一波备份数据库中的全部数据
删除当前laozheng库中的表等信息,然后恢复数据。
除此之外,也可以通过图形化界面备份,在库的位置点击备份就成,导出一个文本文件。
这里需要基于前面的文件系统的备份和归档备份实现最终的操作
单独使用文件系统的方式,不推荐毕竟数据会丢失。
这里直接上PostgreSQL提供的pg_basebackup命令来实现。
pg_basebackup会做两个事情、
查看pg_basebackup命令
# -D 指定备份文件的存储位置
# -Ft 备份文件打个包
# -Pv 输出备份的详细信息
# -U 用户名(要拥有备份的权限)
# -h ip地址 -p 端口号
# -R 复制写配置文件
pg_basebackup -D /pg_basebackup -Ft -Pv -Upostgres -h 192.168.11.32 -p 5432 -R
准备测试
mkdir /pg_basebackup
chown -R postgres. /pg_basebackup/
pg_basebackup -D /pg_basebackup -Ft -Pv -Upostgres -h 192.168.11.32 -p 5432 -R
模拟数据库崩盘,先停止postgresql服务,然后直接删掉data目录下的全部内容
将之前备份的两个文件准备好,一个base.tar,一个pg_wal.tar
第一步:将base.tar中的内容,全部解压到 12/data 目录下
第二步:将pg_wal.tar中的内容,全部解压到 /archive 目录下
第三步:在postgresql.auto.conf文件中,指定归档文件的存储位置,以及恢复数据的方式
第四步:启动postgresql服务
systemctl start postgresql-12
第五步:启动后,发现查询没问题,但是执行写操作时,出错,不让写。需要执行一个函数,取消这种恢复数据后的状态,才允许正常的执行写操作。
select pg_wal_replay_resume();
场景:每天凌晨02:00,开始做全备(PBK),到了第二天,如果有人14:00分将数据做了误删,希望将数据恢复到14:00分误删之前的状态?
-- 构建一张表
create table t3 (id int);
insert into t3 values (1);
insert into t3 values (11);
pg_basebackup -D /pg_basebackup -Ft -Pv -Upostgres -h 192.168.11.32 -p 5432 -R
-- 凌晨2点已经全备完毕
-- 模拟第二天操作
insert into t3 values (111);
insert into t3 values (1111);
-- 误删操作 2023年3月20日20:13:26
delete from t3;
将当前服务的数据全部干掉,按照之前的全备恢复的套路先走着
然后将全备的内容中的base.tar扔data目录下,归档日志也扔到/archive位置。
查看归档日志,需要基于postgresql提供的一个命令
# 如果命令未找到,说明两种情况,要么没有这个可执行文件,要么是文件在,没设置环境变量
# 咱们这是后者
pg_waldump
# 也可以采用全路径的方式
/usr/pgsql-12/bin/pg_waldump
修改postgresql.auto.conf文件
将之前的最大恢复,更换为指定的事务id恢复
基于提供的配置例子,如何指定事务id
修改postgresql.auto.conf文件指定好事务ID
select pg_wal_replay_resume();
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。