PolarDB开源数据库进阶课8 任意时间点恢复(PITR)

本文涉及的产品
云原生数据库 PolarDB MySQL 版,通用型 2核8GB 50GB
云原生数据库 PolarDB PostgreSQL 版,标准版 2核4GB 50GB
简介: 本文介绍了如何在PolarDB RAC一写多读集群中进行时间点恢复(PITR)。实验环境依赖于Docker容器中的loop设备模拟共享存储。首先,确保已开启实时归档并完成全量备份。接着,在主节点生成数据并创建恢复点。然后,通过修改配置文件和添加恢复标记文件,使用备份和归档日志将数据库恢复到指定的时间点。最后,验证数据是否已成功恢复,并关闭恢复库。参考了多个相关文档和系列文章,详细步骤和配置请参阅提供的链接。

背景

穷鬼玩PolarDB RAC一写多读集群系列已经写了几篇:

本篇文章介绍一下如何进行时间点恢复(PITR)? 实验环境依赖 《在Docker容器中用loop设备模拟共享存储》 , 如果没有环境, 请自行参考以上文章搭建环境.

还需要参考如下文档:

DEMO

b站视频链接

Youtube视频链接

在实时归档机pb4容器演示PITR.

1、首先, 假设你已经按下文开启了实时归档. 确保未来的全量备份有足够的WAL可以用于时间点恢复.

2、其次, 在开启实时归档后, 假设你已经按下文做了一次全量备份.

得到:

  • 本地数据目录: /data/backup/primary
  • 共享数据目录: /data/backup/shared_data

PITR只能恢复到全量备份结束之后的位置, 详见: 《PostgreSQL 增量备份集的有效恢复位点》

3、在pb1 primary节点生成一些数据.

postgres=# create table tbl_digoal (id int, info text, ts timestamp);  
CREATE TABLE  
postgres=# insert into tbl_digoal select generate_series(1,1000), md5(random()::text), clock_timestamp();  
INSERT 0 1000  
postgres=# select * from tbl_digoal limit 5;  
 id |               info               |             ts               
----+----------------------------------+----------------------------  
  1 | 45085479f931ea4bb0c39ec73522cdb4 | 2024-12-19 16:27:37.748317  
  2 | afc44037b7fac9feaa8d3567f331d0db | 2024-12-19 16:27:37.750813  
  3 | 37bcea4e172f13590c5bce35fc965880 | 2024-12-19 16:27:37.750821  
  4 | 0a09b7c73a8994d5023b796cb7aa7e13 | 2024-12-19 16:27:37.750824  
  5 | 37b98e2e52ddd1c6287ceb8624d7bf0a | 2024-12-19 16:27:37.750826  
(5 rows)  
  
postgres=# select sum(hashtext(t::text)) from tbl_digoal t;  
     sum        
--------------  
 -71405674348  
(1 row)

4、创建一个恢复点. 记住这个名字, 后面用来恢复.

postgres=# select now();  
              now                
-------------------------------  
 2024-12-19 16:28:27.517757+08  
(1 row)  
  
postgres=# select pg_create_restore_point('2024-12-19 16:28:27.517757+08');  
 pg_create_restore_point   
-------------------------  
 2/8003E6C0  
(1 row)

如果创建了多个同名的restore_point, 恢复时将恢复到哪个point? 答案是恢复过程中replay wal时遇到的第一个point.

5、在pb1 primary节点修改以上生成的数据.

postgres=# delete from tbl_digoal where id=10;  
DELETE 1  
postgres=# update tbl_digoal set info='new' where id=1;  
UPDATE 1  
postgres=# select sum(hashtext(t::text)) from tbl_digoal t;  
     sum        
--------------  
 -70843053399  
(1 row)

6、使用备份和归档日志, 将PolarDB恢复到数据被修改之前.

先确保wal日志都已经被实时归档. pg_current_wal_lsnflush_lsn 应该相等.

