瀚高数据库基于时间点和还原点恢复的PITR技术实践整理

一、PITR技术简介
基于时间点的恢复(PITR)简介
数据库的PITR是一般数据库都必须满足的技术;
其原理是依据之前的物理备份文件加上wal的预写日志模式备份做的恢复;
该技术支持8.*及以上版本。
恢复原理:基础备份+归档日志执行指定时间点还原点的恢复
二、实践步骤
1、前期准备
1.1创建备份目录
切换至root用户
mkdir -p /data/pg10/backups
mkdir -p /data/pg10/archive_wals
backups目录则可以用来存放基础备份
archive_wals目录用来存放归档了
赋权给highgo
Chown highgo /data/pg10/backups
Chown highgo /data/pg10/archive_wals
1.2修改postgresql.conf相关参数(开启wal归档)
wal_level = replica
archive_mode = on
archive_directory = ’ /data/pg10/archive_wals/’
PG原来是
archive_command = ‘/usr/bin/lz4 -q -z %p /data/pg10/archive_wals/%f.lz4’
HG修改为archive_directory,直接写归档存放目录就可。
1.3重启服务
修改wal_level和archive_mode参数都需要重新启动数据库才可以生效,修改archive_command不需要重启,只需要reload即可,
2、创建基础备份
这里使用pg_basebackup创建基础备份
pg_basebackup是postgresql提供的一个方便基础备份的工具(9.1开始提供),这个工具会把整个数据库实例的数据都拷贝出来,而不只是把实例中的部分(如某个数据库或表)单独备份出来,该工具使用replication协议连接到数据库实例上,所以主数据库中的pg_hba.conf必须允许replication连接,类似如下:
①、local replication postgre ident
②、参数配置postgresql.conf:
wal_level = hot_standby
checkpoint_segments = 16
checkpoint_timeout = 5min
archive_mode = on
max_wal_senders = 3 --这个参数需要大于0
wal_keep_segments = 16
pg_basebackup -Ft -Pv -Xf -z -Z5 -p 5866 -D /data/pg10/backups/
成功示例:
3、准备测试数据,设置还原点,模拟误操作
CREATE TABLE test_restore(
id SERIAL PRIMARY KEY,
ival INT NOT NULL DEFAULT 0,
description TEXT,
created_time TIMESTAMPTZ NOT NULL DEFAULT now()
);
INSERT INTO test_restore (ival) VALUES (1);
INSERT 0 1
INSERT INTO test_restore (ival) VALUES (2);
INSERT 0 1
INSERT INTO test_restore (ival) VALUES (3);
INSERT 0 1
INSERT INTO test_restore (ival) VALUES (4);
INSERT 0 1

注意:有一点需要注意,由于WAL文件是写满16MB才会进行归档,测试阶段可能写入会非常少,可以在执行完基础备份之后,手动进行一次WAL切换。

PostgreSQL手动切换WAL日志的命令:
在PG10之前:
select pg_switch_xlog();
在PG10之后:
select pg_switch_wal();
或者通过设置archive_timeout参数,在达到timeout阈值时强行切换到新的WAL段。
接下来,创建一个还原点,如下所示:
select pg_create_restore_point(‘domac-1014’);

pg_create_restore_point

0/1E0001A8
(1 row)

模拟误操作:
delete from test_restore;
DELETE 4
4、进行恢复—基于还原点的恢复
4.1停止数据库
pg_ctl stop
移除旧的数据库目录
Rm –rf data/ 或者 mv data data.bak
4.2创建新的data目录并限制权限
mkdir db && chmod 0700 db
4.3 恢复基础备份
tar -xvf /data/pg10/backups/base.tar.gz -C $PGDATA
4.4 复制sample文件并改名
cp $PGHOME/share/recovery.conf.sample /pgdata/10/data/recovery.conf
4.5 修改recovery.conf文件中参数
restore_command 修改为

archive_directory = ‘/data/pg10/archive_wals/’
recovery_target_name = 'domac-1014’

