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 jenisTIMESTAMP
. 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 ditimestamp_column
saat baris ditandai untuk penghapusan. Nilainya harus berupa bilangan bulat non-negatif danDAY
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 dataTIMESTAMPTZ
. Anda harus membuat kolom ini dalam pernyataanCREATE 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 ditimestamp_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;