分享 | 一文了解 PG PITR 即时恢复「终于解决」

分享 | 一文了解 PG PITR 即时恢复「终于解决」作者:颜博 青云科技数据库研发工程师 目前从事 PostgreSQL 产品开发工作,热衷于 PostgreSQL 数据库的学习和研究 在数据库系统中,数据是一切的基础,数据的安全更是重中之重。但可能因

分享 | 一文了解 PG PITR 即时恢复

作者:颜博 青云科技数据库研发工程师

目前从事 PostgreSQL 产品开发工作,热衷于 PostgreSQL 数据库的学习和研究

在数据库系统中,数据是一切的基础,数据的安全更是重中之重。但可能因为各种原因导致数据丢失或损坏,因此数据的备份和恢复便显得尤为重要。

PostgreSQL 是一个强大的开源对象关系数据库系统,经过 30 多年的积极开发,在可靠性、功能稳健性和性能方面赢得了良好的声誉。Point-In-Time Recovery(简称 PITR) 是 PostgreSQL 的基于时间点的数据恢复技术,在开启 WAL 日志归档及基础备份后,可以即时恢复用户误操作丢失的数据,为您的数据库加上一重”保险”。

本文将演示 PostgreSQL 如何配置 PITR 数据备份,以及当数据被误删除后如何进行数据即时恢复。

|环境准备

准备数据库

准备 PostgreSQL 11 版数据库环境。

# echo "$PGHOME" 查看
PGHOME=/usr/lib/postgresql/11

# echo "$PGDATA" 查看,PostgreSQL 的数据目录
PGDATA=/data/pgsql/main

# pg 命令行执行 show config_file; 命令查看,PostgreSQL 的配置文件位置
PGCONFIG_FILE=/etc/postgresql/11/main/postgresql.conf

# PostgreSQL 的启动日志位置,当启动失败时,可以通过日志快速查看报错内容
PG_LOG=/data/pglog/start.log

|PITR 数据备份

当用户误删除数据之后,可以通过 PITR 恢复指定的时间戳的数据。下面介绍开启备份及恢复数据的详细步骤。

开启 WAL 日志归档

通过修改配置文件,开启 WAL 日志归档功能。

# 创建保存wal日志归档的目录,并修改目录拥有者
$ mkdir -p /data/wallog_back
$ chown -R postgres:postgres /data/wallog_back

# 修改 PostgreSQL 数据库配置文件 postgresql.conf
$ vim /etc/postgresql/11/main/postgresql.conf

# 修改如下配置项:
wal_level = archive
archive_mode = on    
archive_command = "test ! -f /data/wallog_back/%f && cp %p /data/wallog_back/%f" # 配置归档命令,拷贝 wal 文件到指定目录,%p 为实际的 wal 文件目录,%f 为 wal 文件名称

# 保存后重启数据库
root:~# su postgres
# stop postgresql server
postgres:~$ /usr/lib/postgresql/11/bin/pg_ctl stop
# start postgresql server
postgres:~$ /usr/lib/postgresql/11/bin/pg_ctl -D /data/pgsql/main/ start 
-o "-c config_file=/etc/postgresql/11/main/postgresql.conf" -l /data/pglog/start.log

成功保存配置修改,即打开了 WAL 日志归档功能。

准备数据

# 创建测试表
CREATE TABLE test_table(
   ID INT     NOT NULL,
   NAME       TEXT    NOT NULL,
   AGE        INT     NOT NULL
);

# 插入测试数据。通过以下命令,快速插入 200001 条测试数据
insert into test_table(id, name, age) 
values(
generate_series(0,200000), 
substr(md5(random()::text), 0, 25), 
generate_series(0,200000)
);

执行基础备份

  • PostgreSQL 查看当前时间,指定备份时的 lable。
postgres=# select now();
              now              
-------------------------------
 2021-11-04 14:50:42.482253+08
(1 row)
  • 开始备份
# PostgreSQL 命令行执行 
postgres=# select pg_start_backup("backup_2021-11-04 14:50:42");
 pg_start_backup 
-----------------
 0/9000060
(1 row)

# 切换到 linux 命令行执行
cd /data
$ sudo tar -cvzf pgsql.tar pgsql

postgres=# select pg_stop_backup();
NOTICE:  pg_stop_backup complete, all required WAL segments have been archived
 pg_stop_backup 
----------------
 0/9000168
(1 row)
  • 执行一次 WAL 切换,使得 WAL 日志归档
postgres=# select pg_switch_wal();
 pg_switch_wal 
---------------
 0/A000078
(1 row)
  • 查看归档状态,如果 archived_count 为 0 代表异常,需要查看配置文件是否修改成功或尝试重启 PostgreSQL 服务
postgres=# select * from pg_stat_archiver;

注意:

  • 备份完成后,/data/wallog_back/ 目录下应该有相应的归档文件。

