PostgreSQL Greenplum crash 后临时表引发的BUG - 暨年龄监控的重要性

本文涉及的产品
云原生数据库 PolarDB MySQL 版,Serverless 5000PCU 100GB
云数据库 RDS PostgreSQL,高可用版 2核4GB 50GB
云数据库 RDS SQL Server,独享型 2核4GB
简介: PostgreSQL 和 Greenplum都支持临时表。在使用临时表时,如果数据库crash,临时表不会自动清除,这样可能会埋下隐患,隐患爆发时是非常危险的。问题在哪呢?因为vacuum freeze不处理其他会话创建的临时表,仅仅处理当前会话创建的临时表。也就是说,没有被清理的临时表,可能导致.

PostgreSQL 和 Greenplum 都支持临时表。
在使用临时表时,如果数据库crash,临时表不会被自动清除,这样可能会埋下隐患,隐患爆发时是非常危险的。
问题在哪呢?
因为vacuum freeze不处理其他会话创建的临时表,仅仅处理当前会话创建的临时表。
也就是说,没有被清理的临时表,可能导致数据库年龄无法下降。
但是PostgreSQL从8.4的版本开始autovacuum进程就有了自动清理未正常删除的TEMP表的功能。
并且PostgreSQL从8.4的版本开始如果将来还会继续在同一个temp schema中创建临时表的话,同样也会自动清理以前的未清除的临时表。
代码:

http://git.postgresql.org/gitweb/?p=postgresql.git;a=commit;h=5b965bf08bfb4aa8928bafaed20e42b89de02a5c


                /*
                 * Check if it is a temp table (presumably, of some other backend's).
                 * We cannot safely process other backends' temp tables.
                 */
                if (classForm->relpersistence == RELPERSISTENCE_TEMP)
                {
                        int                     backendID;

                        backendID = GetTempNamespaceBackendId(classForm->relnamespace);

                        /* We just ignore it if the owning backend is still active */
                        if (backendID == MyBackendId || BackendIdGetProc(backendID) == NULL)
                        {
                                /*
                                 * We found an orphan temp table (which was probably left
                                 * behind by a crashed backend).  If it's so old as to need
                                 * vacuum for wraparound, forcibly drop it.  Otherwise just
                                 * log a complaint.
                                 */
                                if (wraparound)
                                {
                                        ObjectAddress object;

                                        ereport(LOG,
                                                        (errmsg("autovacuum: dropping orphan temp table \"%s\".\"%s\" in database \"%s\"",
                                                                 get_namespace_name(classForm->relnamespace),
                                                                        NameStr(classForm->relname),
                                                                        get_database_name(MyDatabaseId))));
                                        object.classId = RelationRelationId;
                                        object.objectId = relid;
                                        object.objectSubId = 0;
                                        performDeletion(&object, DROP_CASCADE, PERFORM_DELETION_INTERNAL);
                                }
                                else
                                {
                                        ereport(LOG,
                                                        (errmsg("autovacuum: found orphan temp table \"%s\".\"%s\" in database \"%s\"",
                                                                 get_namespace_name(classForm->relnamespace),
                                                                        NameStr(classForm->relname),
                                                                        get_database_name(MyDatabaseId))));
                                }
                        }
                }

而greenplum现在还使用的是8.3的版本,这个BUG还存在:
例子:
会话A:

postgres=# create temp table tmp1(id int);
CREATE TABLE

不要断开会话

模拟数据库crash(-m immediate或kill -9某非数据库postmaster进程)

pg_ctl stop -m immediate
waiting for server to shut down.... done
server stopped

重启数据库

pg_ctl start

重启后,临时表并没有自动被清除。

postgres=# select nspname,relname,age(relfrozenxid) from pg_class a, pg_namespace b where a.relnamespace=b.oid and a.relname='tmp1';
  nspname  | relname | age 
-----------+---------+-----
 pg_temp_2 | tmp1    |   1
(1 row)

模拟几个事务:

postgres=# select txid_current();
 txid_current 
--------------
         1798
(1 row)

postgres=# select txid_current();
 txid_current 
--------------
         1799
(1 row)

postgres=# select txid_current();
 txid_current 
--------------
         1800
(1 row)

postgres=# select txid_current();
 txid_current 
--------------
         1801
(1 row)

这个临时表会导致数据库的年龄无法降低

postgres=# vacuum freeze;
VACUUM
postgres=# select nspname,relname,age(relfrozenxid) from pg_class a, pg_namespace b where a.relnamespace=b.oid and a.relname='tmp1';
  nspname  | relname | age 
-----------+---------+-----
 pg_temp_2 | tmp1    |   6
(1 row)
postgres=# select datname,age(datfrozenxid) from pg_database where datname='postgres';
 datname  | age 
----------+-----
 postgres |   6
(1 row)

如果不处理的话,久而久之,数据库可能会到达最大年龄,需要停库维护。

在修复这个BUG前的处理方法

drop table pg_temp_2.tmp1;

