Mengelola retensi data dengan TTL

Halaman ini membahas cara menggunakan time to live (TTL) di tabel Spanner. Untuk mempelajari lebih lanjut, lihat artikel Tentang TTL.

Sebelum memulai

Sebelum memulai, ikuti praktik terbaik berikut.

Aktifkan pencadangan dan pemulihan point-in-time

Sebelum menambahkan TTL ke tabel Anda, sebaiknya aktifkan Pencadangan dan pemulihan Spanner. Dengan cara ini, Anda dapat sepenuhnya memulihkan database jika Anda tidak sengaja menghapus data dengan kebijakan TTL.

Jika telah mengaktifkan pemulihan point-in-time, Anda dapat melihat dan memulihkan data yang dihapus—tanpa pemulihan penuh dari cadangan—jika berada dalam periode retensi data versi yang dikonfigurasi. Untuk informasi tentang pembacaan data sebelumnya, lihat Melakukan pembacaan yang sudah tidak berlaku.

Membersihkan data lama

Jika ini adalah pertama kalinya Anda menggunakan TTL dan Anda memperkirakan proses pertama akan menghapus banyak baris, pertimbangkan untuk membersihkan data lama secara manual menggunakan DML yang dipartisi terlebih dahulu. Tindakan ini memberi Anda kontrol lebih besar atas penggunaan resource, bukan menyerahkannya ke proses latar belakang TTL. TTL berjalan dengan prioritas rendah, sehingga ideal untuk pembersihan bertahap. Namun, hal ini mungkin akan memperpanjang waktu yang diperlukan untuk menghapus kumpulan baris awal dalam database yang sibuk karena penjadwal kerja internal Spanner akan memprioritaskan pekerjaan lain, seperti kueri pengguna.

Verifikasi kondisi Anda

Untuk tabel GoogleSQL, jika ingin memverifikasi data yang akan terpengaruh oleh kebijakan penghapusan baris sebelum mengaktifkan TTL, Anda dapat membuat kueri tabel menggunakan kondisi yang sama. Contoh:

GoogleSQL

  SELECT COUNT(*)
  FROM CalculatedRoutes
  WHERE TIMESTAMP_ADD(CreatedAt, INTERVAL 30 DAY) < CURRENT_TIMESTAMP();

Izin yang diperlukan

Untuk mengubah skema database, Anda harus memiliki izin spanner.databases.updateDdl. Untuk mengetahui detailnya, lihat Kontrol akses untuk Spanner.

Membuat kebijakan penghapusan baris

GoogleSQL

Untuk membuat kebijakan penghapusan baris menggunakan GoogleSQL, Anda dapat menentukan klausa ROW DELETION POLICY saat membuat tabel baru, atau menambahkan kebijakan ke tabel yang ada. Klausa ini berisi ekspresi kolom dan interval.

Untuk menambahkan kebijakan pada saat pembuatan tabel:

CREATE TABLE MyTable(
Key INT64,
CreatedAt TIMESTAMP,
) PRIMARY KEY (Key),
ROW DELETION POLICY (OLDER_THAN(timestamp_column, INTERVAL num_days DAY));

Dengan keterangan:

  • timestamp_column harus berupa kolom yang sudah ada dengan jenis TIMESTAMP. Kolom dengan stempel waktu commit akan valid, begitu juga kolom yang dihasilkan. Namun, Anda tidak dapat menentukan kolom yang dihasilkan yang mereferensikan kolom stempel waktu commit.

  • num_days adalah jumlah hari setelah stempel waktu di timestamp_column saat baris ditandai untuk penghapusan. Nilainya harus berupa bilangan bulat non-negatif dan DAY adalah satu-satunya unit yang didukung.

Untuk menambahkan kebijakan ke tabel yang sudah ada, gunakan pernyataan ALTER TABLE. Sebuah tabel dapat memiliki maksimal satu kebijakan penghapusan baris. Penambahan kebijakan penghapusan baris ke tabel dengan kebijakan yang ada akan gagal dan menghasilkan error. Lihat bagian TTL pada kolom yang dihasilkan untuk menentukan logika penghapusan baris yang lebih canggih.