file

  • select * from pg_stat_archiver;命令执行完成后,如果 archived_count 为 0,代表归档设置开启失败,请重新检查配置文件或重启服务。

file

|PITR 数据恢复

模拟误删数据

# 删除 test_table 表中 id 大于 10000 的数据,模拟误删除数据的操作
postgres=# delete from test_table where id>10000;
DELETE 190000

# 查询出当前时间,根据此时间确定大概的恢复时间点
postgres=#  select now();
              now              
-------------------------------
 2021-11-04 14:56:17.452967+08
(1 row)

即时恢复数据

# 停止数据库运行
$ /usr/lib/postgresql/11/bin/pg_ctl stop

# 重命名 pgsql 目录
cd /data
mv pgsql pgsql_back

# 恢复备份包到 data 目录
sudo tar -zxvf pgsql.tar

# 配置 data 目录下的recovery.done文件,如果没有则创建。
restore_command="cp /data/wallog_back/%f %p"		# wal归档的目录
recovery_target_time="2021-11-04 14:56:17.452967"	# 恢复到此时刻,根据之前的 select now()判断恢复时刻。
recovery_target_timeline="latest"

重新启动数据库

$ /usr/lib/postgresql/11/bin/pg_ctl -D /data/pgsql/main/ start -o "-c config_file=/etc/postgresql/11/main/postgresql.conf" -l /data/pglog/start.log

|数据恢复验证

postgres=# select * from test_table;
postgres=# select count(*) from test_table;
 count  
--------
 200001
(1 row)

如图所示,数据恢复到了 200001 条。

file

|总结

PITR 在配置一定条件后,可以进行数据的恢复,在误删除数据后,可以帮助我们找回数据。

|参考

  • https://www.postgresql.org/
  • https://blog.csdn.net/arcticJian/article/details/102746287
  • https://my.oschina.net/Kenyon/blog/58112

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/5747.html

(0)
上一篇 2023-04-26
下一篇 2023-04-26

相关推荐

  • Python中的Class使用详解

    Python中的Class使用详解在Python编程中,Class是一种十分重要的概念,其使用范围非常广泛。Class不仅可以定义对象的属性和方法,还可以继承和封装,是面向对象编程(Object-Oriented Programming, OOP)的基础之一。在本篇文章中,我们将详细介绍Python中的Class使用方法和技巧,帮助读者更好地编写Python程序。

    2024-05-01
    73
  • 初级程序员必备的代码基本规范有哪些_编写程序入门代码

    初级程序员必备的代码基本规范有哪些_编写程序入门代码所以今天我将我在《阿里巴巴Java开发手册》中看到的一些有用的、适合初级程序员的代码基本规范,分享给大家!如果是大括号内为空,则简洁地写成{}即

    2022-12-14
    154
  • Python执行CMD命令

    Python执行CMD命令Python是一款功能强大的编程语言,在开发和运维领域都有广泛的应用。在进行系统管理、监控、调试等工作过程中,经常需要与CMD命令打交道。Python提供了大量的方法来执行CMD命令,帮助用户更快捷地完成工作。

    2024-04-24
    63
  • mysql编程日记:导入、出某表数据[亲测有效]

    mysql编程日记:导入、出某表数据[亲测有效]登陆mysql后,输入: show variables like '%secure%'; 显示的secure_file_priv如果value值为null,则为禁止,如果有文件夹目录,

    2023-04-12
    157
  • Python文件命名原则

    Python文件命名原则在Python中,文件命名并没有严格要求,但是为了使代码更为易读易懂,提倡使用一些有规范的文件命名方式。

    2024-04-14
    96
  • 解决Redis-cli客户端工具使用命令效率较低问题「建议收藏」

    解决Redis-cli客户端工具使用命令效率较低问题「建议收藏」解决Redis-cli客户端工具使用命令效率较低问题 一.介绍 使用 redis-cli 客户端工具,必须使用命令进行操作,效率比较低。 将使用图形化工具对redis数据库中的数据进行管理 redi…

    2023-02-09
    159
  • mssql sqlserver 添加表注释和添加列注释的方法分享[通俗易懂]

    mssql sqlserver 添加表注释和添加列注释的方法分享[通俗易懂]转自: http://www.maomao365.com/?p=8919 摘要: 下文讲述使用sql脚本对数据表或数据列添加注释(备注说明)的方法分享,如下所示: 实验环境:sql serv

    2022-12-19
    161
  • Python中elif的用法

    Python中elif的用法Python中的elif语句是if-else语句的一部分,是if语句中的一个条件分支。elif是else if的缩写,表示如果前面的if语句判断条件为False,则进一步判断elif语句中的条件是否为True。如果是,则执行elif语句后面的代码块,否则执行else语句后面的代码块。

    2024-03-13
    84

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注