Gerenciar a retenção de dados com o TTL

Nesta página, discutimos como usar o time to live (TTL) nas tabelas do Spanner. Para Para saber mais, consulte Sobre TTL.

Antes de começar

Antes de começar, siga estas práticas recomendadas.

Ativar backup e recuperação pontual

Antes de adicionar o TTL à sua tabela, recomendamos ativar Backup e restauração do Spanner (em inglês). Isso permite restaurar completamente um banco de dados caso você exclua acidentalmente seus dados com o a política de TTL.

Se você ativou a recuperação pontual, poderá ver e restaurar dados excluídos (sem uma restauração completa do backup) se eles estiverem dentro da versão configurada. período de armazenamento. Para informações sobre como ler dados no passado, consulte Executar uma leitura desatualizada.

Limpar dados antigos

Se esta for a primeira vez que você está usando o TTL e espera que a primeira execução exclua muitas linhas, primeiro limpe os dados antigos manualmente usando DML particionada. Isso proporciona mais controle sobre o uso dos recursos, em vez de deixar para o processo de TTL em segundo plano. O TTL é executado com baixa prioridade, ideal para limpeza. No entanto, isso provavelmente aumentará o tempo que leva para excluir o um conjunto inicial de linhas em um banco de dados ocupado porque o sistema o programador de trabalho priorizará outros trabalhos, como consultas de usuários.

Verifique suas condições

Para tabelas GoogleSQL, se você quiser verificar os dados que de exclusão de linhas afetará antes de ativar o TTL, você pode consultar sua tabela usando as mesmas condições. Exemplo:

GoogleSQL

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

Permissões necessárias

Para alterar o esquema do banco de dados, é preciso ter o permissão spanner.databases.updateDdl. Para mais detalhes, consulte Controle de acesso para o Spanner.

Criar uma política de exclusão de linhas

GoogleSQL

Para criar uma política de exclusão de linhas com o GoogleSQL, defina cláusula ROW DELETION POLICY ao criar uma nova tabela ou adicionar uma política à uma tabela atual. Essa cláusula contém uma expressão de uma coluna e um intervalo.

Para adicionar uma política no momento da criação da tabela:

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

Em que:

  • timestamp_column precisa ser uma coluna existente com o tipo TIMESTAMP. Colunas com carimbos de data/hora de commit são válidos, assim como colunas geradas. No entanto, não é possível especifique uma coluna gerada que faça referência a uma coluna de carimbo de data/hora de confirmação.

  • num_days é o número de dias após a carimbo de data/hora no timestamp_column em que a linha está marcada exclusão. O valor precisa ser um número inteiro não negativo e DAY é o único uma unidade compatível.

Para adicionar uma política a uma tabela atual, use a instrução ALTER TABLE. Um a tabela pode ter no máximo uma política de exclusão de linha. Como adicionar uma política de exclusão de linhas a uma tabela com uma política atual falhará com um erro. Consulte TTL nas colunas geradas para especificar uma lógica mais sofisticada de exclusão de linha.

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

PostgreSQL

Para criar uma política de exclusão de linhas usando o PostgreSQL, defina um cláusula TTL INTERVAL ao criar uma nova tabela ou adicionar uma política a uma tabela atual.

Para adicionar uma política no momento da criação da tabela:

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

Em que:

  • timestamp_column_name precisa ser uma coluna com tipo de dados TIMESTAMPTZ. É preciso criar essa coluna na instrução CREATE TABLE. Colunas com carimbos de data/hora de commit são válidos, assim como colunas geradas. No entanto, não é possível especifique uma coluna gerada que faça referência a uma coluna de carimbo de data/hora de confirmação.

  • interval_spec é o número de dias após a carimbo de data/hora no timestamp_column_name em que a linha está marcada exclusão. O valor deve ser um número inteiro não negativo e deve avaliar para um número inteiro de dias. Por exemplo, '3 days' é permitido, mas '3 days - 2 minutes' retorna um erro.

Para adicionar uma política a uma tabela atual, use a instrução ALTER TABLE. Um pode ter no máximo uma política de TTL. Adicionar uma política de TTL a uma tabela com uma política atual falhará com um erro. Consulte TTL em colunas geradas para especificar mais lógica de TTL sofisticada.

Para adicionar uma política a uma tabela:

ALTER TABLE albums
ADD COLUMN timestampcolumn TIMESTAMPTZ;

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

Restrições

As políticas de exclusão de linhas têm as restrições abaixo.

TTL em tabelas referenciadas por uma chave externa

Não é possível criar uma política de exclusão de linha:

  • Em uma tabela referenciada por um chave estrangeira que não inclui ON DELETE CASCADE.
  • no pai de uma tabela que é referenciada por uma chave externa que não incluir a ação referencial ON DELETE CASCADE.

No exemplo a seguir, não é possível adicionar uma política de exclusão de linhas ao Tabela Customers, porque é referenciada por uma chave externa no Orders que não tem a restrição ON DELETE CASCADE. Excluir clientes pode violar essa restrição de chave externa. Também não é possível Adicione uma política de exclusão de linhas à tabela Districts. Excluindo uma linha de Districts pode fazer com que as exclusões sejam em cascata na tabela filha Customers, que pode violar a restrição de chave externa na tabela 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)
);

É possível criar uma política de exclusão de linhas em uma tabela referenciada por uma entidade externa Restrição de chave que usa ON DELETE CASCADE. No exemplo a seguir, é possível crie uma política de exclusão de linhas na tabela Customers que é referenciada pelo a restrição de chave externa CustomerOrder, definida na tabela Orders. Quando O TTL exclui linhas em Customers e a exclusão é propagada em cascata para as linhas correspondentes que estão na tabela Orders.

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
);

