pg_dump一致性备份以及cache lookup failed错误的原因分析

本文涉及的产品
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
RDS MySQL DuckDB 分析主实例,基础系列 4核8GB
RDS AI 助手,专业版
简介:

背景

PostgreSQL逻辑备份,如何保证备份数据的一致性呢,例如备份的同时,数据被纂改或者有新增的数据,如何保证在全库视角,备份出来的数据是在备份开始时看到的一致数据。

一致性逻辑备份分析

可以追溯到1999年的代码,早期PostgreSQL通过serializable隔离级别来保证备份的一致性。
https://git.postgresql.org/gitweb/?p=postgresql.git;a=commit;h=bcb5aac81dec14d892fae18b446315367563be4c

Add keywords to implement Vadim's transaction isolation  
 and lock syntax as fully parsed tokens.  
Two keywords for isolation are non-reserved SQL92  
 (COMMITTED, SERIALIZABLE).  
All other new keywords are non-reserved Postgres (not SQL92)  
 (ACCESS, EXCLUSIVE, MODE, SHARE).  
Add syntax to allow CREATE [GLOBAL|LOCAL] TEMPORARY TABLE, throwing an  
 error if GLOBAL is specified.    

https://git.postgresql.org/gitweb/?p=postgresql.git;a=commit;h=df9e539ea2c434c73d724234e792536789fd97b8

+   /*  
+    * Start serializable transaction to dump consistent data  
+    */  
+   {  
+       PGresult   *res;  
+  
+       res = PQexec(g_conn, "begin");  
+       if (!res || PQresultStatus(res) != PGRES_COMMAND_OK)  
+       {  
+           fprintf(stderr, "BEGIN command failed.  Explanation from backend: '%s'.\n", PQerrorMessage(g_conn));  
+           exit_nicely(g_conn);  
+       }  
+       PQclear(res);  
+       res = PQexec(g_conn, "set transaction isolation level serializable");  
+       if (!res || PQresultStatus(res) != PGRES_COMMAND_OK)  
+       {  
+           fprintf(stderr, "SET TRANSACTION command failed.  Explanation from backend: '%s'.\n", PQerrorMessage(g_conn));  
+           exit_nicely(g_conn);  
+       }  
+       PQclear(res);  
+   }  
+  

9.1 开始,PostgreSQL改进并支持了SSI隔离级别,比SQL92标准更加苛刻。

同时支持transaction snapshot,一致性备份不再需要serializable,使用repeatable read即可。

所以pg_dump.c改成如下

https://git.postgresql.org/gitweb/?p=postgresql.git;a=blobdiff;f=src/bin/pg_dump/pg_dump.c;h=d3eb7662880b3dda57f052d7fbbd22392a8cb562;hp=e844b5b062440ecf7233576d396ca36dafc5e8b9;hb=dafaa3efb75ce1aae2e6dbefaf6f3a889dea0d21;hpb=c18f51da17d8cf01d62218e0404e18ba246bde54

    /*  
         * Start transaction-snapshot mode transaction to dump consistent data.  
         */  
        ExecuteSqlStatement(AH, "BEGIN");  
        if (AH->remoteVersion >= 90100)  
        {  
                /*  
                 * To support the combination of serializable_deferrable with the jobs  
                 * option we use REPEATABLE READ for the worker connections that are  
                 * passed a snapshot.  As long as the snapshot is acquired in a  
                 * SERIALIZABLE, READ ONLY, DEFERRABLE transaction, its use within a  
                 * REPEATABLE READ transaction provides the appropriate integrity  
                 * guarantees.  This is a kluge, but safe for back-patching.  
                 */  
                if (dopt->serializable_deferrable && AH->sync_snapshot_id == NULL)  
                        ExecuteSqlStatement(AH,  
                                                                "SET TRANSACTION ISOLATION LEVEL "  
                                                                "SERIALIZABLE, READ ONLY, DEFERRABLE");  
                else  
                        ExecuteSqlStatement(AH,  
                                                                "SET TRANSACTION ISOLATION LEVEL "  
                                                                "REPEATABLE READ, READ ONLY");  
        }  
        else if (AH->remoteVersion >= 70400)  
        {  
                /* note: comma was not accepted in SET TRANSACTION before 8.0 */  
                ExecuteSqlStatement(AH,  
                                                        "SET TRANSACTION ISOLATION LEVEL "  
                                                        "SERIALIZABLE READ ONLY");  
        }  
        else  
                ExecuteSqlStatement(AH,  
                                                        "SET TRANSACTION ISOLATION LEVEL SERIALIZABLE");  

逻辑备份cache lookup failed错误分析

除了考虑数据的一致性备份,还需要考虑结构的一致性。

某些获取数据结构的调用是snapshot now的,所以可能有很小的窗口期可能被执行DDL,从而导致relcache变化。

