Con*_*bil 3 postgresql tablespaces disk-space vacuum
在大型表上运行 VACUUM FULL之前,是否可以检查表空间中有多少可用的可重用空间?
我有一个很大的 postgres 表(大约 20G),偶尔会出现 VACUUM FULL 的情况。该驱动器上的可用空间在 15-25 GB 之间变化。在尝试每次真空之前,我都会记录表大小(使用 postgres 查询)和可用磁盘空间(使用操作系统工具)。
我知道 VACUUM FULL 需要对表进行完整复制。因此,如果表为 20G,则需要 20G 的可用空间。
有时表有 20G,只有 15G 操作系统空间可用,真空将起作用。我猜所需的额外 5G 是从表空间内部恢复的。
其他时候,vacuum 会由于空间不足而失败,我猜在这些情况下,表空间中找不到所需的额外 5G。
我希望能够事先检查是否有足够的空间用于 VACUUM FULL,我该怎么做?我知道表有多大,我知道操作系统有多少可用空间,但我不知道表空间中有多少可重复利用的空间。
首先,我建议使用pgstattuple来获取元组级别的统计信息。
\n\n\n\n\npgstattuple返回关系的物理长度、\xe2\x80\x9cdead\xe2\x80\x9d\n 元组的百分比以及其他信息。这可以帮助用户确定是否 需要真空。
\n
例如:
\n\ncreate extension pgstattuple ;\ncreate table my_table ( id int , name text);\ninsert into my_table select a, md5(a::text) from generate_series(1, 1e7)a;\n\n-- size of my_table\n Schema | Name | Type | Owner | Size | Description\n--------+----------+-------+----------+--------+-------------\n public | my_table | table | postgres | 651 MB |\n\n-- dead_tuple_percent = 0, pgstattuple will not lock your table\nSELECT tuple_percent, dead_tuple_count, dead_tuple_percent, free_space, free_percent FROM pgstattuple(\'my_table\');\n\n tuple_percent | dead_tuple_count | dead_tuple_percent | free_space | free_percent\n---------------+------------------+--------------------+------------+--------------\n 89.35 | 0 | 0 | 338776 | 0.05\n\n-- let update 50% rows\nupdate my_table set name = name || id where id < 5000000;\n\n-- now, dead_tuple_percent = 28.63%\n tuple_percent | dead_tuple_count | dead_tuple_percent | free_space | free_percent\n---------------+------------------+--------------------+------------+--------------\n 60.43 | 4999999 | 28.63 | 1834236 | 0.17\n\n-- size of my_table has increased\n\n Schema | Name | Type | Owner | Size | Description\n--------+----------+-------+----------+---------+-------------\n public | my_table | table | postgres | 1016 MB | \n\n-- try to vacuum full\nvacuum full my_table;\n\n-- after that, dead_tuple_percent = 0 and size of my_table has reduced\n tuple_percent | dead_tuple_count | dead_tuple_percent | free_space | free_percent\n---------------+------------------+--------------------+------------+--------------\n 88.92 | 0 | 0 | 1664780 | 0.23\n Schema | Name | Type | Owner | Size | Description\n--------+----------+-------+----------+------------+-------------\n public | my_table | table | postgres | 691 MB |\nRun Code Online (Sandbox Code Playgroud)\n\n其次,如果您在生产环境中,我建议使用pg_repack来回收磁盘而不锁定表。
\n\n\n\n\npg_repack 是一个 PostgreSQL 扩展,可让您从表和索引中删除膨胀,并可选择恢复聚集索引的物理顺序。与 CLUSTER 和 VACUUM FULL 不同,它在线工作,\n 无需在处理期间对已处理的表持有独占锁。pg_repack 启动效率高,性能与直接使用 CLUSTER 相当。
\n
例如:
\n\n/usr/pgsql-11/bin/pg_repack -d postgres -U postgres -n -t my_table &\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
3679 次 |
| 最近记录: |