postgresql vacuum操作


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;

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


免責聲明!

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



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