Auf dieser Seite wird erläutert, wie Sie die Gültigkeitsdauer (TTL) für Spanner-Tabellen verwenden. Bis Weitere Informationen zur TTL
Hinweise
Beachten Sie die folgenden Best Practices, bevor Sie beginnen.
Sicherung und Wiederherstellung zu einem bestimmten Zeitpunkt aktivieren
Bevor Sie Ihrer Tabelle eine TTL hinzufügen, sollten Sie Folgendes aktivieren: Spanner-Sicherung und -Wiederherstellung. Dadurch können können Sie eine Datenbank vollständig wiederherstellen, falls Sie Ihre Daten mit die TTL-Richtlinie.
Wenn Sie die Wiederherstellung zu einem bestimmten Zeitpunkt aktiviert haben, können Sie gelöschte Daten – ohne vollständige Wiederherstellung aus der Sicherung – aufrufen und wiederherstellen, solange die für die Version konfigurierte Aufbewahrungsdauer noch nicht überschritten ist. Informationen zum Lesen von Daten in der Vergangenheit finden Sie unter Veralteten Lesevorgang durchführen.
Alte Daten bereinigen
Wenn Sie die TTL zum ersten Mal verwenden und erwarten, viele Zeilen löschen, sollten Sie zuerst alte Daten manuell mit partitionierte DML verwendet. So haben Sie mehr Kontrolle über die Ressourcennutzung, des TTL-Hintergrundprozesses. TTL wird mit niedriger Priorität ausgeführt, ideal für inkrementelle bereinigt werden. Dadurch dauert es jedoch wahrscheinlich länger, bis die ersten Zeilensatz in einer ausgelasteten Datenbank, da die interne der Arbeitsplaner andere Aufgaben priorisiert, z. B. Nutzeranfragen.
Bedingungen überprüfen
Wenn Sie bei GoogleSQL-Tabellen prüfen möchten, welche Daten der wirkt sich die Richtlinie für das Löschen von Zeilen vor dem Aktivieren der TTL aus, können Sie die Tabelle abfragen mit denselben Bedingungen. Beispiel:
GoogleSQL
SELECT COUNT(*)
FROM CalculatedRoutes
WHERE TIMESTAMP_ADD(CreatedAt, INTERVAL 30 DAY) < CURRENT_TIMESTAMP();
Erforderliche Berechtigungen
Zum Ändern des Datenbankschemas benötigen Sie den spanner.databases.updateDdl. Weitere Informationen finden Sie unter Zugriffssteuerung für Spanner
Richtlinie zum Löschen von Zeilen erstellen
GoogleSQL
Um mit GoogleSQL eine Richtlinie für das Löschen von Zeilen zu erstellen, können Sie eine
ROW DELETION POLICY
-Klausel, wenn Sie eine neue Tabelle erstellen oder eine Richtlinie zu
eine vorhandene Tabelle. Diese Klausel enthält einen Ausdruck einer Spalte und ein
Intervall.
So fügen Sie eine Richtlinie zum Zeitpunkt der Tabellenerstellung hinzu:
CREATE TABLE MyTable( Key INT64, CreatedAt TIMESTAMP, ) PRIMARY KEY (Key), ROW DELETION POLICY (OLDER_THAN(timestamp_column, INTERVAL num_days DAY));
Wobei:
timestamp_column
muss eine vorhandene Spalte sein mit dem TypTIMESTAMP
. Spalten mit Commit-Zeitstempel sind gültig, ebenso wie generierte Spalten. Sie können jedoch nicht Geben Sie eine generierte Spalte an, die auf eine Commit-Zeitstempelspalte verweist.num_days
ist die Anzahl der Tage nach dem Zeitstempel intimestamp_column
, in dem die Zeile markiert ist für zu löschen. Der Wert muss eine nicht negative Ganzzahl sein undDAY
ist die einzige unterstützte Einheit.
Verwenden Sie die Anweisung ALTER TABLE
, um einer vorhandenen Tabelle eine Richtlinie hinzuzufügen. A
Tabelle kann höchstens eine Richtlinie zum Löschen von Zeilen haben. Richtlinie zum Löschen von Zeilen hinzufügen
für eine Tabelle mit einer vorhandenen Richtlinie schlägt mit einem Fehler fehl. Weitere Informationen finden Sie unter
TTL für generierte Spalten zur Angabe weiterer Spalten
und komplexe Löschlogik
für Zeilen zu erstellen.
ALTER TABLE Albums ADD ROW DELETION POLICY (OLDER_THAN(timestamp_column, INTERVAL num_days DAY));
PostgreSQL
Um eine Richtlinie für das Löschen von Zeilen mit PostgreSQL zu erstellen, können Sie eine
TTL INTERVAL
-Klausel, wenn Sie eine neue Tabelle erstellen oder einer Richtlinie eine Richtlinie hinzufügen
vorhandene Tabelle.
So fügen Sie beim Erstellen einer Tabelle eine Richtlinie hinzu:
CREATE TABLE mytable ( key bigint NOT NULL, timestamp_column_name TIMESTAMPTZ, PRIMARY KEY(key) ) TTL INTERVAL interval_spec ON timestamp_column_name;
Wobei:
timestamp_column_name
muss eine Spalte mit DatentypTIMESTAMPTZ
. Sie müssen diese Spalte in derCREATE TABLE
-Anweisung erstellen. Spalten mit Commit-Zeitstempel sind gültig, ebenso wie generierte Spalten. Sie können jedoch nicht Geben Sie eine generierte Spalte an, die auf eine Commit-Zeitstempelspalte verweist.interval_spec
ist die Anzahl der Tage nach dem Zeitstempel in dertimestamp_column_name
, nach denen die Zeile zum Löschen markiert wird. Der Wert muss eine nicht negative Ganzzahl sein und auf eine ganze Anzahl von Tagen lauten. Beispielsweise ist'3 days'
zulässig, aber'3 days - 2 minutes'
gibt einen Fehler zurück.
Verwenden Sie die Anweisung ALTER TABLE
, um einer vorhandenen Tabelle eine Richtlinie hinzuzufügen. A
Tabelle darf höchstens eine TTL-Richtlinie haben. Hinzufügen einer TTL-Richtlinie zu einer Tabelle mit
Eine vorhandene Richtlinie schlägt mit einem Fehler fehl. Weitere Informationen finden Sie unter
TTL für generierte Spalten zur Angabe weiterer Spalten
komplexe TTL-Logik.
So fügen Sie einer vorhandenen Tabelle eine Richtlinie hinzu:
ALTER TABLE albums
ADD COLUMN timestampcolumn TIMESTAMPTZ;
ALTER TABLE albums
ADD TTL INTERVAL '5 days' ON timestampcolumn;
Beschränkungen
Für Richtlinien zum Löschen von Zeilen gelten die folgenden Einschränkungen.
TTL für Tabellen, auf die durch einen Fremdschlüssel verwiesen wird
In folgenden Fällen können Sie keine Richtlinie für das Löschen von Zeilen erstellen:
- Für eine Tabelle, auf die durch ein Fremdschlüssel ohne ON DELETE CASCADE-Einschränkung.
- Für das übergeordnete Element einer Tabelle, auf die durch einen Fremdschlüssel verwiesen wird, der keine Schließen Sie die referenzielle Aktion ON DELETE CASCADE ein.
Im folgenden Beispiel können Sie keine Richtlinie zum Löschen von Zeilen zum
Tabelle Customers
, da von einem Fremdschlüssel in der Orders
darauf verwiesen wird
, für die die Einschränkung ON DELETE CASCADE nicht gilt.
Wenn Sie Kunden löschen, verstoßen Sie möglicherweise gegen diese Fremdschlüsseleinschränkung. Sie können auch nicht
Fügen Sie der Tabelle Districts
eine Richtlinie zum Löschen von Zeilen hinzu. Zeile löschen aus
Districts
kann dazu führen, dass Löschvorgänge an die untergeordnete Tabelle Customers
weitergegeben werden.
verstößt möglicherweise gegen die Fremdschlüsseleinschränkung für die Tabelle Orders
.
GoogleSQL
CREATE TABLE Districts (
DistrictID INT64
) PRIMARY KEY (DistrictID);
CREATE TABLE Customers (
DistrictID INT64,
CustomerID INT64,
CreatedAt TIMESTAMP
) PRIMARY KEY (DistrictID, CustomerID),
INTERLEAVE IN PARENT Districts ON DELETE CASCADE;
CREATE TABLE Orders (
OrderID INT64,
DistrictID INT64,
CustomerID INT64,
CONSTRAINT FK_CustomerOrder FOREIGN KEY (DistrictID, CustomerID) REFERENCES Customers (DistrictID, CustomerID)
) PRIMARY KEY (OrderID);
PostgreSQL
CREATE TABLE districts (
districtid bigint NOT NULL,
PRIMARY KEY(districtid)
);
CREATE TABLE customers (
districtid bigint NOT NULL,
customerid bigint NOT NULL,
createdat timestamptz,
PRIMARY KEY(districtid, customerid)
) INTERLEAVE IN PARENT districts ON DELETE CASCADE;
CREATE TABLE orders (
orderid bigint NOT NULL,
districtid bigint,
customerid bigint,
PRIMARY KEY(orderid),
CONSTRAINT fk_customerorder FOREIGN KEY (districtid, customerid) REFERENCES customers (districtid, customerid)
);
Sie können eine Richtlinie zum Löschen von Zeilen für eine Tabelle erstellen, auf die von einem fremden Land verwiesen wird.
Schlüsseleinschränkung, die ON DELETE CASCADE
verwendet. Im folgenden Beispiel können Sie
eine Richtlinie zum Löschen von Zeilen für die Tabelle Customers
erstellen, auf die durch
Die Fremdschlüsseleinschränkung CustomerOrder
, die in der Tabelle Orders
definiert ist. Wann?
Mit der TTL werden Zeilen in Customers
gelöscht und der Löschvorgang wird an die übereinstimmenden Zeilen weitergeleitet
die in der Tabelle Orders
enthalten sind.
GoogleSQL
CREATE TABLE Districts (
DistrictID INT64,
CreatedAt TIMESTAMP
) PRIMARY KEY (DistrictID),
ROW DELETION POLICY (OLDER_THAN(CreatedAt, INTERVAL 1 DAY));
CREATE TABLE Customers (
DistrictID INT64,
CustomerID INT64,
CreatedAt TIMESTAMP
) PRIMARY KEY (DistrictID, CustomerID),
INTERLEAVE IN PARENT Districts ON DELETE CASCADE,
ROW DELETION POLICY (OLDER_THAN(CreatedAt, INTERVAL 1 DAY));
CREATE TABLE Orders (
OrderID INT64,
DistrictID INT64,
CustomerID INT64,
CONSTRAINT FK_CustomerOrder FOREIGN KEY (DistrictID, CustomerID) REFERENCES Customers (DistrictID, CustomerID) ON DELETE CASCADE
) PRIMARY KEY (OrderID);
PostgreSQL
CREATE TABLE districts (
districtid bigint NOT NULL,
createdat timestamptz,
PRIMARY KEY(districtid)
) TTL INTERVAL '1 day' ON createdat;
CREATE TABLE customers (
districtid bigint NOT NULL,
customerid bigint NOT NULL,
createdat timestamptz,
PRIMARY KEY(districtid, customerid)
) INTERLEAVE IN PARENT districts ON DELETE CASCADE
TTL INTERVAL '1 day' ON createdat;
CREATE TABLE orders (
orderid bigint NOT NULL,
districtid bigint,
customerid bigint,
PRIMARY KEY(orderid),
CONSTRAINT fk_customerorder FOREIGN KEY (districtid, customerid) REFERENCES customers (districtid, customerid) ON DELETE CASCADE
);
Ebenso können Sie eine Richtlinie zum Löschen von Zeilen für ein übergeordnetes Element einer Tabelle erstellen, die
durch eine ON DELETE CASCADE
-Fremdschlüsseleinschränkung referenziert wird.
TTL für Spalten mit Standardwerten
Eine Richtlinie für das Löschen von Zeilen kann eine Zeitstempelspalte mit einem Standardwert verwenden. Ein typisches
Der Standardwert ist CURRENT_TIMESTAMP
. Wenn kein Wert explizit zugewiesen ist,
oder wenn die Spalte durch ein INSERT
- oder
UPDATE
verwenden, wird der Standardwert für die Regelberechnung verwendet.
Im folgenden Beispiel ist der Standardwert für die Spalte CreatedAt
in der Tabelle
Customers
ist der Zeitstempel, zu dem die Zeile erstellt wird.
GoogleSQL
CREATE TABLE Customers (
CustomerID INT64,
CreatedAt TIMESTAMP DEFAULT (CURRENT_TIMESTAMP())
) PRIMARY KEY (CustomerID);
Weitere Informationen finden Sie unter STANDARD (Ausdruck) in „GoogleSQL-Datendefinitionssprache“.
PostgreSQL
CREATE TABLE customers (
customerid bigint NOT NULL,
createdat timestamptz DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY(customerid)
);
Weitere Informationen finden Sie unter CREATE TABLE in „PostgreSQL-Datendefinitionssprache“ ein.
TTL für generierte Spalten
Richtlinien für das Löschen von Zeilen können generierte Spalten verwenden
um komplexere Regeln auszudrücken. Sie können z. B. festlegen,
dass Zeilen gelöscht werden,
für den greatest
-Zeitstempel (GoogleSQL oder PostgreSQL) mehrerer Spalten oder ordnen Sie einen anderen Wert einem
Zeitstempel.
GoogleSQL
In der folgenden Tabelle mit dem Namen Orders
werden Verkaufsaufträge erfasst.
Der Tabelleninhaber möchte eine Richtlinie zum Löschen von Zeilen einrichten, mit der stornierte Bestellungen nach 30 Tagen und nicht stornierte Bestellungen nach 180 Tagen gelöscht werden.
Die Spanner-TTL lässt nur eine Richtlinie für das Löschen von Zeilen pro Tabelle zu. Bis
die beiden Kriterien in einer einzigen Spalte ausdrücken,
können Sie eine generierte Spalte verwenden,
mit einer IF
-Anweisung:
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));
Mit der Anweisung wird eine Spalte namens ExpiredDate
erstellt, die je nach Bestellstatus entweder 30 Tage oder 180 Tage zum LastModifiedDate
hinzufügt. Gehen Sie dann so vor:
Sie definiert die Richtlinie für das Löschen von Zeilen, sodass Zeilen an dem im
ExpiredDate
durch Angabe von INTERVAL 0 day
.
PostgreSQL
In der folgenden Tabelle mit dem Namen Orders
werden Verkaufsaufträge erfasst.
Der Tabelleninhaber möchte eine Richtlinie zum Löschen von Zeilen einrichten, die Zeilen löscht
nach 30 Tagen Inaktivität.
Die Spanner-TTL lässt nur eine Richtlinie für das Löschen von Zeilen pro Tabelle zu. Bis die beiden Kriterien in einer einzigen Spalte ausdrücken, können Sie ein generiertes Spalte:
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;
Mit der Anweisung wird eine generierte Spalte mit dem Namen ExpiredDate
erstellt, die Folgendes bewertet:
der letzte der beiden Datumsangaben (LastModifiedDate
oder CreateDate
)
Dann wird die Richtlinie für das Löschen von Zeilen so definiert, dass Zeilen 30 Tage nach dem
oder wenn der Auftrag innerhalb dieser 30 Tage geändert wurde,
wird der Löschvorgang um weitere 30 Tage verlängert.
TTL und verschränkte Tabellen
Verschachtelte Tabellen sind eine Leistungsoptimierung, bei der zugehörige Zeilen in einer untergeordneten Tabelle vom Typ „Eins-zu-viele“ mit einer Zeile in einer übergeordneten Tabelle verknüpft werden. So fügen Sie eine Richtlinie für das Löschen von Zeilen zu einer
übergeordnete Tabelle muss für alle verschränkten untergeordneten Tabellen ON DELETE CASCADE
angegeben werden.
Das bedeutet, dass die untergeordneten Zeilen gemeinsam mit der übergeordneten Zeile gelöscht werden. Dieses
stellt referenzielle Integrität sicher, sodass beim Löschen in der übergeordneten Tabelle auch
zugehörigen untergeordneten Zeilen
in derselben Transaktion erstellen. Spanner-TTL
unterstützt ON DELETE NO ACTION
nicht.
Maximale Transaktionsgröße
Spanner hat ein Limit für die Transaktionsgröße. Kaskadierende Löschvorgänge für große über- und untergeordnete Hierarchien mit indexierten Spalten können diese Limits überschreiten und dazu führen, dass ein oder mehrere TTL-Vorgänge fehlschlagen. Bei fehlgeschlagenen Vorgängen wiederholt TTL den Vorgang für kleinere Batches bis zu einer einzelnen übergeordneten Zeile. Große untergeordnete Hierarchien für sogar eine einzelne übergeordnete Zeile können jedoch weiterhin das Mutationslimit überschreiten.
Fehlgeschlagene Vorgänge werden gemeldet in TTL-Messwerte:
Wenn eine einzelne Zeile und ihre verschränkten untergeordneten Elemente zu groß sind, um gelöscht zu werden, können Sie eine Richtlinie zum Löschen von Zeilen direkt an die untergeordneten Tabellen anhängen, eine in der übergeordneten Tabelle. Die Richtlinie für untergeordnete Tabellen sollte so konfiguriert werden: dass untergeordnete Zeilen vor übergeordneten Zeilen gelöscht werden.
Ziehen Sie in Betracht, eine Richtlinie für das Löschen von Zeilen an untergeordnete Tabellen anzuhängen, wenn die folgenden beiden Punkte zutreffen:
- Die untergeordnete Tabelle ist mit globalen Indexen verknüpft und
- Sie erwarten eine große Anzahl (>100) von untergeordneten Zeilen pro übergeordneter Zeile.
Richtlinie zum Löschen von Zeilen löschen
Sie können eine vorhandene Richtlinie für das Löschen von Zeilen aus einer Tabelle löschen. Dies gibt einen Fehler zurück, wenn in der Tabelle keine Richtlinie für das Löschen von Zeilen vorhanden ist.
GoogleSQL
ALTER TABLE MyTable
DROP ROW DELETION POLICY;
PostgreSQL
ALTER TABLE mytable
DROP TTL;
Wenn Sie eine Richtlinie zum Löschen von Zeilen löschen, werden alle TTL-Prozesse abgebrochen, die im Hintergrund ausgeführt werden. Alle Zeilen, die bereits von den laufenden Prozessen gelöscht wurden, bleiben gelöscht.
Spalte löschen, auf die in einer Richtlinie für das Löschen von Zeilen verwiesen wird
Sie können in Spanner keine Spalte löschen, auf die verwiesen wird durch eine Richtlinie zum Löschen von Zeilen. Sie müssen zuerst die Richtlinie für das Löschen von Zeilen löschen, bevor Sie die Spalte löschen.
Richtlinie zum Löschen von Zeilen einer Tabelle ansehen
Sie können die Richtlinien für das Löschen von Zeilen Ihrer Spanner-Tabellen ansehen.
GoogleSQL
SELECT TABLE_NAME, ROW_DELETION_POLICY_EXPRESSION
FROM INFORMATION_SCHEMA.TABLES
WHERE ROW_DELETION_POLICY_EXPRESSION IS NOT NULL;
Weitere Informationen finden Sie unter Informationsschema für GoogleSQL-Dialekt-Datenbanken.
PostgreSQL
SELECT table_name, row_deletion_policy_expression
FROM information_schema.tables
WHERE row_deletion_policy_expression is not null;
Weitere Informationen finden Sie unter Informationsschema für PostgreSQL-Dialekt-Datenbanken
Richtlinie für das Löschen von Zeilen ändern
Sie können die Spalte oder den Intervallausdruck einer vorhandenen Zeilenlöschung ändern
. Im folgenden Beispiel wird die Spalte von CreatedAt
zu
ModifiedAt
und erweitert das Intervall von 1 DAY
bis 7 DAY
. Dadurch wird ein
Fehler, wenn für die Tabelle keine Richtlinie zum Löschen von Zeilen vorhanden ist.
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;