Da mesma forma, você pode criar uma política de exclusão de linhas no pai de uma tabela que esteja referenciada por uma restrição de chave externa ON DELETE CASCADE.

TTL em colunas com valores padrão

Uma política de exclusão de linhas pode usar uma coluna de carimbo de data/hora com um valor padrão. Uma configuração típica o valor padrão é CURRENT_TIMESTAMP. Se nenhum valor for explicitamente atribuído coluna, ou se a coluna for definida com o valor padrão por um INSERT ou UPDATE, o valor padrão será usado no cálculo da regra.

No exemplo a seguir, o valor padrão para a coluna CreatedAt na tabela Customers é o carimbo de data/hora em que a linha é criada.

GoogleSQL

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

Para mais informações, consulte DEFAULT (expression) em "Linguagem de definição de dados GoogleSQL".

PostgreSQL

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

Para mais informações, consulte CRIAR TABELA. em "Linguagem de definição de dados PostgreSQL".

TTL em colunas geradas

As políticas de exclusão de linhas podem usar colunas geradas. para expressar regras mais sofisticadas. Por exemplo, defina uma exclusão de linha política no carimbo de data/hora greatest (GoogleSQL ou PostgreSQL) de várias colunas, ou associe outro valor a uma carimbo de data/hora.

GoogleSQL

A tabela a seguir, chamada Orders, rastreia os pedidos de venda. O proprietário da tabela quer configurar uma política de exclusão de linha que exclua pedidos cancelados após 30 dias e pedidos não cancelados após 180 dias.

O TTL do Spanner só permite uma política de exclusão de linha por tabela. Para expressar os dois critérios em uma única coluna, é possível usar uma coluna gerada com uma instrução 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));

A instrução cria uma coluna chamada ExpiredDate que adiciona 30 dias ou 180 dias ao LastModifiedDate, dependendo do status do pedido. Depois, define a política de exclusão de linhas para expirar linhas no dia armazenado no coluna ExpiredDate especificando INTERVAL 0 day.

PostgreSQL

A tabela a seguir, chamada Orders, rastreia os pedidos de venda. O proprietário da tabela quer configurar uma política de exclusão de linhas após 30 dias de inatividade.

O TTL do Spanner só permite uma política de exclusão de linha por tabela. Para expressar os dois critérios em uma única coluna, é possível criar um coluna:

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;

A instrução cria uma coluna gerada chamada ExpiredDate que avalia a mais recente das duas datas (LastModifiedDate ou CreateDate). Em seguida, ele define que a política de exclusão de linhas expire 30 dias após a ou se o pedido tiver sido modificado nesses 30 dias, a exclusão será estendida por mais 30 dias.

TTL e tabelas intercaladas

Tabelas intercaladas são uma otimização de desempenho que associa linhas relacionadas em uma tabela filha de um para muitos a uma linha em uma tabela pai. Para adicionar uma política de exclusão de linha em uma tabela pai, todas as tabelas filhas intercaladas precisam especificar ON DELETE CASCADE. Isso significa que as linhas filhas serão excluídas atomicamente com a linha pai. Isso garante a integridade referencial para que a exclusão na tabela pai também exclua as linhas filhas relacionadas na mesma transação. O TTL do Spanner não é compatível com ON DELETE NO ACTION.

Tamanho máximo da transação

O Spanner tem um limite de tamanho de transação. Fazer exclusões em cascata em grandes hierarquias pai-filho com colunas indexadas pode exceder esses limites e causar a falha de uma ou mais operações TTL. Para operações com falha, o TTL tentará novamente com lotes menores, até uma única linha mãe. No entanto, hierarquias filhas grandes até mesmo em uma única linha mãe ainda podem exceder o limite de mutação.

As operações com falha são informadas em Métricas de TTL.

Se uma única linha e seus filhos intercalados forem muito grandes para serem excluídos, será possível anexar uma política de exclusão de linhas diretamente nas tabelas filhas, além das uma na tabela pai. A política em tabelas filhas precisa ser configurada para que as linhas filhas sejam excluídas antes das linhas pai.

Considere anexar uma política de exclusão de linha a tabelas filhas quando as duas seguintes instruções se aplicarem:

  • A tabela filha tem índices globais associados a ela. e
  • Você espera um grande número de mais de (100) linhas filhas por linha pai.

Excluir uma política de exclusão de linhas

É possível descartar uma política de exclusão de linha existente de uma tabela. Isso retornará um erro se não houver uma política de exclusão de linha na tabela.

GoogleSQL

ALTER TABLE MyTable
DROP ROW DELETION POLICY;

PostgreSQL

ALTER TABLE mytable
DROP TTL;

A exclusão de uma política de exclusão de linha cancela imediatamente todos os processos de TTL em execução em segundo plano. Todas as linhas já excluídas pelos processos em andamento permanecem excluídas.

Excluir uma coluna referenciada por uma política de exclusão de linhas

O Spanner não permite excluir uma coluna referenciada por uma política de exclusão de linhas. Primeiro, é preciso excluir a política de exclusão de linha antes de excluir a coluna.

Ver a política de exclusão de linhas de uma tabela

É possível consultar as políticas de exclusão de linhas das tabelas do Spanner.

GoogleSQL

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

Para mais informações, consulte Esquema de informações para bancos de dados do dialeto GoogleSQL.

PostgreSQL

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

Para mais informações, consulte Esquema de informações para bancos de dados de dialeto PostgreSQL.

Modificar uma política de exclusão de linhas

É possível alterar a coluna ou a expressão de intervalo de uma política de exclusão de linha existente. O exemplo a seguir muda a coluna de CreatedAt para ModifiedAt e estende o intervalo de 1 DAY a 7 DAY. Isso retorna uma se não houver uma política de exclusão de linhas na tabela.

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;