作者
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篇)双机HA与块级备份部署》
《PostgreSQL 最佳实践 - 块级增量备份(ZFS篇)单个数据库采用多个zfs卷(如表空间)时如何一致性备份》
《PostgreSQL 最佳实践 - 块级增量备份(ZFS篇)备份集有效性自动校验》
《PostgreSQL 最佳实践 - 块级增量备份(ZFS篇)方案与实战》
《zfs 快照增量恢复 vs PostgreSQL xlog增量恢复 速度》
《zfs 快照增量大小 vs PostgreSQL产生的XLOG大小》
参考
《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》
PostgreSQL 许愿链接
您的愿望将传达给PG kernel hacker、数据库厂商等, 帮助提高数据库产品质量和功能, 说不定下一个PG版本就有您提出的功能点. 针对非常好的提议,奖励限量版PG文化衫、纪念品、贴纸、PG热门书籍等,奖品丰富,快来许愿。开不开森.