Skip to content

Latest commit

 

History

History
177 lines (67 loc) · 6.69 KB

File metadata and controls

177 lines (67 loc) · 6.69 KB

PostgreSQL 全库一致性逻辑备份,大表逻辑备份问题以及推荐解决方案 - 锁等待隐患,膨胀隐患

作者

digoal

日期

2019-08-04

标签

PostgreSQL , 锁等待隐患 , 膨胀隐患 , zfs , 全量 , 增量 , wal , 归档


背景

1、pg_dump开始备份数据之前需要依次进行锁表的操作, 锁级别为IN ACCESS SHARE MODE. 这个锁与AccessExclusiveLock冲突.

逻辑见代码:

src/bin/pg_dump/pg_dump.c

2、逻辑备份使用repeatable read隔离级别,备份开始时创建快照。

3、即使单表备份(非库级一致性备份),备份开始时也有快照信息。

postgres=# select * from pg_stat_activity where pid=41488;
-[ RECORD 1 ]----+--------------------------------------
datid            | 13591
datname          | postgres
pid              | 41488
usesysid         | 10
usename          | postgres
application_name | psql
client_addr      | 
client_hostname  | 
client_port      | -1
backend_start    | 2019-08-04 11:20:26.296405+08
xact_start       | 2019-08-04 11:26:07.185154+08
query_start      | 2019-08-04 11:26:13.630502+08
state_change     | 2019-08-04 11:26:19.021619+08
wait_event_type  | Client
wait_event       | ClientRead
state            | idle in transaction
backend_xid      | 
backend_xmin     | 123567280 快照信息
query            | copy pgbench_accounts to '/dev/null';
backend_type     | client backend

问题在哪?

问题

1、锁冲突隐患

备份期间,如果有会话要drop table,truncate table等操作(常见于分析业务),会被堵塞。(因为释放共享锁的操作在备份结束时发生)

备份开始前,如果有长时间持有DDL或其他排他锁的会话存在,备份会卡在加锁的步骤中。

2、长时间持有快照,数据库最老的快照之后所产生的垃圾都无法回收。如果备份期间产生大量的更新、删除操作吗,会有膨胀隐患。

《解读用户最常问的PostgreSQL垃圾回收、膨胀、多版本管理、存储引擎等疑惑 - 经典》

《膨胀点解释 - 全局catalog,库级catalog,普通表,wal文件 - 哪些垃圾(dead tuple), wal文件不能被回收reuse - 什么情况下可能膨胀》

大库推荐备份方式

1、standby + 文件系统快照备份 + 归档

2、全量文件备份 + wal归档

《PostgreSQL 最佳实践 - 块级增量备份(ZFS篇)验证 - recovery test script for zfs snapshot clone + postgresql stream replication + archive》

《PostgreSQL 最佳实践 - 块级增量备份(ZFS篇)双机HA与块级备份部署》

《PostgreSQL 最佳实践 - 块级增量备份(ZFS篇)单个数据库采用多个zfs卷(如表空间)时如何一致性备份》

《PostgreSQL 最佳实践 - 块级增量备份(ZFS篇)备份集有效性自动校验》

《PostgreSQL 最佳实践 - 块级增量备份(ZFS篇)方案与实战》

《zfs 快照增量恢复 vs PostgreSQL xlog增量恢复 速度》

《zfs 快照增量大小 vs PostgreSQL产生的XLOG大小》

《zfs 快照发送与接收》

参考

《PostgreSQL 逻辑备份与业务DDL的锁冲突案例 - PostgreSQL logical backup attention on lock and long time dump》

《PostgreSQL 两阶段(非库级一致性)逻辑备份 - PostgreSQL non-consistent backup script》

《PostgreSQL 逻辑备份一致性讲解 - Why pg_dump backup a database in consistent status》

您的愿望将传达给PG kernel hacker、数据库厂商等, 帮助提高数据库产品质量和功能, 说不定下一个PG版本就有您提出的功能点. 针对非常好的提议,奖励限量版PG文化衫、纪念品、贴纸、PG热门书籍等,奖品丰富,快来许愿。开不开森.

digoal's wechat