ALTER TABLE Albums
ADD ROW DELETION POLICY (OLDER_THAN(timestamp_column, INTERVAL num_days DAY));

PostgreSQL

Untuk membuat kebijakan penghapusan baris menggunakan PostgreSQL, Anda dapat menentukan klausa TTL INTERVAL saat membuat tabel baru, atau menambahkan kebijakan ke tabel yang sudah ada.

Untuk menambahkan kebijakan pada saat pembuatan tabel:

CREATE TABLE mytable (
  key bigint NOT NULL,
  timestamp_column_name TIMESTAMPTZ,
  PRIMARY KEY(key)
) TTL INTERVAL interval_spec ON timestamp_column_name;

Dengan keterangan:

  • timestamp_column_name harus berupa kolom dengan jenis data TIMESTAMPTZ. Anda harus membuat kolom ini dalam pernyataan CREATE TABLE. Kolom dengan stempel waktu commit akan valid, begitu juga kolom yang dihasilkan. Namun, Anda tidak dapat menentukan kolom yang dihasilkan yang mereferensikan kolom stempel waktu commit.

  • interval_spec adalah jumlah hari setelah stempel waktu di timestamp_column_name saat baris ditandai untuk penghapusan. Nilainya harus berupa bilangan bulat non-negatif dan harus dievaluasi ke seluruh jumlah hari. Misalnya, '3 days' diizinkan, tetapi '3 days - 2 minutes' akan menampilkan error.

Untuk menambahkan kebijakan ke tabel yang sudah ada, gunakan pernyataan ALTER TABLE. Sebuah tabel dapat memiliki maksimal satu kebijakan TTL. Menambahkan kebijakan TTL ke tabel dengan kebijakan yang ada akan gagal dengan pesan error. Lihat bagian TTL pada kolom yang dihasilkan untuk menentukan logika TTL yang lebih canggih.

Untuk menambahkan kebijakan ke tabel yang ada:

ALTER TABLE albums
ADD COLUMN timestampcolumn TIMESTAMPTZ;

ALTER TABLE albums
ADD TTL INTERVAL '5 days' ON timestampcolumn;

Pembatasan

Anda tidak dapat membuat kebijakan penghapusan baris:

  • Pada tabel yang direferensikan oleh foreign key.
  • Pada induk tabel yang dirujuk oleh {i>foreign key<i}.

Pada contoh berikut, Anda tidak dapat menambahkan kebijakan penghapusan baris ke tabel Customers karena kebijakan tersebut dirujuk oleh kunci asing dalam tabel Orders dan menghapus pelanggan dapat melanggar batasan ini.

GoogleSQL

CREATE TABLE Customers (
  CustomerID INT64,
  CreatedAt TIMESTAMP
) PRIMARY KEY (CustomerID);

CREATE TABLE Orders (
  OrderID INT64,
  CustomerID INT64,
  CONSTRAINT FK_CustomerOrder FOREIGN KEY (CustomerID) REFERENCES Customers (CustomerID)
) PRIMARY KEY (OrderID)

PostgreSQL

CREATE TABLE customers (
  customerid   bigint NOT NULL,
  CreatedAt  timestamptz,
  PRIMARY KEY(customerid)
);

CREATE TABLE orders (
  orderid bigint NOT NULL,
  customerid bigint,
  PRIMARY KEY(orderid),
  CONSTRAINT fk_customerorder FOREIGN KEY (customerid) REFERENCES customers (customerid)
);

TTL pada kolom dengan nilai default

Kebijakan penghapusan baris dapat menggunakan kolom stempel waktu dengan nilai default. Nilai default umum adalah CURRENT_TIMESTAMP. Jika tidak ada nilai yang ditetapkan secara eksplisit ke kolom, atau jika kolom ditetapkan ke nilai defaultnya dengan pernyataan INSERT atau UPDATE, nilai default akan digunakan dalam penghitungan aturan.

Pada contoh berikut, nilai default untuk kolom CreatedAt dalam tabel Customers adalah stempel waktu saat baris dibuat.

