Nesta página, você vai aprender a usar o time to live (TTL) em tabelas do Spanner em bancos de dados com dialetos do GoogleSQL e do PostgreSQL. Para mais informações, consulte Sobre o TTL.
Antes de começar
Antes de começar, siga estas práticas recomendadas.
Ativar o backup e a recuperação pontual
Antes de adicionar TTL à sua tabela, recomendamos ativar o backup e restauração do Spanner. Isso permite restaurar totalmente um banco de dados caso você exclua acidentalmente os dados com 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 do período de armazenamento de versão configurado. 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ê usa o TTL e espera que a primeira execução exclua muitas linhas, primeiro limpe manualmente os dados antigos usando a DML particionada. Isso proporciona mais controle sobre o uso de recursos, em vez de deixá-lo de fora do processo de TTL em segundo plano. O TTL é executado com uma prioridade baixa, ideal para uma limpeza incremental. No entanto, isso provavelmente aumenta o tempo necessário para excluir o conjunto inicial de linhas em um banco de dados ocupado porque o programador de trabalho interno do Spanner prioriza outro trabalho, como consultas de usuários.
Verificar suas condições
Para tabelas do GoogleSQL, se você quiser verificar os dados que a política de exclusão de linha afeta antes de ativar o TTL, consulte a 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 mudar o esquema do banco de dados, é necessário ter a permissão spanner.databases.updateDdl. Para mais detalhes, consulte Controle de acesso do Spanner.
Criar uma política de exclusão de linha
GoogleSQL
Para criar uma política de exclusão de linha usando o GoogleSQL, defina uma cláusula ROW DELETION POLICY ao criar uma tabela ou adicione uma política a 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, faça o seguinte:
CREATE TABLE MyTable(
Key INT64,
CreatedAt TIMESTAMP,
) PRIMARY KEY (Key),
ROW DELETION POLICY (OLDER_THAN(timestamp_column, INTERVAL num_days DAY));
Substitua:
timestamp_columnprecisa ser uma coluna existente com o tipoTIMESTAMP. Colunas com carimbos de data/hora de confirmação são válidas, assim como as colunas geradas. No entanto, não é possível especificar 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 o carimbo de data/hora emtimestamp_columnem que a linha está marcada para exclusão. O valor precisa ser um número inteiro não negativo, eDAYé a única unidade compatível.
Para adicionar uma política a uma tabela atual, use a instrução ALTER TABLE. Uma tabela pode ter no máximo uma política de exclusão de linha. A adição de uma política de exclusão de linha a uma tabela com uma política atual falha 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 linha usando o PostgreSQL, defina uma cláusula TTL INTERVAL ao criar uma tabela ou adicione uma política a uma tabela atual.
Para adicionar uma política no momento da criação da tabela, faça o seguinte:
CREATE TABLE mytable (
key bigint NOT NULL,
timestamp_column_name TIMESTAMPTZ,
PRIMARY KEY(key)
) TTL INTERVAL interval_specvar> ON timestamp_column_name;
Substitua:
timestamp_column_nameprecisa ser uma coluna com o tipo de dadosTIMESTAMPTZ. É necessário criar essa coluna na instruçãoCREATE TABLE. Colunas com carimbos de data/hora de confirmação são válidas, assim como as colunas geradas. No entanto, não é possível especificar 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 o carimbo de data/hora emtimestamp_column_nameem que a linha está marcada para exclusão. O valor precisa ser um número inteiro não negativo e resultar em 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. Uma tabela pode ter no máximo uma política de TTL. A adição de uma política de TTL a uma tabela com uma política atual falha com um erro. Consulte TTL nas colunas geradas para especificar uma lógica de TTL mais sofisticada.
Para adicionar uma política a uma tabela atual, faça o seguinte:
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 seguintes restrições.
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 uma
chave estrangeira que não inclui a restrição
ON DELETE CASCADE. - No pai de uma tabela referenciada por uma chave externa que não inclui a ação referencial ON DELETE CASCADE.
No exemplo a seguir, não é possível adicionar uma política de exclusão de linha à tabela Customers porque ela é referenciada por uma chave externa na tabela Orders, que não tem a restrição ON DELETE CASCADE.
A exclusão de clientes pode violar essa restrição de chave externa. Também não é possível adicionar uma política de exclusão de linha à tabela Districts. A exclusão de uma linha de Districts pode causar exclusões em cascata na tabela filha Customers, o 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 linha em uma tabela referenciada por uma restrição de chave estrangeira que usa ON DELETE CASCADE. No exemplo a seguir, é possível criar uma política de exclusão de linha na tabela Customers, que é referenciada pela restrição chave externa CustomerOrder, definida na tabela Orders. Quando o TTL exclui linhas em Customers, a exclusão é propagada para linhas correspondentes 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, é possível criar uma política de exclusão de linha em um pai de uma tabela referenciada por uma restrição 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. Um valor padrão típico é CURRENT_TIMESTAMP. Se nenhum valor for atribuído explicitamente à coluna ou se ela for definida como o valor padrão por uma instrução INSERT ou UPDATE, o valor padrão será usado no cálculo da regra.
No exemplo a seguir, o valor padrão da 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 (expressão).
PostgreSQL
CREATE TABLE customers (
customerid bigint NOT NULL,
createdat timestamptz DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY(customerid)
);
Para mais informações, consulte CREATE TABLE.
TTL em colunas geradas
As políticas de exclusão de linhas podem usar colunas geradas
para expressar regras mais sofisticadas. Por exemplo, é possível definir uma política de exclusão de linha no carimbo de data/hora greatest (GoogleSQL ou PostgreSQL) de várias colunas ou mapear outro valor para um carimbo de data/hora.
GoogleSQL
A tabela a seguir, chamada Orders, rastreia 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 permite apenas uma política de exclusão de linha por tabela. Para expressar os dois critérios em uma única coluna, use 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. Em seguida, ele define a política de exclusão de linha para expirar as linhas no dia armazenadas na coluna ExpiredDate especificando INTERVAL 0 day.
PostgreSQL
A tabela a seguir, chamada Orders, rastreia pedidos de venda.
O proprietário da tabela quer configurar uma política de exclusão de linha que exclua linhas após 30 dias de inatividade.
O TTL do Spanner permite apenas uma política de exclusão de linha por tabela. Para expressar os dois critérios em uma única coluna, crie uma coluna gerada:
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, ela define a política de exclusão de linha para expirar as linhas 30 dias após a
criação do pedido. Se o pedido for modificado dentro desses 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 mãe, todas as tabelas filhas intercaladas precisam especificar ON DELETE CASCADE. Isso significa que as linhas filhas serão excluídas atomicamente com a linha mãe. 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. A exclusão em cascata em grandes hierarquias pai-filho com colunas indexadas pode exceder esses limites e causar falha em uma ou mais operações TTL. Para operações com falha, o TTL tenta 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, é possível anexar uma política de exclusão de linha diretamente nas tabelas filhas, além da tabela mãe. A política em tabelas filhas precisa ser configurada para que linhas filhas sejam excluídas antes das linhas mãe.
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 linha
É 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 linha
O Spanner não permite excluir uma coluna referenciada por uma política de exclusão de linha. Primeiro, é preciso excluir a política de exclusão de linha antes de excluir a coluna.
Ver a política de exclusão de linha de uma tabela
É possível conferir as políticas de exclusão de linhas das suas 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 Information schema para bancos de dados do dialeto PostgreSQL.
Modificar uma política de exclusão de linha
É 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 alterna a coluna de CreatedAt para
ModifiedAt e estende o intervalo de 1 DAY para 7 DAY. Isso retornará um erro se não houver uma política de exclusão de linha 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;