postgres=# select pg_current_wal_lsn(),* from pg_stat_replication where application_name='pg_receivewal';  
-[ RECORD 1 ]------+------------------------------  
pg_current_wal_lsn | 2/8003E9A0  
pid                | 5255  
usesysid           | 10  
usename            | postgres  
application_name   | pg_receivewal  
client_addr        | 172.17.0.5  
client_hostname    |   
client_port        | 58302  
backend_start      | 2024-12-19 16:32:26.754692+08  
backend_xmin       |   
state              | streaming  
sent_lsn           | 2/8003E9A0  
write_lsn          | 2/8003E9A0  
flush_lsn          | 2/8003E9A0  
replay_lsn         |   
write_lag          | 00:00:00.002957  
flush_lag          | 00:00:00.002957  
replay_lag         | 00:00:00.002957  
sync_priority      | 0  
sync_state         | async  
reply_time         | 2024-12-19 16:32:26.762024+08

把以下备份拷贝到临时恢复目录中, 当然你也可以直接在备份上进行恢复, 只是这样恢复时就把备份文件破坏了, 只能继续恢复, 不能回到已恢复之前的状态. (这也是为什么我非常推崇zfs, 因为zfs 可以基于快照进行备份, 恢复时挑选一个合适的快照进行克隆(瞬间完成), 记录克隆无论怎么操作都不会破坏原有的快照. zfs好处不止于此, 想详细了解可以参考文末文章.)

  • 本地数据目录: /data/backup/primary
  • 共享数据目录: /data/backup/shared_data
mkdir /data/recovery  
cp -r /data/backup/primary /data/recovery/  
cp -r /data/backup/shared_data /data/recovery/

修改postgresql.conf配置文件

cd /data/recovery/primary    
  
vi postgresql.conf    
    
# 修改和注释如下
# 使用本地盘模拟共享存储的, 使用如下配置. 未来如果你想用zfs来搭建standby, 可以参考这份配置   
polar_disk_name='home'      
polar_datadir='file-dio:///data/recovery/shared_data'      
polar_vfs.localfs_mode=true    
# polar_storage_cluster_name='disk'     
  
# 增加如下, 恢复目标是前面创建的恢复点, 拷贝wal的命令
# 也可以恢复到指定时间、wal lsn位置, 详情可参考文末文章. 
restore_command = 'cp /data/polardb_wal_archive/%f %p || cp /data/polardb_wal_archive/%f.partial %p'  
recovery_target_timeline = latest   
recovery_target_name = '2024-12-19 16:28:27.517757+08'  
recovery_target_action = 'pause'   
  
# 其他配置保持不变即可    
huge_pages=off   
port=5432    
polar_hostid=1    
polar_enable_shared_storage_mode=on    
shared_preload_libraries='$libdir/polar_vfs,$libdir/polar_worker'    
logging_collector=on    
log_line_prefix='%p\t%r\t%u\t%m\t'    
log_directory='pg_log'    
listen_addresses='0.0.0.0'    
max_connections=200
# 下面几个参数解决replica不能promote的问题, 因为RO依赖logindex.
polar_logindex_mem_size=64MB
polar_xlog_queue_buffers=64MB
polar_xlog_page_buffers=64MB
# 使用pfs时可以关掉 full page write 和 polar_has_partial_write , 否则请打开这两 
full_page_writes = off
polar_has_partial_write = off
polar_resource_manager.enable_resource_manager=off
# 纯粹的PolarDB 单机版(不使用pfs接口), 不需要剥离shared dir,
# 参考: 202501/20250121_01.md

删除standby标记文件, 添加recovery标记文件

rm /data/recovery/primary/standby.signal   
rm /data/recovery/shared_data/standby.signal   
  
touch /data/recovery/primary/recovery.signal  
# 理论上signal标记文件只需要放在本地数据目录中. shared data目录不需要signal文件, 删掉即可.