GoogleSQL

CREATE TABLE Customers (
  CustomerID INT64,
  CreatedAt TIMESTAMP DEFAULT (CURRENT_TIMESTAMP())
) PRIMARY KEY (CustomerID);

Untuk informasi selengkapnya, lihat DEFAULT (ekspresi) di "Bahasa definisi data GoogleSQL".

PostgreSQL

CREATE TABLE customers (
  customerid bigint NOT NULL,
  createdat timestamptz DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY(customerid)
  );

Untuk informasi selengkapnya, lihat CREATE TABLE di "Bahasa definisi data PostgreSQL".

TTL pada kolom yang dibuat

Kebijakan penghapusan baris dapat menggunakan kolom yang dibuat untuk menampilkan aturan yang lebih mendetail. Misalnya, Anda dapat menentukan kebijakan penghapusan baris pada stempel waktu greatest (GoogleSQL atau PostgreSQL) dari beberapa kolom, atau memetakan nilai lain ke stempel waktu.

GoogleSQL

Tabel berikut bernama Orders melacak pesanan penjualan. Pemilik tabel ingin menyiapkan kebijakan penghapusan baris yang menghapus pesanan yang dibatalkan setelah 30 hari, dan pesanan yang tidak dibatalkan setelah 180 hari.

TTL Spanner hanya mengizinkan satu kebijakan penghapusan baris per tabel. Untuk menyatakan kedua kriteria dalam satu kolom, Anda dapat menggunakan kolom yang dihasilkan dengan pernyataan IF:

CREATE TABLE Orders (
  OrderId INT64 NOT NULL,
  OrderStatus STRING(30) NOT NULL,
  LastModifiedDate TIMESTAMP NOT NULL,
  ExpiredDate TIMESTAMP AS (IF(OrderStatus = 'Cancelled',
    TIMESTAMP_ADD(LastModifiedDate, INTERVAL 30 DAY),
    TIMESTAMP_ADD(LastModifiedDate, INTERVAL 180 DAY))) STORED,
) PRIMARY KEY(OrderId),
ROW DELETION POLICY (OLDER_THAN(ExpiredDate, INTERVAL 0 DAY));

Pernyataan tersebut membuat kolom bernama ExpiredDate yang menambahkan 30 hari atau 180 hari ke LastModifiedDate, bergantung pada status pesanan. Kemudian, kebijakan penghapusan baris akan ditetapkan untuk mengakhiri masa berlaku baris pada hari yang disimpan di kolom ExpiredDate dengan menentukan INTERVAL 0 day.

PostgreSQL

Tabel berikut bernama Orders melacak pesanan penjualan. Pemilik tabel ingin menyiapkan kebijakan penghapusan baris yang menghapus baris setelah 30 hari tidak aktif.

TTL Spanner hanya mengizinkan satu kebijakan penghapusan baris per tabel. Untuk menyatakan kedua kriteria dalam satu kolom, Anda dapat membuat kolom yang dihasilkan:

CREATE TABLE orders (
    orderid bigint NOT NULL,
    orderstatus varchar(30) NOT NULL,
    createdate timestamptz NOT NULL,
    lastmodifieddate timestamptz,
    expireddate timestamptz GENERATED ALWAYS AS (GREATEST(createdate, lastmodifieddate)) STORED,
    PRIMARY KEY(orderid)
) TTL INTERVAL '30 days' ON expireddate;

Pernyataan tersebut membuat kolom yang dihasilkan dengan nama ExpiredDate yang mengevaluasi yang terbaru dari dua tanggal (LastModifiedDate atau CreateDate). Kemudian, pernyataan tersebut menentukan kebijakan penghapusan baris agar baris berakhir masa berlakunya 30 hari setelah pesanan dibuat, atau jika pesanan diubah dalam 30 hari tersebut, pemesanan akan diperpanjang selama 30 hari lagi.

TTL dan tabel sisipan

