Chapter 12. 观察磁盘使用情况

Table of Contents
12.1. 判断磁盘的使用量
12.2. 磁盘满导致的失效

本章讨论如何观察PostgreSQL数据库系统的磁盘使用情况。 在当前的版本里,数据库管理员对磁盘存储的布局没有太多的 控制,因此本节主要是提示性的信息,并且给你一些如何用操作 系统的工具管理磁盘存储的概念。

12.1. 判断磁盘的使用量

每个表都有一个主堆的磁盘文件,大多数数据都存储在这里。要存储 长的字段值,则另外还有一个TOAST文件与这个表相关联, 其名字是基于该表的OID(实际上是pg_class.relfilenode), 以及一个在TOAST表上的索引。同时还可能有索引和这个 基表关联。

你可以从三个地方监视磁盘空间:从 psql 里使用 VACUUM 的信息,从 psql 里使用 contrib/dbsize,以及在命令行上使用 contrib/oid2name。如果 psql 和任何最近刚刚清理(或者分析过)的数据库进行联接, 那么我们可以用查询来查看任意表的磁盘使用:

play=# SELECT relfilenode, relpages
play-# FROM pg_class
play-# WHERE relname = 'customer';
 relfilenode | relpages 
-------------+----------
       16806 |       60
(1 row)

每个页面通常都是 8k 字节。(记住,relpages 只是由 VACUUMANALYZE 更新。)要显示 TOAST 的表使用的空间,我们可以使用一个基于上面的堆 relfilenode 的查询:

play=# SELECT relname, relpages
play-# FROM pg_class
play-# WHERE relname = 'pg_toast_16806' OR
play-#       relname = 'pg_toast_16806_index'
play-# ORDER BY relname;
       relname        | relpages 
----------------------+----------
 pg_toast_16806       |        0
 pg_toast_16806_index |        1

你也可以很容易地显示索引的用量:

play=# SELECT c2.relname, c2.relpages
play-# FROM pg_class c, pg_class c2, pg_index i
play-# WHERE c.relname = 'customer' AND
play-#       c.oid = i.indrelid AND
play-#       c2.oid = i.indexrelid
play-# ORDER BY c2.relname;
       relname        | relpages 
----------------------+----------
 customer_id_indexdex |       26

我们很容易用 psql 找出最大的文件:

play=# SELECT relname, relpages
play-# FROM pg_class
play-# ORDER BY relpages DESC;
       relname        | relpages 
----------------------+----------
 bigtable             |     3290
 customer             |     3144

contrib/dbsize 向我们的数据库里装载一些函数,这些函数 允许我们在 psql 里找出一个表或者一个数据库的大小,而且不用 VACUUM/ANALYZE

你也可以使用 oid2name 显示磁盘用量。参阅 README.oid2name 获取例子。它包括一个为每个 数据库显示磁盘用量的脚本。