4.6 启动服务
[highgo@localhost data]$ pg_ctl start
等待服务器进程启动 …2020-04-28 10:32:21.363 CST [4782] 警告: 01000: gdb version should large than 7.10
2020-04-28 10:32:21.363 CST [4782] 警告: 01000: coredump function is off
2020-04-28 10:32:21.376 CST [4782] 日志: 00000: listening on IPv6 address “::1”, port 5866
2020-04-28 10:32:21.376 CST [4782] 日志: 00000: listening on IPv4 address “127.0.0.1”, port 5866
2020-04-28 10:32:21.385 CST [4782] 日志: 00000: listening on Unix socket “/tmp/.s.PGSQL.5866”
2020-04-28 10:32:21.407 CST [4782] 日志: 00000: This is a trial edition, validate until 2021-04-26 16:45:47, database will not be able to start up after that time,please apply an official license by that time.
2020-04-28 10:32:21.479 CST [4787] 日志: 00000: 数据库系统中断;上一次的启动时间是在2020-04-28 10:21:49 CST
2020-04-28 10:32:21.635 CST [4787] 日志: 00000: 开始执行到基于时间点恢复的时间点"domac-1014"
2020-04-28 10:32:21.680 CST [4787] 日志: 00000: 从归档中恢复日志文件 “00000004.history”
2020-04-28 10:32:21.793 CST [4787] 日志: 00000: 从归档中恢复日志文件 “000000040000000000000006”
2020-04-28 10:32:21.865 CST [4787] 日志: 00000: redo 在 0/6000028 开始
2020-04-28 10:32:21.866 CST [4787] 日志: 00000: 在0/6000130上已到达一致性恢复状态
2020-04-28 10:32:21.866 CST [4782] 日志: 00000: 数据库系统准备接受只读请求的连接
完成
服务器进程已经启动
2020-04-28 10:32:21.991 CST [4787] 日志: 00000: 从归档中恢复日志文件 “000000040000000000000007”
[highgo@localhost data]$ 2020-04-28 10:32:22.154 CST [4787] 日志: 00000: 从归档中恢复日志文件 “000000040000000000000008”
2020-04-28 10:32:22.180 CST [4787] 日志: 00000: 恢复停止在恢复点 “domac-1014”, 时间 2020-04-28 10:23:39.649145+08
2020-04-28 10:32:22.180 CST [4787] 日志: 00000: 恢复操作已暂停
2020-04-28 10:32:22.180 CST [4787] 提示: Execute pg_wal_replay_resume() to continue.

查看恢复情况
在这里插入图片描述
5、进行恢复—基于时间点的恢复
在4的基础上,已经有了基础备份,我们不需要再来一次基础备份,因为PG有一个时间线的概念。所以这里只要修改recovery.conf文件就可以了。
Vim recovery.conf
recovery_target_time=’ 2020-04-28 10:23:49.785326+08’
recovery_target_timeline=‘latest’

停止服务
[highgo@localhost data]$ pg_ctl stop
等待服务器进程关闭 …2020-04-28 11:24:50.321 CST [5568] 日志: 00000: 接收到快速 (fast) 停止请求
2020-04-28 11:24:50.344 CST [5568] 日志: 00000: 中断任何激活事务
2020-04-28 11:24:50.346 CST [5634] 致命错误: 57P01: 由于管理员命令中断联接
2020-04-28 11:24:50.347 CST [5577] 日志: 00000: 正在关闭
2020-04-28 11:24:50.356 CST [5568] 日志: 00000: 数据库系统已关闭
完成
服务器进程已经关闭

