數據庫服務器,應對是高并發的訪問,每天都有大量的讀寫刪除操作。因此,時間一長服務器的內存就耗盡,數據庫的占的空間也很大。為了應對這個情況,我制定兩個常用的維護操作。
一、注重日常清理(VACUUM;)。因為有大量的更新(update)"刪除(delete)操作,會有大量的空間需要釋放。
每日執行一次VACUUM,每周訪問量低的時候執行VACUUM FULL;
語法結構;
VACUUM [ FULL | FREEZE ] [ VERBOSE ] [ table ]
VACUUM [ FULL | FREEZE ] [ VERBOSE ] ANALYZE [ table [ (column [, ...] ) ] ]
FULL ------選擇"完全"清理,這樣可以恢復更多的空間, 但是花的時間更多并且在表上施加了排它鎖。
FREEZE ---------選擇激進的元組"凍結"。
VERBOSE --------- 為每個表打印一份詳細的清理工作報告。
ANALYZE --------- 更新用于優化器的統計信息,以決定執行查詢的最有效方法。
table ------- 要清理的表的名稱(可以有模式修飾)。缺省時是當前數據庫中的所有表。
column ---------要分析的具體的列/字段名稱。缺省是所有列/字段。
VACUUM 回收已刪除元組占據的存儲空間。 在一般的 PostgreSQL 操作里, 那些已經 DELETE 的元組或者被 UPDATE 過后過時的元組是沒有從它們所屬的表中物理刪除的; 在完成 VACUUM 之前它們仍然存在。 因此我們有必須周期地運行 VACUUM, 特別是在常更新的表上,如果沒有參數,VACUUM 處理當前數據庫里每個表, 如果有參數,VACUUM 只處理那個表,簡單的 VACUUM (沒有FULL) 只是簡單地回收空間并且令其可以再次使用;
VACUUM命令的含義為:垃圾收集以及可選地分析一個數據庫。VACUUM回收已刪除元組占據的存儲空間。在一般的 PostgreSQL 操作里, 那些已經 DELETE 的元組或者被 UPDATE 過后過時的元組是沒有從它們所屬的表中物理刪除的; 在完成 VACUUM 之前它們仍然存在。 由于以下幾個原因,我們必須周期性運行 PostgreSQL 的 VACUUM 命令∶ 1.恢復那些由已更新的或已刪除的行占據的磁盤空間。
例子:
#psql -U pgsql dbname
dbname#VACUUM;
搞定!
二、重建索引(REINDEX)
語法
REINDEX { INDEX | TABLE | DATABASE | SYSTEM } name [ FORCE ]
描述
REINDEX命令用來重建索引。舊的索引將被刪除,重新讀取索引的父表中的數據來重建索引。REINDEX命令不支持并發創建索引的功能。在下面的情況下,應該重建索引:
· 一個索引中的數據已被破壞,包含非法的數據。軟件錯誤和硬件問題都會導致索引被損壞。
· 索引中包含許多空的或者幾乎是空的數據頁。應該重建索引,回收物理存儲空間。
· 該變了索引的存儲參數fillfactor的值,只有重建索引,新的參數值才能完全生效。
· 使用CREATE INDEX CONCURRENTLY命令創建索引時遇到錯誤,留下一個非法的索引。
例子
(1)重建索引my_index:REINDEX INDEX my_index;
(2)重建表my_table 上的所有索引:REINDEX TABLE my_table;
(3)重建數據庫中的所有索引:REINDEX DATABASE broken_db;
#psql -U pgsql dbname
dbname#REINDEX DATABASE dbname;
通過這兩個維護,可以及時釋放廢棄的資源,讓數據庫輕裝運行,速度更快