启动数据库, 自动开始恢复, 达到到目标位置会暂停恢复, 数据库保持恢复模式(只读状态).

pg_ctl start -D /data/recovery/primary

查看数据库日志, 可以看到已经恢复到了目标recovery_target_name = '2024-12-19 16:28:27.517757+08'

cd /data/recovery/primary/pg_log  
  
less postgresql-2024-12-19_165344_error.log  
  
4279                    2024-12-19 16:53:47.757 CST     LOG:  recovery stopping at restore point "2024-12-19 16:28:27.517757+08", time 2024-12-19 16:28:34.938012+08  
4279                    2024-12-19 16:53:47.757 CST     LOG:  pausing at the end of recovery  
4279                    2024-12-19 16:53:47.757 CST     HINT:  Execute pg_wal_replay_resume() to promote.

最后, 检查一下数据, 确实已经恢复到目标位置, 数据是更新之前的样子:

$ psql  
psql (PostgreSQL 15.10 (PolarDB 15.10.2.0 build d4f5477d debug) on aarch64-linux-gnu)  
Type "help" for help.  
  
postgres=# select count(*) from tbl_digoal ;  
 count   
-------  
  1000  
(1 row)  
  
postgres=# select sum(hashtext(t::text)) from tbl_digoal t;  
     sum        
--------------  
 -71405674348  
(1 row)

最后, 用完记得把恢复库关掉:

$ pg_ctl stop -m fast -D /data/recovery/primary

参考

《穷鬼玩PolarDB RAC一写多读集群系列 | 在Docker容器中用loop设备模拟共享存储》

《穷鬼玩PolarDB RAC一写多读集群系列 | 如何搭建PolarDB容灾(standby)节点》

《穷鬼玩PolarDB RAC一写多读集群系列 | 共享存储在线扩容》

《穷鬼玩PolarDB RAC一写多读集群系列 | 计算节点 Switchover》

《穷鬼玩PolarDB RAC一写多读集群系列 | 在线备份》

《穷鬼玩PolarDB RAC一写多读集群系列 | 在线归档》

《穷鬼玩PolarDB RAC一写多读集群系列 | 实时归档》

https://www.postgresql.org/docs/current/continuous-archiving.html

https://www.postgresql.org/docs/current/runtime-config-wal.html

《PostgreSQL PITR THREE recovery target MODE: name,xid,time USE CASE - 2》

《PostgreSQL PITR THREE recovery target MODE: name,xid,time USE CASE - 1》

《PostgreSQL recovery target introduce》

《PostgreSQL 时间点恢复(PITR)时查找wal record的顺序 - loop(pg_wal, restore_command, stream)》

《PostgreSQL 增量备份集的有效恢复位点》

