微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

postgresql vacuum操作

Postgresql数据库管理工作中,定期vacuum是一个重要的工作.
vacuum的效果
1.1 释放,再利用 更新/删除的行所占据的磁盘空间.
1.2更新POSTGRESQL查询计划中使用的统计数据
1.3防止因事务ID的重置而使非常老的数据丢失。

第一点的原因是Postgresql数据的插入,更新,删除操作并不是真正放到数据库空间.如果不定期释放空间的话,由于数据太多,查询速度会巨降.
第二点的原因是Postgresql在做查询处理的时候,为了是查询速度提高,会根据统计数据来确定执行计划.如果不及时更新的话,查询效果可能不如预期.
第三点的原因是Postgresql中每一个事务都会产生一个事务ID,但这个数字是有上限的.当事务ID达到最大值后,会重新从最小值开始循环.这样如果不及时把以前的数据释放掉的话,原来的老数据会因为事务ID的丢失而丢失掉.

虽然在新版本的Postgresql中有自动的vacuum,但是如果是大批量的数据IO可能会导致自动执行很慢,需要配合手动执行以及自己的脚本来清理数据库

1. vacuumdb 是 sql 命令VACUUM 的封装,所以用vacuumdb和vacuum来清理数据库都可以,效果是一样的。
2. vacuumdb 中的几个重要参数:可以用vacuumdb --help查询
-a/--all vacuum所有的数据库

-d dbname 只vacuum dbname这个数据库
-f/--full 执行full的vacuum
-t table 只vacuum table这个数据表
-z/--analyze Calculate statistics for use by the optimizer
3. 切换到postgres用户下:
vacuumdb -d yourdbname -f -z -v 来清理你的数据库
或者加到conrtab中15 1 * * * postgres vacuumdb -d mydb-f -z -v >> /tmp/vacuumdb.log
每天的一点一刻开始进行清理。
4. 如何查询我的XID是否接近临界值的命令:
select age(datfrozenxid) from pg_database;
或者: select max(age(datfrozenxid)) from pg_database;

postgresql<wbr></p>:手动vacuum与vacuumdb

5. 然而我们关心的是哪一个大的表组要真正的vacuum:
SELECT relname,age(relfrozenxid) as xid_age, pg_size_pretty(pg_table_size(oid)) as table_size FROM pg_class WHERE relkind = 'r' and pg_table_size(oid) > 1073741824
ORDER BY age(relfrozenxid) DESC LIMIT 20;
这个命令是查询按照最老的XID排序,查看大于 1G 而且是排名前20的表。
下面是一个例子:
relname|xid_age| table_size
------------------------+-----------+------------
postgres_log| 199785216 | 12 GB
statements|4551790 | 1271 MB
normal_statement_times |31 | 12 GB
然后你可以单独每个表进行vacuum:
vacuumdb --analyze --verbose --table ' postgres_log ' mydb
以上很多内容主要参考国外一个数据库大师的博客,如果有想深入研究的可以直接参考下面链接
http://www.databasesoup.com/2012/09/freezing-your-tuples-off-part-1.html

原文地址:https://www.jb51.cc/postgresql/194919.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