Datenaufbewahrung mit TTL verwalten

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 Typ TIMESTAMP. 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 in timestamp_column, in dem die Zeile markiert ist für zu löschen. Der Wert muss eine nicht negative Ganzzahl sein und DAY 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 Datentyp TIMESTAMPTZ. Sie müssen diese Spalte in der CREATE 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 der timestamp_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;