监控磁盘使用情况

本文为您介绍如何监控PolarDB PostgreSQL轻量版集群的磁盘使用情况。

监控磁盘使用情况

每个表都有一个主要的堆磁盘文件,用于存储表中的大部分数据。当表中存在超出存储限制的列,这些列的值将移动到一个附属的TOAST文件,该文件用于存储因为太宽无法存储在主表中的列值。如果存在TOAST文件,那么TOAST表上包含一个可用的索引,同时还可能有索引和基表关联。每个表和索引都存放在单独的磁盘文件里,如果文件大于1 GB,可能存在多个文件。

您可以使用以下两种方式监视磁盘空间:

  • 使用SQL函数

  • 直接观察系统目录

此处为您展示如何通过SQL查看系统目录从而监控磁盘空间使用空间。

  • 在一个最近执行过VACUUMANALYZE的数据库使用以下查询查看任意表的磁盘用量,此处查看的是customer表:

    SELECT pg_relation_filepath(oid), relpages FROM pg_class WHERE relname = 'customer';

    返回结果如下:

     pg_relation_filepath | relpages
    ----------------------+----------
     base/16384/16806     |60
    (1 row)

    其中,每个页面大小通常是8 KB,relpages只能由VACUUM、ANALYZE和少数DDL命令(如CREATE INDEX)更新。如果需要直接检查表的磁盘文件,可使用pg_relation_filepath

  • 您可以参考以下语句查看TOAST表使用空间:

    SELECT relname, relpages 
    FROM pg_class, 
        (SELECT reltoastrelid 
         FROM pg_class 
         WHERE relname = 'customer') AS ss 
    WHERE oid = ss.reltoastrelid 
       OR oid = (SELECT indexrelid 
                 FROM pg_index 
                 WHERE indrelid = ss.reltoastrelid) 
    ORDER BY relname;

    返回结果如下:

           relname        | relpages
    ----------------------+----------
     pg_toast_16806       |        0
     pg_toast_16806_index |        1
  • 您可以通过以下语句查看索引尺寸:

    SELECT c2.relname, c2.relpages FROM pg_class c, pg_class c2, pg_index i
    WHERE c.relname = 'customer' AND c.oid = i.indrelid AND c2.oid = i.indexrelid ORDER BY c2.relname;

    返回结果如下:

           relname        | relpages
    ----------------------+----------
     customer_id_indexdex |       26
  • 通过排序可以查找空间占用最大的表和索引:

    SELECT relname, relpages FROM pg_class ORDER BY relpages DESC;

    返回结果如下:

           relname        | relpages
    ----------------------+----------
     bigtable             |     3290
     customer             |     3144

磁盘空间管理

对于数据库管理员,其最重要的磁盘监控任务就是确保磁盘不会写满。尽管一个写满的数据磁盘可能不会直接导致数据损坏,但肯定会导致系统不可用。

如果保存WAL文件的磁盘写满,将导致数据库服务器致命错误且可能发生关闭。

如果无法通过删除部分数据释放磁盘空间,您可以在磁盘空间写满之前使用表空间将部分数据库文件移动到其他文件系统上。

说明

部分文件系统在即将写满时性能会急剧恶化,请监控磁盘使用情况不要等磁盘完全满的时候才采取行动。