postgresql vacuum操作


來源 :https://blog.csdn.net/u011598529/article/details/49276029

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>:手動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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM