postgresql vacuum row is too big

晚上11点左右,朋友电话我,说他们公司PG有点问题,登录上去看了PG(9.2.4)日志报错如下(配置文件中有开autovacuum):

2016-08-05 23:47:32.839 CST,,,41181,,57a4b514.a0dd,2,,2016-08-05 23:47:32 CST,,0,WARNING,01000,"database with OID 16384 must be vacuumed within 999409 transactions",,"To avoid a database shutdown, execute a database-wide VACUUM in that database.

You might also need to commit or roll back old prepared transactions.",,,,,,,""

如是进入到单用户执行如下操作:

pg_ctl -m f stop -D $PGDATA

postgres --single lockdb -D $PGDATA

backend> vacuum full;

操作到vacuum full报错如下:

WARNING:  database "lockdb" must be vacuumed within 999238 transactions

HINT:  To avoid a database shutdown, execute a database-wide VACUUM in that database.

You might also need to commit or roll back old prepared transactions.

ERROR:  row is too big: size 235728, maximum size 8160

STATEMENT:  vacuum full;

改用vacuum freeze报错如下:

backend> vacuum freeze;

\ERROR:  failed to re-find parent key in index "user_checkin_user_id_idx" for deletion target page 902154

STATEMENT:  vacuum freeze;

如是打算dump user_checkin表,后删除索引,报错如下:

pg_dump: Dumping the contents of table "user_checkin" failed: PQgetResult() failed.

pg_dump: Error message from server: ERROR:  invalid memory alloc request size 18446744073709551613

pg_dump: The command was: COPY public.user_checkin (id, user_id, active_date, last_login_date, update_date, update_flag, product_code, kernel_code, product_ver, product_ver_num, opt_update_num) TO stdout;

当时PG的数据库大概470G左右,其中索引user_checkin表索引就占了130G。如是和朋友商量后,删除索引和重建索引,时间太长,打算清空user_checkin表,清空user_checkin表后,PG数据大小100G左右,然后在执行上面的vacuum操作,PG数据大小为86G,重启PG后,一切正常。

时间: 2024-09-20 19:53:13

postgresql vacuum row is too big的相关文章

聊一聊双十一背后的技术 - 分词和搜索

双十一背后的技术系列文章 <聊一聊双十一背后的技术 - 物流, 动态路径规划> <聊一聊双十一背后的技术 - 分词和搜索> <聊一聊双十一背后的技术 - 强奸式秒杀技术实现> <聊一聊双十一背后的技术 - 毫秒分词算啥, 试试正则和相似度> 云栖聚能聊 - 聊一聊双十一背后的数据库技术 标签 PostgreSQL , 分词 , 全文索引 , rum , 搜索引擎 , 双十一 , tsvector , tsquery 背景 2016双十一刚过,大伙还在忙着收快

PostgreSQL 9.6 vacuum freeze大幅性能提升 代码浅析

PostgreSQL 9.6 vacuum freeze大幅性能提升 代码浅析 作者 digoal 日期 2016-10-02 标签 PostgreSQL , 9.6 , vacuum freeze , visibility map , skip frozen page 背景 PostgreSQL的tuple(即记录)头信息中有两个字段分别为XMIN,XMAX用于标记行产生与变更的事务号,以标示记录的版本号,事务的可见性等. 这个事务号是32BIT的长度,因此PG设计了一个事务存活的最长时间是约

PostgreSQL Daily Maintenance - vacuum

PostgreSQL数据库日常维护需要维护哪些东西, 和数据库中的业务类型有莫大的关系. PostgreSQL的并发控制简单来说是通过多tuple版本, tuple infomask信息, 事务提交状态以及事务snapshot来实现的. 当删除一条记录时, 并不是马上回收被删除的空间, 因为有可能其他事务还会用到它, 当更新一条记录是, 老的记录会保留, 然后插入新的记录. 例如 : digoal=# create table tbl(id int, info text); CREATE TAB

MySQL TOO BAD row&#039;s Range Lock Compare with PostgreSQL and Oracle

MySQL的InnoDB引擎,当UPDATE一个范围的数据时,会锁住比预期更多的ROW,而Oracle和PostgreSQL没有这种现象.来自<High Performance MySQL>一书.测试版本:MySQL 5.5.10PostgreSQL 9.0.2Oracle 10.2.0.4举例如下:1. MySQL (有索引的情况)Session One:mysql> create table tbl_user (id int,firstname varchar(32),lastnam

PostgreSQL 10.0 preview 多核并行增强 - 索引扫描、子查询、VACUUM、fdw/csp钩子

标签 PostgreSQL , 10.0 , 并行计算 , 索引扫描 , 子查询 , VACUUM , 外部表并行 背景 PostgreSQL 9.6推出的多核并行计算特性,支持全表扫描,hash join,聚合操作. 10.0 在此基础上,增加了更多的支持. 1. Parallel bitmap heap scan 2. Parallel Index Scans 3. Parallel Merge Join 4. parallelize queries containing subplans

PostgreSQL 10.0 preview 性能增强 - GIN索引vacuum锁降低

标签 PostgreSQL , 10.0 , GIN vacuum , 锁范围降低 背景 如果你发现你的CPU没怎么用,但是压力就是上不去,很大可能是锁等待造成的(perf可以观察),锁在数据库优化中是一个比较永恒的话题. 以往在vacuum GIN索引clean posting tree时,需要锁整个posting tree,10.0改进了这块的锁,现在只锁一个subtree. 在较大的GIN KEY被更新后,清除posting tree时,锁冲突更小了. Reduce page lockin

PostgreSQL Fine-Grained Table,Column,Row Level Audit

通过配置用户级或数据库级的参数可以实现用户以及数据库级别的审计, 但是这样的粒度可能还是太粗糙了. 如果需要更细致的审计, 例如针对某些表的操作审计, 某些用户对某些表的审计, 或者仅仅当某个列的值发生变化时才被审计(记录到LOG或表里面, 本文的例子是将审计信息输出到LOG, 使用raise). 这样的需求可以通过触发器来实现. 接下来以PostgreSQL 9.2为例进行讲解. # 基础的参数配置 log_destination = 'csvlog' logging_collector =

RLS(Row Level Security) 在 PostgreSQL 9.5 中的使用

PostgreSQL 9.5 更新增加了许多新的功能,比如增加新的JSONB函数,新的GROUPING函数等.RLS(Row Level Security)功能在此次更新中也得到相应的提升.RLS是一种表格行安全机制,利用为每一个表加上你需要使用数据库角色作为一个主要的安全机制. 以下是一个RLS示例: 创建表.修改表.创建策略:使用RLS CREATE TABLE ratings2 ( user_role_name NAME, rating_type_name TEXT, artist_nam

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

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