每個表都有一個主堆磁碟檔案,其中儲存了大多數資料。如果表中有任何列的值可能很寬,則還可能有一個與該表關聯的TOAST檔案,該檔案用於儲存太寬而無法輕鬆放入主表中的值(參見第 65.2 節)。如果存在, TOAST表上將有一個有效索引。還可能有與基表關聯的索引。每個表和索引都儲存在單獨的磁碟檔案中 — 如果檔案超過 1 GB,則可能不止一個檔案。
在最近清理或分析過的資料庫上使用psql ,您可以發出查詢來檢視任何表的磁碟使用情況:
SELECT pg_relation_filepath(oid), relpages FROM pg_class WHERE relname = 'customer'; pg_relation_filepath | relpages ----------------------+---------- base/16384/16806 | 60 (1 row)
每個頁面通常為 8 千位元組。(請記住,relpages僅由VACUUM、ANALYZE和一些 DDL 命令(例如CREATE INDEX )更新。)如果您想直接檢查表的磁碟檔案,則檔案路徑名很重要。
要顯示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 檔案的磁碟已滿,則可能會發生資料庫伺服器崩潰並隨後關閉。
如果無法透過刪除其他內容來釋放磁碟上的額外空間,則可以利用表空間將一些資料庫檔案移動到其他檔案系統。
提示:某些檔案系統在快滿時效能會變差,因此不要等到磁碟完全滿了才採取行動。
如果您的系統支援每個使用者的磁碟配額,那麼資料庫自然會受到伺服器執行所用使用者的配額限制。超出配額將產生與完全耗盡磁碟空間相同的不良影響。