如果pg_dump发现relcache变化,则会爆出cache lookup failed的错误,导致备份失败。

  14  *  Note that pg_dump runs in a transaction-snapshot mode transaction,  
  15  *  so it sees a consistent snapshot of the database including system  
  16  *  catalogs. However, it relies in part on various specialized backend  
  17  *  functions like pg_get_indexdef(), and those things tend to run on  
  18  *  SnapshotNow time, ie they look at the currently committed state.  So  
  19  *  it is possible to get 'cache lookup failed' error if someone  
  20  *  performs DDL changes while a dump is happening. The window for this  
  21  *  sort of thing is from the acquisition of the transaction snapshot to  
  22  *  getSchemaData() (when pg_dump acquires AccessShareLock on every  
  23  *  table it intends to dump). It isn't very large, but it can happen.  

https://git.postgresql.org/gitweb/?p=postgresql.git;a=commit;h=dafaa3efb75ce1aae2e6dbefaf6f3a889dea0d21

所以应该避免在使用逻辑备份期间执行DDL。

如果系统无法避免,建议使用物理备份。

Count

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍如何基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
目录
相关文章
|
存储 安全 索引
vacuum freeze无法回收事务号问题分析
vacuum freeze报错问题分析
4906 0
|
关系型数据库 MySQL 数据库
MySQL的delete误操作的快速恢复方法
如果我们在数据库中不小心执行了类似“delete from t1”这样的不带where条件的语句,那么整张表的数据就全被删除了,如何在最短的时间恢复被删除的数据就显得十分关键。下面来演示如何通过binlog来快速恢复表数据。
16152 0
MySQL的delete误操作的快速恢复方法
|
关系型数据库 MySQL 数据库
基于Flink CDC 开发,支持Web-UI的实时KingBase 连接器,三大模式无缝切换,效率翻倍!
TIS 是一款基于Web-UI的开源大数据集成工具,通过与人大金仓Kingbase的深度整合,提供高效、灵活的实时数据集成方案。它支持增量数据监听和实时写入,兼容MySQL、PostgreSQL和Oracle模式,无需编写复杂脚本,操作简单直观,特别适合非专业开发人员使用。TIS率先实现了Kingbase CDC连接器的整合,成为业界首个开箱即用的Kingbase CDC数据同步解决方案,助力企业数字化转型。
2683 5
基于Flink CDC 开发,支持Web-UI的实时KingBase 连接器,三大模式无缝切换,效率翻倍!
|
9月前
|
存储 安全 Linux
Proxmox Backup Server 4.0 Beta - 开源企业级备份解决方案
Proxmox Backup Server 4.0 Beta - 开源企业级备份解决方案
503 0
Proxmox Backup Server 4.0 Beta - 开源企业级备份解决方案
|
12月前
|
SQL 运维 关系型数据库
MySQL Binlog 日志查看方法及查看内容解析
本文介绍了 MySQL 的 Binlog(二进制日志)功能及其使用方法。Binlog 记录了数据库的所有数据变更操作,如 INSERT、UPDATE 和 DELETE,对数据恢复、主从复制和审计至关重要。文章详细说明了如何开启 Binlog 功能、查看当前日志文件及内容,并解析了常见的事件类型,包括 Format_desc、Query、Table_map、Write_rows、Update_rows 和 Delete_rows 等,帮助用户掌握数据库变化历史,提升维护和排障能力。
|
SQL 关系型数据库 数据库
【一文搞懂PGSQL】4.逻辑备份和物理备份 pg_dump/ pg_basebackup
本文介绍了PostgreSQL数据库的备份与恢复方法,包括数据和归档日志的备份,以及使用`pg_dump`和`pg_basebackup`工具进行逻辑备份和物理备份的具体操作。通过示例展示了单库和单表的备份与恢复过程,并提供了错误处理方案。此外,还详细描述了如何利用物理备份工具进行数据损坏修复及特定时间点恢复(PITR)的操作步骤,以应对误操作导致的数据丢失问题。
|
负载均衡 关系型数据库 PostgreSQL
【一文搞懂PGSQL】6. PostgreSQL + pgpool-II 实现读写分离
本文介绍了如何使用 PostgreSQL 和 pgpool-II 实现读写分离。pgpool-II 支持连接池、负载均衡等功能,适用于多种模式。文中详细描述了安装、配置及启动过程,并提供了示例命令,帮助读者快速搭建并验证读写分离环境。通过配置 `pgpool.conf` 文件指定监听地址、端口及节点信息等参数,确保系统的高效运行与故障转移。
|
IDE Android开发 iOS开发
探索安卓与iOS系统的技术差异:开发者的视角
本文深入分析了安卓(Android)与苹果iOS两大移动操作系统在技术架构、开发环境、用户体验和市场策略方面的主要差异。通过对比这两种系统的不同特点,旨在为移动应用开发者提供有价值的见解,帮助他们在不同平台上做出更明智的开发决策。