《PostgreSQL如何支持可选择性表空间(Selectivity Tablespace)备份和时间点(PITR)恢复?》

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍如何基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
目录
相关文章
|
2月前
|
存储 关系型数据库 分布式数据库
喜报|阿里云PolarDB数据库(分布式版)荣获国内首台(套)产品奖项
阿里云PolarDB数据库管理软件(分布式版)荣获「2024年度国内首版次软件」称号,并跻身《2024年度浙江省首台(套)推广应用典型案例》。
|
3月前
|
关系型数据库 分布式数据库 数据库
再获殊荣,阿里云PolarDB数据库蝉联SIGMOD最佳论文奖
内存池化技术新突破,阿里云PolarDB蝉联SIGMOD最佳论文奖
|
4月前
|
关系型数据库 MySQL 数据库
MyEMS开源系统安装之数据库
本文详细讲解MyEMS的安装步骤,重点介绍数据库架构与脚本部署。MyEMS支持MySQL 8.0、MariaDB 10.5及SingleStore 7.0等数据库服务器。通过命令行或客户端工具执行SQL脚本完成安装,包括多个数据库(如myems_billing_db、myems_energy_db等)。此外,提供解决常见问题的方法,如“用户拒绝访问”、“COLLATE设置”和“MAX_ALLOWED_PACKET错误”。注意,不建议在生产环境中将数据库安装于Docker容器内。
122 1
|
4月前
|
Cloud Native 关系型数据库 分布式数据库
阿里云PolarDB与沃趣科技携手打造一体化数据库解决方案,助推国产数据库生态发展
阿里云瑶池数据库与沃趣科技将继续深化合作,共同推动国产数据库技术的持续创新与广泛应用,为行业生态的繁荣注入更强劲的技术动力。
阿里云PolarDB与沃趣科技携手打造一体化数据库解决方案,助推国产数据库生态发展
|
2月前
|
关系型数据库 分布式数据库 数据库
阿里云PolarDB数据库蝉联SIGMOD最佳论文奖
阿里云PolarDB凭借全球首创基于CXL Switch的分布式内存池技术,在SIGMOD 2025上荣获工业赛道“最佳论文奖”,连续两年蝉联该顶会最高奖项。其创新架构PolarCXLMem打破传统RDMA技术瓶颈,性能提升2.1倍,并已落地应用于内存池化场景,推动大模型推理与多模态存储发展,展现CXL Switch在高速互联中的巨大潜力。
阿里云PolarDB数据库蝉联SIGMOD最佳论文奖
|
3月前
|
Cloud Native 关系型数据库 分布式数据库
客户说|知乎基于阿里云PolarDB,实现最大数据库集群云原生升级
近日,知乎最大的风控业务数据库集群,基于阿里云瑶池数据库完成了云原生技术架构的升级。此次升级不仅显著提升了系统的高可用性和性能上限,还大幅降低了底层资源成本。
|
4月前
|
存储 Cloud Native 关系型数据库
PolarDB开源:云原生数据库的架构革命
本文围绕开源核心价值、社区运营实践和技术演进路线展开。首先解读存算分离架构的三大突破,包括基于RDMA的分布式存储、计算节点扩展及存储池扩容机制,并强调与MySQL的高兼容性。其次分享阿里巴巴开源治理模式,涵盖技术决策、版本发布和贡献者成长体系,同时展示企业应用案例。最后展望技术路线图,如3.0版本的多写多读架构、智能调优引擎等特性,以及开发者生态建设举措,推荐使用PolarDB-Operator实现高效部署。
264 3
|
4月前
|
SQL 关系型数据库 分布式数据库
PolarDB开源数据库入门教程
PolarDB是阿里云推出的云原生数据库,基于PostgreSQL、MySQL和Oracle引擎构建,具备高性能、高扩展性和高可用性。其开源版采用计算与存储分离架构,支持快速弹性扩展和100%兼容PostgreSQL/MySQL。本文介绍了PolarDB的安装方法(Docker部署或源码编译)、基本使用(连接数据库、创建表等)及高级特性(计算节点扩展、存储自动扩容、并行查询等)。同时提供了性能优化建议和监控维护方法,帮助用户在生产环境中高效使用PolarDB。
1603 21
|
5月前
|
关系型数据库 分布式数据库 数据库
一库多能:阿里云PolarDB三大引擎、四种输出形态,覆盖企业数据库全场景
PolarDB是阿里云自研的新一代云原生数据库,提供极致弹性、高性能和海量存储。它包含三个版本:PolarDB-M(兼容MySQL)、PolarDB-PG(兼容PostgreSQL及Oracle语法)和PolarDB-X(分布式数据库)。支持公有云、专有云、DBStack及轻量版等多种形态,满足不同场景需求。2021年,PolarDB-PG与PolarDB-X开源,内核与商业版一致,推动国产数据库生态发展,同时兼容主流国产操作系统与芯片,获得权威安全认证。

热门文章

最新文章

相关产品

  • 云原生数据库 PolarDB