版本8.4.17
(是的,我知道它已经过时了,但这超出了我的控制范围。)
那里有180个pg_clog文件,其中很多来自八月份。
$ dir /var/lib/pgsql/data/pg_clog | grep 2017-08 | wc
59 472 4307
我使用这个脚本真空吸尘,因为数据库非常大,我希望看到进展。 (我已经删除了很多日志记录。)尽管如此,pg_clog文件仍然存在。
vacuumdb -ezd postgres
SQL="select schemaname||'.'||tablename \
from pg_tables \
where schemaname not in ('information_schema', 'pg_catalog') \
order by schemaname,tablename;"
psql -t $DB -c "$SQL" > $TABLES
for T in $(cat $TABLES); do
psql -q $DB -c "VACUUM FULL ${T};"
done
我做错了什么?
编辑:为@CraigRinger添加了信息
列datminmxid和relminmxid不存在。
postgres=# select datname, datfrozenxid, age(datfrozenxid)
from pg_database
order by age(datfrozenxid);
datname | datfrozenxid | age
-----------+--------------+-----------
template0 | 3603470462 | 24747443
template1 | 3603334165 | 24883740
postgres | 3576970250 | 51247655
TAPd | 3433741226 | 194476679
(4 rows)
TAPd=# select oid, relname, relfrozenxid, age(relfrozenxid)
from pg_class
where not relfrozenxid = xid '0'
order by age(relfrozenxid) desc;
oid | relname | relfrozenxid | age
-----------+-----------------------------------------------+--------------+-----------
2617 | pg_operator | 3433741226 | 194476689
2602 | pg_amop | 3433741226 | 194476689
2753 | pg_opfamily | 3445877061 | 182340854
1259 | pg_class | 3445877061 | 182340854
1136 | pg_pltemplate | 3445877061 | 182340854
1213 | pg_tablespace | 3445877061 | 182340854
3600 | pg_ts_dict | 3445877061 | 182340854
1262 | pg_database | 3445877061 | 182340854
3603 | pg_ts_config_map | 3445877061 | 182340854
11467 | sql_parts | 3445877061 | 182340854
3602 | pg_ts_config | 3445877061 | 182340854
11457 | sql_languages | 3445877061 | 182340854
1261 | pg_auth_members | 3445877061 | 182340854
11452 | sql_implementation_info | 3445877061 | 182340854
1417 | pg_foreign_server | 3445877061 | 182340854
2328 | pg_foreign_data_wrapper | 3445877061 | 182340854
3764 | pg_ts_template | 3445877061 | 182340854
2396 | pg_shdescription | 3445877061 | 182340854
2600 | pg_aggregate | 3445877061 | 182340854
3601 | pg_ts_parser | 3445877061 | 182340854
2613 | pg_largeobject | 3445877061 | 182340854
2612 | pg_language | 3445877061 | 182340854
11477 | sql_sizing_profiles | 3445877061 | 182340854
2603 | pg_amproc | 3445877061 | 182340854
[snip]
所以我必须清空pg_catalog架构。但是,尽管我在用户表上运行了VACUUM FULL,但仍有许多“用户”表具有旧的relfrozenxid年龄。
答案 0 :(得分:1)
您应该在所有数据库中以超级用户身份运行VACUUM FREEZE
。
然后,在下一个检查点之后,事情应该有所改善。
答案 1 :(得分:0)
解决方法是将@CraigRinger评论中的查询与@LaurenzAlbe建议的VACUUM FREEZE
合并。
获取具有旧relfrozenxid值的表的完整列表:
select cl.oid,
ta.schemaname,
cl.relname,
cl.relfrozenxid,
age(cl.relfrozenxid)
from pg_class cl FULL JOIN pg_tables ta
ON ta.tablename = cl.relname
where not cl.relfrozenxid = xid '0'
and age(cl.relfrozenxid) > 60000000
order by age(cl.relfrozenxid) desc
获取真空对象列表:
select COALESCE(ta.schemaname, 'pg_toast') || '.' || cl.relname
from pg_class cl FULL JOIN pg_tables ta
ON ta.tablename = cl.relname
where not cl.relfrozenxid = xid '0'
and age(cl.relfrozenxid) > 60000000
order by age(cl.relfrozenxid) desc