

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

# Mengelola objek besar dengan modul lo
<a name="PostgreSQL_large_objects_lo_extension"></a>

Modul (ekstensi) lo ditujukan bagi pengguna dan developer basis data yang bekerja dengan basis data PostgreSQL melalui driver JDBC atau ODBC. Baik JDBC maupun ODBC mengharapkan basis data menangani penghapusan objek besar ketika referensi ke objek tersebut berubah. Namun, cara kerja PostgreSQL bukan seperti itu. PostgreSQL tidak berasumsi bahwa suatu objek harus dihapus ketika referensinya berubah. Hasilnya adalah bahwa objek tetap berada di disk, tidak direferensikan. Ekstensi lo mencakup fungsi yang Anda gunakan untuk memicu perubahan referensi untuk menghapus objek jika diperlukan.

**Tip**  
Untuk menentukan apakah database Anda dapat memperoleh manfaat dari ekstensi lo, gunakan `vacuumlo` utilitas untuk memeriksa objek besar yatim piatu. Untuk mendapatkan hitungan objek tak berinduk tanpa mengambil tindakan apa pun, jalankan utilitas dengan opsi `-n` (no-op). Untuk mempelajari caranya, lihat [vacuumlo utility](#vacuumlo-utility) berikut. 

Modul lo tersedia untuk Aurora PostgreSQL 13.7, 12.11, 11.16, 10.21, dan versi minor yang lebih tinggi.

Untuk menginstal modul (ekstensi), Anda memerlukan hak istimewa `rds_superuser`. Menginstal ekstensi lo akan menambahkan berikut ke basis data Anda:
+ `lo`— Ini adalah tipe data objek besar (lo) yang dapat Anda gunakan untuk objek besar biner (BLOBs) dan objek besar lainnya. Tipe data `lo` adalah domain dari jenis data `oid`. Dengan kata lain, ini adalah ID objek dengan batasan opsional. Untuk informasi selengkapnya, lihat [Object identifiers](https://www.postgresql.org/docs/14/datatype-oid.html) dalam dokumentasi PostgreSQL. Secara sederhana, Anda dapat menggunakan tipe `lo` data untuk membedakan kolom database Anda yang menyimpan referensi objek besar dari pengidentifikasi objek lain (OIDs). 
+ `lo_manage` – Ini adalah fungsi yang dapat digunakan dalam pemicu pada kolom tabel yang berisi referensi objek besar. Setiap kali Anda menghapus atau mengubah nilai yang mereferensikan objek besar, pemicu akan memutuskan tautan objek (`lo_unlink`) dari referensinya. Gunakan pemicu pada kolom hanya jika kolom tersebut adalah referensi basis data tunggal ke objek besar. 

Untuk informasi selengkapnya tentang modul objek besar, lihat [lo](https://www.postgresql.org/docs/current/lo.html) dalam dokumentasi PostgreSQL.

## Menginstal ekstensi lo
<a name="PostgreSQL_large_objects_lo_extension.install"></a>

Sebelum menginstal ekstensi lo, pastikan bahwa Anda memiliki hak istimewa `rds_superuser`. 

**Untuk menginstal ekstensi lo.**

1. Gunakan `psql` untuk terhubung ke instans DB primer dari klaster DB Aurora PostgreSQL Anda.

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

   Jika diminta, masukkan kata sandi Anda. Klien `psql` menghubungkan dan menampilkan basis data koneksi administratif default, `postgres=>`, sebagai perintah.

1. Instal ekstensi seperti berikut.

   ```
   postgres=> CREATE EXTENSION lo;
   CREATE EXTENSION
   ```

Anda kini dapat menggunakan jenis data `lo` untuk menentukan kolom dalam tabel Anda. Misalnya, Anda dapat membuat tabel (`images`) yang berisi data citra raster. Anda dapat menggunakan jenis data `lo` untuk kolom `raster`, seperti yang ditunjukkan pada contoh berikut, yang membuat tabel.

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

## Menggunakan fungsi pemicu lo\$1manage untuk menghapus objek
<a name="PostgreSQL_large_objects_lo_extension.using"></a>

Anda dapat menggunakan fungsi `lo_manage` dalam pemicu pada `lo` atau kolom objek besar lainnya untuk membersihkan (dan mencegah objek tak berinduk) ketika `lo` diperbarui atau dihapus. 

**Untuk menyiapkan pemicu pada kolom yang mereferensikan objek besar**
+ Lakukan salah satu langkah berikut:
  + Buat pemicu BEFORE UPDATE OR DELETE pada setiap kolom agar berisi referensi unik ke objek besar, menggunakan nama kolom untuk argumen.

    ```
    postgres=> CREATE TRIGGER t_raster BEFORE UPDATE OR DELETE ON images
        FOR EACH ROW EXECUTE FUNCTION lo_manage(raster);
    ```
  + Terapkan pemicu hanya ketika kolom sedang diperbarui.

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

Fungsi `lo_manage` pemicu hanya berfungsi saat memasukkan atau menghapus data kolom, bergantung pada bagaimana Anda mendefinisikan pemicu. Ini tidak berpengaruh ketika Anda melakukan operasi `DROP` atau `TRUNCATE` pada basis data. Berarti Anda harus menghapus kolom objek dari tabel apa pun sebelum hilang, untuk mencegah pembuatan objek tak berinduk.

Misalnya, anggaplah Anda ingin menghilangkan basis data yang berisi tabel `images`. Anda menghapus kolom sebagai berikut. 

```
postgres=> DELETE FROM images COLUMN raster
```

Dengan asumsi bahwa fungsi `lo_manage` didefinisikan pada kolom itu untuk menangani penghapusan, Anda sekarang dapat dengan aman menghilangkan tabel.

## Menghapus benda-benda besar yatim piatu menggunakan `vacuumlo`
<a name="PostgreSQL_large_objects_lo_extension.vacuumlo-utility"></a>

`vacuumlo`Utilitas mengidentifikasi dan menghapus objek besar yatim piatu dari database. Utilitas ini telah tersedia sejak PostgreSQL 9.1.24. Jika pengguna database Anda secara rutin bekerja dengan objek besar, kami sarankan Anda menjalankan `vacuumlo` sesekali untuk membersihkan objek besar yatim piatu.

Sebelum menginstal ekstensi lo, Anda dapat menggunakan `vacuumlo` untuk menilai apakah cluster Aurora PostgreSQL DB Anda dapat memperoleh manfaat. Untuk melakukannya, jalankan `vacuumlo` dengan opsi `-n` (no-op) untuk menunjukkan apa yang akan dihapus, seperti yang ditunjukkan berikut: 

```
$ 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".
```

Seperti yang ditunjukkan output, objek besar tak berinduk tidak menjadi masalah untuk basis data khusus ini. 

Untuk informasi lebih lanjut tentang utilitas ini, lihat [https://www.postgresql.org/docs/current/vacuumlo.html](https://www.postgresql.org/docs/current/vacuumlo.html)di dokumentasi PostgreSQL.

## Memahami cara kerja `vacuumlo`
<a name="PostgreSQL_large_objects_lo_extension.vacuumlo-remove"></a>

 `vacuumlo`Perintah menghapus objek besar yatim piatu (LOs) dari database PostgreSQL Anda tanpa mempengaruhi atau bertentangan dengan tabel pengguna Anda.

Perintah berfungsi sebagai berikut:

1. `vacuumlo`dimulai dengan membuat tabel sementara yang berisi semua Object IDs (OIDs) dari objek besar dalam database Anda.

1. `vacuumlo`kemudian memindai melalui setiap kolom dalam database yang menggunakan tipe data `oid` atau`lo`. Jika `vacuumlo` menemukan OID yang cocok di kolom ini, ia menghapus OID dari tabel sementara. `vacuumlo`memeriksa hanya kolom yang diberi nama khusus `oid` atau`lo`, bukan domain berdasarkan jenis ini.

1. Entri yang tersisa dalam tabel sementara mewakili yatim piatu LOs, yang `vacuumlo` kemudian dihapus dengan aman.

## Meningkatkan `vacuumlo` kinerja
<a name="PostgreSQL_large_objects_lo_extension.vacuumlo-improve"></a>

 Anda berpotensi dapat meningkatkan kinerja `vacuumlo` dengan meningkatkan ukuran batch menggunakan `-l` opsi. Ini memungkinkan `vacuumlo` untuk memproses lebih banyak LOs sekaligus. 

 Jika sistem Anda memiliki memori yang cukup dan Anda dapat mengakomodasi tabel sementara sepenuhnya dalam memori, meningkatkan `temp_buffers` pengaturan di tingkat database dapat meningkatkan kinerja. Hal ini memungkinkan tabel untuk berada sepenuhnya dalam memori, yang dapat meningkatkan kinerja secara keseluruhan. 

Berikut query memperkirakan ukuran tabel sementara:

```
SELECT
    pg_size_pretty(SUM(pg_column_size(oid))) estimated_lo_temp_table_size
FROM
    pg_largeobject_metadata;
```

## Pertimbangan untuk benda besar
<a name="PostgreSQL_large_objects_lo_extension.vacuumlo-consider"></a>

Berikut ini Anda dapat menemukan beberapa pertimbangan penting untuk dicatat ketika bekerja dengan objek besar:
+ `Vacuumlo`adalah satu-satunya solusi karena saat ini tidak ada metode lain untuk menghapus yatim piatu LOs.
+ Alat seperti pglogis, replikasi logis asli, dan AWS DMS yang menggunakan teknologi replikasi tidak mendukung replikasi objek besar.
+ Saat merancang skema database Anda, hindari menggunakan objek besar bila memungkinkan dan pertimbangkan untuk menggunakan tipe data alternatif seperti `bytea` sebagai gantinya.
+ Jalankan `vacuumlo` secara teratur, setidaknya setiap minggu, untuk mencegah masalah dengan yatim piatu LOs.
+ Gunakan pemicu dengan `lo_manage` fungsi pada tabel yang menyimpan objek besar untuk membantu mencegah anak yatim piatu dibuat LOs .