Tabel sisipan adalah pengoptimalan performa yang mengaitkan baris terkait dalam tabel turunan dengan baris di tabel induk. Untuk menambahkan kebijakan penghapusan baris di tabel induk, semua tabel turunan yang disisipkan harus menentukan ON DELETE CASCADE, yang berarti baris turunan akan dihapus secara atomik bersama baris induk. Hal ini memastikan integritas referensial sehingga penghapusan pada tabel induk juga akan menghapus baris turunan terkait dalam transaksi yang sama. TTL Spanner tidak mendukung ON DELETE NO ACTION.

Ukuran transaksi maksimum

Spanner memiliki batas ukuran transaksi. Penghapusan bertingkat pada hierarki induk-turunan besar dengan kolom terindeks dapat melampaui batas ini dan menyebabkan satu atau beberapa operasi TTL gagal. Untuk operasi yang gagal, TTL akan mencoba lagi dengan batch yang lebih kecil, hingga ke satu baris induk. Namun, hierarki turunan yang besar, bahkan untuk satu baris induk tunggal masih dapat melebihi batas mutasi.

Operasi yang gagal dilaporkan dalam metrik TTL.

Jika satu baris dan turunan yang berselang-seling terlalu besar untuk dihapus, Anda dapat melampirkan kebijakan penghapusan baris langsung pada tabel turunan, selain yang ada di tabel induk. Kebijakan pada tabel turunan harus dikonfigurasi sedemikian rupa sehingga baris turunan dihapus sebelum baris induk.

Pertimbangkan untuk melampirkan kebijakan penghapusan baris ke tabel turunan jika dua pernyataan berikut berlaku:

  • Tabel turunan memiliki indeks global yang terkait dengannya; dan
  • Anda mengharapkan banyak (>100) baris turunan per baris induk.

Menghapus kebijakan penghapusan baris

Anda dapat menghapus kebijakan penghapusan baris yang sudah ada dari tabel. Tindakan ini akan menampilkan error jika tidak ada kebijakan penghapusan baris pada tabel.

GoogleSQL

ALTER TABLE MyTable
DROP ROW DELETION POLICY;

PostgreSQL

ALTER TABLE mytable
DROP TTL;

Dengan menghapus kebijakan penghapusan baris, semua proses TTL yang berjalan di latar belakang akan langsung dibatalkan. Setiap baris yang telah dihapus oleh proses yang sedang berlangsung akan tetap dihapus.

Menghapus kolom yang dirujuk oleh kebijakan penghapusan baris

Spanner tidak mengizinkan Anda menghapus kolom yang direferensikan oleh kebijakan penghapusan baris. Anda harus menghapus kebijakan penghapusan baris terlebih dahulu sebelum menghapus kolom.

Melihat kebijakan penghapusan baris pada tabel

Anda dapat melihat kebijakan penghapusan baris di tabel Spanner.

GoogleSQL

SELECT TABLE_NAME, ROW_DELETION_POLICY_EXPRESSION
FROM INFORMATION_SCHEMA.TABLES
WHERE ROW_DELETION_POLICY_EXPRESSION IS NOT NULL;

Untuk mengetahui informasi selengkapnya, lihat Skema informasi untuk database dialek GoogleSQL.

PostgreSQL

SELECT table_name, row_deletion_policy_expression
FROM information_schema.tables
WHERE row_deletion_policy_expression is not null;

Untuk mengetahui informasi selengkapnya, lihat Skema informasi untuk database dialek PostgreSQL.

Mengubah kebijakan penghapusan baris

Anda dapat mengubah kolom atau ekspresi interval dari kebijakan penghapusan baris yang ada. Contoh berikut mengalihkan kolom dari CreatedAt ke ModifiedAt dan memperluas interval dari 1 DAY ke 7 DAY. Tindakan ini akan menampilkan error jika tidak ada kebijakan penghapusan baris pada tabel.

GoogleSQL

ALTER TABLE MyTable
REPLACE ROW DELETION POLICY (OLDER_THAN(ModifiedAt, INTERVAL 7 DAY));

PostgreSQL

ALTER TABLE mytable
ALTER TTL INTERVAL '7 days' ON timestampcolumn;