oldest xmin is far in the past :: BUT xmin is not available in system - Mailing list pgsql-general

From bhargav kamineni
Subject oldest xmin is far in the past :: BUT xmin is not available in system
Date
Msg-id CAE=Y5eB0Szc_Fz5te6KaAQtay3XBvwSO=ruv5G0HYyHK_a3n6Q@mail.gmail.com
Whole thread Raw
Responses Re: oldest xmin is far in the past :: BUT xmin is not available in system  ("David G. Johnston" <david.g.johnston@gmail.com>)
List pgsql-general
Hi Team,

It seems vacuum is behaving somewhat weird on postgres database , observing below HINTS on the vacuum logs

WARNING:  oldest xmin is far in the past

HINT:  Close open transactions soon to avoid wraparound problems.

You might also need to commit or roll back old prepared transactions, or drop stale replication slots.


Below is the auto-vacuum status on the bloated tables:

=> SELECT schemaname, relname, n_live_tup, n_dead_tup, last_autovacuum

FROM pg_stat_all_tables

ORDER BY n_dead_tup

    / (n_live_tup

       * current_setting('autovacuum_vacuum_scale_factor')::float8

          + current_setting('autovacuum_vacuum_threshold')::float8)

     DESC

LIMIT 10;

 schemaname |       relname       | n_live_tup | n_dead_tup |        last_autovacuum

------------+---------------------+------------+------------+-------------------------------

 pg_catalog | pg_statistic        |        136 |      37563 | 2022-04-18 04:00:21.045089+00

 public     | test1               |  209405206 |  126752908 | 2022-04-18 03:59:43.013758+00

 public     | test2              |  513770985 |   49258312 | 2022-04-18 04:00:23.24043+00

 public     | test3             |   90853150 |    4090146 | 2022-04-18 04:00:25.868147+00

 pg_catalog | pg_shdepend         |        153 |         29 | 2022-04-08 12:16:02.816631+00

 pg_catalog | pg_index            |         73 |         18 |

 pg_toast   | pg_toast_2619       |         16 |         12 | 2022-03-13 23:01:54.334003+00

 pg_catalog | pg_class            |        425 |         19 | 2022-03-01 13:15:57.534378+00

 pg_catalog | pg_proc             |       2457 |         48 |

 pg_toast   | pg_toast_2618       |        252 |         10 |

 

i tried to vacuum the the first table pg_statistic , Below is the log

postgres=> VACUUM (VERBOSE) pg_statistic;

WARNING:  oldest xmin is far in the past

HINT:  Close open transactions soon to avoid wraparound problems.

You might also need to commit or roll back old prepared transactions, or drop stale replication slots.

INFO:  aggressively vacuuming "pg_catalog.pg_statistic"

INFO:  "pg_statistic": found 0 removable, 37699 nonremovable row versions in 6331 out of 6351 pages

DETAIL:  37563 dead row versions cannot be removed yet, oldest xmin: 648320155

There were 3340 unused item identifiers.

Skipped 0 pages due to buffer pins, 20 frozen pages.

0 pages are entirely empty.

CPU: user: 0.01 s, system: 0.00 s, elapsed: 0.01 s.

WARNING:  oldest xmin is far in the past

HINT:  Close open transactions soon to avoid wraparound problems.

You might also need to commit or roll back old prepared transactions, or drop stale replication slots.

INFO:  aggressively vacuuming "pg_toast.pg_toast_2619"

INFO:  "pg_toast_2619": found 0 removable, 16 nonremovable row versions in 3 out of 11 pages

DETAIL:  12 dead row versions cannot be removed yet, oldest xmin: 648320155

There were 11 unused item identifiers.

Skipped 0 pages due to buffer pins, 8 frozen pages.

0 pages are entirely empty.

CPU: user: 0.00 s, system: 0.00 s, elapsed: 0.00 s.

VACUUM

 

Table is getting vacuumed but not able to remove the dead tuples because of oldest xmin: 648320155 , but the mentioned xim is not associated with long running quries or stale replication slots or prepared transactions.

Long running:

postgres=> SELECT now()-query_start,pid, datname, usename, state, backend_xmin

FROM pg_stat_activity

WHERE backend_xmin IS NOT NULL

ORDER BY age(backend_xmin) DESC;

    ?column?     |  pid  |      datname      | usename | state  | backend_xmin

-----------------+-------+-------------------+---------+--------+--------------

 00:00:29.910155 |   539 | postgres |         | active |    832858371

 00:00:23.766305 |  1211 | postgres |         | active |    832858509

 00:00:00.756961 |  2151 | postgres |         | active |    832859484

 00:00:00.060784 | 30833 | postgres | root    | active |    832859508

 00:00:00.004473 | 29270 | postgres | root    | active |    832859508

 00:00:00.009809 | 29271 | postgres | root    | active |    832859508

 00:00:00.015169 | 27145 | postgres | root    | active |    832859508

 00:00:00        |  1450 | postgres | postgres | active |    832859508

 00:00:00.010672 |   544 | postgres | root    | active |    832859508

 00:00:00.034516 | 19940 | postgres | root    | active |    832859508

(10 rows)

 

stale replication slots:

 

postgres=> SELECT slot_name, slot_type, database, xmin

FROM pg_replication_slots

ORDER BY age(xmin) DESC;

 slot_name | slot_type | database | xmin

-----------+-----------+----------+------

(0 rows)

 

 

Prepared transaction's :

 

postgres=> SELECT gid, prepared, owner, database, transaction AS xmin

postgres-> FROM pg_prepared_xacts

postgres-> ORDER BY age(transaction) DESC;

 gid | prepared | owner | database | xmin

-----+----------+-------+----------+------

(0 rows)

 

 

Checked for long running queries on replica side , but haven't found any

postgres=> show hot_standby_feedback ;

 hot_standby_feedback

----------------------

 on

(1 row)


postgres=> SELECT pid, age(current_timestamp, xact_start),usename ,state,left(query,100)

FROM pg_stat_activity

WHERE state <> 'idle' and pid<>pg_backend_pid();

;

 pid | age | usename | state | left

-----+-----+---------+-------+------

(0 rows)


postgres=> select pg_is_in_recovery();

 pg_is_in_recovery

-------------------

 t

(1 row)



Regards,

BK

pgsql-general by date:

Previous
From: Ram Pratap Maurya
Date:
Subject: RE: Huge archive log generate in Postgresql-13
Next
From: "David G. Johnston"
Date:
Subject: Re: oldest xmin is far in the past :: BUT xmin is not available in system