启动服务:
[highgo@localhost data]$ pg_ctl start
等待服务器进程启动 …2020-04-28 11:24:51.853 CST [5750] 警告: 01000: gdb version should large than 7.10
2020-04-28 11:24:51.853 CST [5750] 警告: 01000: coredump function is off
2020-04-28 11:24:51.872 CST [5750] 日志: 00000: listening on IPv6 address “::1”, port 5866
2020-04-28 11:24:51.872 CST [5750] 日志: 00000: listening on IPv4 address “127.0.0.1”, port 5866
2020-04-28 11:24:51.873 CST [5750] 日志: 00000: listening on Unix socket “/tmp/.s.PGSQL.5866”
2020-04-28 11:24:51.886 CST [5750] 日志: 00000: This is a trial edition, validate until 2021-04-26 16:45:47, database will not be able to start up after that time,please apply an official license by that time.
2020-04-28 11:24:51.918 CST [5755] 日志: 00000: 在2020-04-28 11:24:50 CST,数据库在恢复中关闭
2020-04-28 11:24:51.918 CST [5755] 日志: 00000: 开始执行到2020-04-28 10:23:49.785326+08的基于时间点恢复
2020-04-28 11:24:51.921 CST [5755] 日志: 00000: 从归档中恢复日志文件 “00000004.history”
2020-04-28 11:24:52.010 CST [5755] 日志: 00000: 从归档中恢复日志文件 “000000040000000000000006”
2020-04-28 11:24:52.112 CST [5755] 日志: 00000: redo 在 0/6000028 开始
2020-04-28 11:24:52.191 CST [5755] 日志: 00000: 从归档中恢复日志文件 “000000040000000000000007”
2020-04-28 11:24:52.378 CST [5755] 日志: 00000: 从归档中恢复日志文件 “000000040000000000000008”
2020-04-28 11:24:52.393 CST [5755] 日志: 00000: 在0/8000150上已到达一致性恢复状态
2020-04-28 11:24:52.393 CST [5755] 日志: 00000: 恢复停止在事物 582 提交之前, 时间 2020-04-28 10:24:07.839906+08
2020-04-28 11:24:52.393 CST [5755] 日志: 00000: 恢复操作已暂停
2020-04-28 11:24:52.393 CST [5755] 提示: Execute pg_wal_replay_resume() to continue.
2020-04-28 11:24:52.393 CST [5750] 日志: 00000: 数据库系统准备接受只读请求的连接
完成
服务器进程已经启动

查看恢复情况:
highgo=# select * from test_restore
;
id | ival | description | created_time
----±-----±------------±------------------------------
1 | 1 | | 2020-04-28 10:22:23.179717+08
2 | 2 | | 2020-04-28 10:22:25.785326+08
3 | 3 | | 2020-04-28 10:22:28.159851+08
4 | 4 | | 2020-04-28 10:22:34.26427+08
5 | 5 | | 2020-04-28 10:23:48.012581+08
(5 行记录)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
PostgreSQL是一个开源的关系型数据库管理系统,它提供了基于时间恢复(Point-in-Time Recovery,简称PITR)的功能。 基于时间恢复是指在数据库发生故障或数据丢失的情况下,能够恢复到一个指定的时间之前的数据库状态。这种恢复方法特别适用于意外删除数据、误操作或数据库崩溃等情况。 PostgreSQL实现基于时间恢复的方式是通过使用事务日志(transaction logs)来记录数据库变更。事务日志包含了数据库的每一个更改操作,包括插入、更新和删除等操作。 当需要进行恢复操作时,首先需要使用pg_start_backup()函数创建一个基于时间恢复的起始,然后将数据库中的事务日志归档。通过这个归档的事务日志,可以将数据库恢复到指定时间之前的状态。 具体的恢复操作包括以下步骤: 1. 关闭数据库并创建恢复配置文件,指定恢复的目标时间。 2. 恢复配置文件中指定的时间的事务日志会被用来还原数据库。 3. 将数据库恢复为指定时间之前的状态,包括删除恢复之后的事务日志。 4. 打开数据库,使其可以重新对外提供服务。 值得注意的是,基于时间恢复功能需要提前进行规划和配置。首先需要定期备份数据库并保留足够长的时间,以便在需要时可以进行恢复。其次,需要开启事务日志归档功能,确保数据库的事务日志可以被正确地保留和使用。 总结来说,PostgreSQL提供了基于时间恢复的功能,它通过记录数据库的事务日志来实现。使用这个功能可以在数据库故障或数据丢失的情况下,恢复到指定的时间之前的数据库状态。但是使用前需要进行规划和配置,包括定期备份数据库和开启事务日志归档功能等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值