对于PostgreSQL 8.4以及以上的版本, 不需要太担心以上问题。

对于现在的Greenplum,可能存在的问题更复杂,比如只是某些SEGMENT上没有清理,某些清理了,则只能使用UTIL模式连接到GP的每个节点(包括master)取DROP TABLE。

但是注意不要删除当前其他会话正在使用的TEMP TABLE.

PGOPTIONS="-c gp_session_role=utility" psql -h xx -p xx -U xx -d xx

postgres=# select b.nspname,relname,age(relfrozenxid) from pg_class a ,pg_namespace b where a.relnamespace=b.oid and b.nspname ~ 'temp' and relkind='r';
  nspname   | relname | age 
------------+---------+-----
 pg_temp_10 | t       | 388
 pg_temp_7  | t       | 350
 pg_temp_9  | t       | 508
(3 rows)

drop table xxx.xx;

这个隐患比长事务,2PC事务更隐蔽 , 排查是需要注意。

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
相关文章
|
3月前
|
SQL Oracle 关系型数据库
实时计算 Flink版操作报错之往GREENPLUM 6 写数据,用postgresql-42.2.9.jar 报 ON CONFLICT (uuid) DO UPDATE SET 语法有问题。怎么解决
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
|
1月前
|
SQL 监控 关系型数据库
实时计算 Flink版操作报错合集之在设置监控PostgreSQL数据库时,将wal_level设置为logical,出现一些表更新和删除操作报错,怎么办
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
|
2月前
|
SQL 关系型数据库 PostgreSQL
PostgreSQL和greenplum的copy命令可以添加字段吗?
【6月更文挑战第5天】PostgreSQL和greenplum的copy命令可以添加字段吗?
25 3
|
2月前
|
监控 关系型数据库 数据库
PostgreSQL和greenplum的copy命令如何使用?
【6月更文挑战第5天】PostgreSQL和greenplum的copy命令如何使用?
42 2
|
3月前
|
监控 关系型数据库 Java
SpringBoot【集成 01】Druid+Dynamic+Greenplum(实际上用的是PostgreSQL的驱动)及 dbType not support 问题处理(附hikari相关配置)
SpringBoot【集成 01】Druid+Dynamic+Greenplum(实际上用的是PostgreSQL的驱动)及 dbType not support 问题处理(附hikari相关配置)
217 0
|
11月前
|
关系型数据库 分布式数据库 数据库
沉浸式学习PostgreSQL|PolarDB 8: 电商|短视频|新闻|内容推荐业务(根据用户行为推荐相似内容)、监控预测报警系统(基于相似指标预判告警)、音视图文多媒体相似搜索、人脸|指纹识别|比对 - 向量搜索应用
1、在电商业务中, 用户浏览商品的行为会构成一组用户在某个时间段的特征, 这个特征可以用向量来表达(多维浮点数组), 同时商品、店铺也可以用向量来表达它的特征. 那么为了提升用户的浏览体验(快速找到用户想要购买的商品), 可以根据用户向量在商品和店铺向量中进行相似度匹配搜索. 按相似度来推荐商品和店铺给用户. 2、在短视频业务中, 用户浏览视频的行为, 构成了这个用户在某个时间段的兴趣特征, 这个特征可以用向量来表达(多维浮点数组), 同时短视频也可以用向量来表达它的特征. 那么为了提升用户的观感体验(推荐他想看的视频), 可以在短视频向量中进行与用户特征向量的相似度搜索.
285 0
|
算法 关系型数据库 PostgreSQL
PostgreSQL/GreenPlum Merge Inner Join解密
PostgreSQL/GreenPlum Merge Inner Join解密
68 0
PostgreSQL/GreenPlum Merge Inner Join解密
|
监控 Cloud Native 关系型数据库
《阿里云认证的解析与实战-数据仓库ACP认证》——云原生数据仓库AnalyticDB PostgreSQL版解析与实践(下)——二、监控报警使用、监控巡检
《阿里云认证的解析与实战-数据仓库ACP认证》——云原生数据仓库AnalyticDB PostgreSQL版解析与实践(下)——二、监控报警使用、监控巡检
|
监控 Cloud Native 关系型数据库
《阿里云认证的解析与实战-数据仓库ACP认证》——云原生数据仓库AnalyticDB PostgreSQL版功能演示(下)——二、功能演示2:增加监控报警规则
《阿里云认证的解析与实战-数据仓库ACP认证》——云原生数据仓库AnalyticDB PostgreSQL版功能演示(下)——二、功能演示2:增加监控报警规则
QGS
|
监控 关系型数据库 Linux
zabbix5.0—agent2监控PostgreSQL-11.4(linux)
记zabbix5.0—agent2监控PostgreSQL-11.4(linux)
QGS
630 0
zabbix5.0—agent2监控PostgreSQL-11.4(linux)

相关产品

  • 云原生数据库 PolarDB
  • 云数据库 RDS PostgreSQL 版