使用 lo 模組管理大型物件 - Amazon Aurora

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

使用 lo 模組管理大型物件

lo 模組 (擴充功能) 適用於透過 JDBC 或 ODBC 驅動程式使用 PostgreSQL 資料庫的資料庫使用者與開發人員。JDBC 和 ODBC 都期望當對它們的參照變更時,資料庫會處理大型物件的刪除。但是,PostgreSQL 不是這樣運作的。PostgreSQL 不會假設當某個物件其參照變更時應該予以刪除。結果是物件會保留在磁碟上,未被參照。lo 擴充功能包含一個功能,用於在參照變更時視需要觸發該功能以刪除物件。

提示

若要判定資料庫是否可以從 lo 擴充功能受益,請使用 vacuumlo 公用程式檢查是否有孤立大型物件。若要在不採取任何動作的情況下取得孤立大型物件的計數,請以 -n 選項執行該公用程式 (無操作)。若要了解如何操作,請參閱下文中的 vacuumlo utility

lo 模組適用於 Aurora PostgreSQL 13.7、12.11、11.16、10.21 和更新的次要版本。

若要安裝此模組 (擴充功能),您需要 rds_superuser 權限。安裝 lo 擴充功能會將下列項目新增至資料庫:

  • lo – 這是一個大型物件 (lo) 資料類型,可用於二進位大型物件 (BLOB) 和其他大型物件。lo 資料類型是 oid 資料類型的領域。換言之,它是具有選用限制的物件識別碼。如需詳細資訊,請參閱 PostgreSQL 文件中的物件識別碼。簡言之,您可以使用 lo 資料類型,來區分保存大型物件參照的資料庫欄與其他物件識別碼 (OID)。

  • lo_manage – 這是一個函數,您可以在包含大型物件參照的資料表欄上的觸發程序中使用此函數。只要您刪除或修改參照大型物件的值時,觸發程序都會取消該物件 (lo_unlink) 與其參照的連結。只有在資料欄是對該大型物件的唯一資料庫參照時,才對該資料欄使用觸發程序。

如需大型物件模組的詳細資訊,請參閱 PostgreSQL 文件中的 lo

安裝 lo 擴充功能

安裝 lo 擴充功能之前,請確定您已具備 rds_superuser 權限。

安裝擴充功能
  1. 使用 psql 連線到 Aurora PostgreSQL 資料庫叢集的主要資料庫執行個體。

    psql --host=your-cluster-instance-1.666666666666.aws-region.rds.amazonaws.com --port=5432 --username=postgres --password

    出現提示時,輸入您的密碼。psql 用戶端連接並顯示預設管理連接資料庫 postgres=> 作為提示。

  2. 安裝擴充功能,如下所示。

    postgres=> CREATE EXTENSION lo; CREATE EXTENSION

您現在可以使用 lo 資料類型來定義資料表中的資料欄。例如,您可以建立一個資料表 (images),其中包含點陣影像資料。您可以將 lo 資料類型用於資料欄 raster,如下列建立資料表的範例所示。

postgres=> CREATE TABLE images (image_name text, raster lo);

使用 lo_Manage 觸發程序函數刪除物件

您可以將 lo_manage 函數用於當更新或刪除 lo 時所要清理 lo 或其他大型物件欄中的觸發程序。

在參照大型物件的資料欄上設定觸發程序
  • 執行下列任意一項:

    • 使用引數的資料欄名稱,在每個資料欄上建立 BEFORE UPDATE OR DELETE 觸發程序,以包含對大型物件的唯一參照。

      postgres=> CREATE TRIGGER t_raster BEFORE UPDATE OR DELETE ON images FOR EACH ROW EXECUTE FUNCTION lo_manage(raster);
    • 僅正在更新資料欄時套用觸發程序。

      postgres=> CREATE TRIGGER t_raster BEFORE UPDATE OF images FOR EACH ROW EXECUTE FUNCTION lo_manage(raster);

lo_manage 觸發程序函數只有在插入或刪除資料欄資料 (視您定義觸發程序的方式而定) 的背景下才會運作。當您執行 DROPTRUNCATE 操作時則不會起作用。這意味著您應先將任何資料表中的物件資料欄刪除,再捨棄資料表,以免產生孤立物件。

例如,假設您想要捨棄包含 images 資料表的資料庫。您如下所示刪除資料欄。

postgres=> DELETE FROM images COLUMN raster

假設在該資料欄上定義 lo_manage 函數來處理刪除,現在您可以放心地捨棄該資料表。

使用 vacuumlo 公用程式

vacuumlo 公用程式會識別孤立大型物件並從資料庫中刪除。此公用程式自 PostgreSQL 9.1.24 起可供使用。如果您的資料庫使用者會例行性地使用大型物件,建議您偶爾執行 vacuumlo 以清理孤立大型物件。

在安裝 lo 擴充功能之前,您可以使用 vacuumlo 來評估您的 Aurora PostgreSQL 資料庫叢集是否會受益。若要這麼做,請將 vacuumlo 搭配 -n 選項 (無操作) 使用,以顯示要刪除的內容,如下所示:

$ vacuumlo -v -n -h your-cluster-instance-1.666666666666.aws-region.rds.amazonaws.com -p 5433 -U postgres docs-lab-spatial-db Password:***** Connected to database "docs-lab-spatial-db" Test run: no large objects will be removed! Would remove 0 large objects from database "docs-lab-spatial-db".

如輸出結果所示,孤立大型對象不是此特定資料庫的問題。

如需此公用程式的詳細資訊,請參閱 PostgreSQL 文件中的 vacuumlo