Proteção contra soltar objetos de esquema

Esta página descreve como proteger objetos de esquema, como tabelas, índices e colunas, contra exclusão acidental.

Entender a segurança de exclusão de objetos de esquema

A proteção contra exclusão de objetos de esquema do Spanner depende das estatísticas de acesso a objetos de esquema para determinar se um objeto pode ser excluído com segurança. Se o sistema determinar que o objeto não é seguro, ele vai rejeitar a solicitação do usuário para excluir o objeto de esquema. A exclusão de um objeto desse tipo pode causar falhas em jobs de clientes que ainda acessam o objeto. Além disso, restaurar um objeto excluído sem perda de dados é muito difícil ou impossível.

Para isso, o Spanner rastreia estatísticas de acesso para cada objeto de esquema. Esse acesso inclui inserções, atualizações ou exclusões de DML, consultas SQL, gravações de API e leituras de API. Usando essas estatísticas de acesso, o Spanner determina se um objeto de esquema ainda pode estar em uso. Se um objeto foi acessado recentemente, é provável que ele ainda esteja em uso.

Ativar a proteção contra exclusão de objetos de esquema

Para ativar a proteção contra exclusão, defina a duração da inatividade para um valor diferente de zero, como "24h" ou "2d". A duração mínima é "0s" e a máxima é "7d". Defina a duração da inatividade como "24h" ou mais.

Se você definir a duração da inatividade como "24h", poderá excluir um objeto de esquema somente se ele não tiver sido acessado nas últimas 24 horas.

GoogleSQL

Para mais informações, consulte ALTER DATABASE.

gcloud spanner databases ddl update DATABASE_NAME \
--instance=INSTANCE_ID \
--ddl='ALTER DATABASE `DATABASE_NAME` SET OPTIONS ( schema_drop_protection_inactivity_period="DURATION" )'

Substitua:

  • DATABASE_NAME: o nome do banco de dados.
  • INSTANCE_ID: o identificador da instância do banco de dados.
  • DURATION: entre "0s" (inclusive) e "7d" (inclusive). Recomendado: "24h".

PostgreSQL

Para mais informações, consulte ALTER DATABASE.

gcloud spanner databases ddl update DATABASE_NAME \
--instance=INSTANCE_ID \
--ddl='ALTER DATABASE `DATABASE_NAME" SET spanner.schema_drop_protection_inactivity_period="DURATION" '

Substitua:

  • DATABASE_NAME: o nome do banco de dados.
  • INSTANCE_ID: o identificador da instância do banco de dados.
  • DURATION: entre "0s" (inclusive) e "7d" (inclusive). Recomendado: "24h".

Desativar a proteção contra exclusão de objetos de esquema

Para desativar a proteção contra exclusão, defina a duração da inatividade como um valor de duração zero, "0s", ou defina o valor da opção como nulo.

GoogleSQL

Para mais informações, consulte ALTER DATABASE.

gcloud spanner databases ddl update DATABASE_NAME \
--instance=INSTANCE_ID \
--ddl='ALTER DATABASE `DATABASE_NAME` SET OPTIONS ( schema_drop_protection_inactivity_period=null )'

Substitua:

  • DATABASE_NAME: o nome do banco de dados.
  • INSTANCE_ID: o identificador da instância do banco de dados.

PostgreSQL

Para mais informações, consulte ALTER DATABASE.

gcloud spanner databases ddl update DATABASE_NAME \
--instance=INSTANCE_ID \
--ddl='ALTER DATABASE `DATABASE_NAME` SET spanner.schema_drop_protection_inactivity_period=null'

Substitua:

  • DATABASE_NAME: o nome do banco de dados.
  • INSTANCE_ID: o identificador da instância do banco de dados.

Advertências

A proteção contra exclusão de objetos de esquema não é ativada nestes casos:

  1. Você criou o banco de dados na última hora.
  2. O objeto tem acessos de leitura de baixa frequência (menos de 10 por hora).
  3. Você criou o objeto de esquema dentro da duração da inatividade. Isso significa que, se um objeto de esquema foi criado mais recentemente do que a duração especificada em schema_drop_protection_inactivity_period, ele não estará protegido contra exclusão. Por exemplo, se schema_drop_protection_inactivity_period for 7d, qualquer tabela criada nos últimos 7 dias poderá ser excluída, mesmo que tenha sido acessada recentemente.

    Esse comportamento facilita os testes: se a proteção fosse aplicada a objetos criados recentemente, você não conseguiria criar, testar e excluir imediatamente uma tabela temporária. Em vez disso, seria necessário esperar 7 dias para que o período de inatividade terminasse antes que a limpeza fosse possível.

O limite de acesso de leitura padrão é de 10 por hora, mas você pode substituir o padrão usando a seguinte opção de banco de dados:

GoogleSQL

Para mais informações, consulte ALTER DATABASE.

gcloud spanner databases ddl update DATABASE_NAME \
--instance=INSTANCE_ID \
--ddl='ALTER DATABASE `DATABASE_NAME` SET OPTIONS ( schema_drop_protection_usage_lowerbound=<threshold> )'

PostgreSQL

Para mais informações, consulte ALTER DATABASE.

gcloud spanner databases ddl update DATABASE_NAME \
--instance=INSTANCE_ID \
--ddl='ALTER DATABASE `DATABASE_NAME` SET spanner.schema_drop_protection_usage_lowerbound=<threshold> '

As estatísticas de acesso não são coletadas para os seguintes casos:

  1. Os acessos com falha (consultas, DML etc.) não são contabilizados para o acesso do usuário.
  2. Os acessos do sistema não são contabilizados.
  3. Os acessos de gravação (incluindo inserções e atualizações de DML) são ignorados para índices.
  4. Os acessos de gravação são ignorados para colunas geradas armazenadas.

Solução de problemas

Se um objeto de esquema não puder ser excluído e você não conseguir identificar o que está acessando, consulte o seguinte:

A seguir

Saiba como impedir a exclusão do banco de dados.