Instruções DDL como DROP TABLE e DROP DATABASE não podem ser revertidas. Portanto, a exclusão acidental de tabelas pode causar perda permanente de dados. A lixeira de tabelas intercepta essas operações e move as tabelas excluídas para uma área de retenção segura, o que permite recuperá-las antes da remoção definitiva.
A lixeira de tabelas consome capacidade de armazenamento do cluster, o que gera custos. Defina o período de retenção conforme suas necessidades de recuperação para evitar despesas desnecessárias.
Pré-requisitos
Antes de começar, verifique se o cluster executa uma das seguintes versões de mecanismo. Para consultar a versão, veja Versões do mecanismo.
PolarDB for MySQL 8.0.1 com versão de revisão 8.0.1.1.2 ou posterior
PolarDB for MySQL 8.0.2 com versão de revisão 8.0.2.1.0 ou posterior
Como funciona
Ao executar DROP TABLE ou DROP DATABASE, o PolarDB intercepta a operação e move os objetos da tabela para o banco de dados de sistema __recycle_bin__, em vez de excluí-los permanentemente. Esse processo segue o comportamento abaixo:
Triggers e chaves estrangeiras são excluídos e não reciclados.
Estatísticas de colunas são movidas para a lixeira junto com a tabela.
Objetos não relacionados à tabela excluída não são reciclados. A retenção depende da instrução específica executada.
Para evitar conflitos de nomes quando tabelas de diferentes bancos de dados são movidas para o mesmo banco de dados __recycle_bin__, o PolarDB renomeia cada tabela reciclada usando o seguinte formato:
"__" + <storage engine name> + <SE private ID>
No InnoDB, o SE private ID corresponde ao table_id. Por exemplo, uma tabela InnoDB reciclada pode receber o nome __innodb_1063.
A remoção definitiva ocorre automaticamente em segundo plano. Um thread em background remove de forma assíncrona as tabelas que permanecem na lixeira além do período definido por loose_recycle_bin_retention. Para tabelas grandes, um thread separado gerencia a limpeza para evitar o bloqueio de outras operações.
Reciclagem independente: nós primários e nós somente leitura mantêm lixeiras separadas, com períodos de retenção independentes. É possível configurar, por exemplo, 7 dias de retenção para o nó primário e 14 dias para os nós somente leitura.
Considerações
Na inicialização de um cluster PolarDB, um banco de dados chamado
__recycle_bin__é criado como banco de dados da lixeira. O banco de dados__recycle_bin__é um banco de dados de sistema e não pode ser modificado ou excluído.Não execute
DROP TABLEdiretamente nas tabelas da lixeira. Usecall dbms_recycle.purge_table('table_name')para remover manualmente uma tabela específica.Para remover tabelas definitivamente, sua conta precisa ter a permissão DROP tanto nas tabelas originais quanto nas tabelas da lixeira.
Se o banco de dados
__recycle_bin__e as tabelas a serem recicladas estiverem em sistemas de arquivos diferentes, a instruçãoDROP TABLEmoverá arquivos entre tablespaces, o que pode consumir bastante tempo.Caso as tabelas a reciclar estejam em um tablespace geral que armazena múltiplas tabelas, apenas os dados da tabela individual serão reciclados; os arquivos do tablespace não serão movidos.
Faturamento
A lixeira de tabelas utiliza a capacidade de armazenamento do cluster, gerando custos. Para detalhes sobre preços, consulte Regras de faturamento para armazenamento.
Ativar a lixeira de tabelas
Configure os parâmetros a seguir para ativar e ajustar a lixeira de tabelas.
|
Parâmetro |
Escopo |
Padrão |
Valores válidos |
Descrição |
|
|
Global e sessão |
OFF |
ON, OFF |
Ativa ou desativa a lixeira de tabelas. |
|
|
Global |
OFF |
ON, OFF |
Controla o thread em background responsável pela remoção automática de tabelas após o período de retenção. Quando definido como OFF, o parâmetro |
|
|
Global |
604800 (7 dias) |
86400–1209600 (segundos) |
Período máximo de retenção dos dados na lixeira. 604800 equivale a 7 dias; 1209600 equivale a 14 dias. Este parâmetro só tem efeito quando |
Ative tantoloose_recycle_binquantoloose_recycle_schedulerpara garantir a remoção automática das tabelas após o período de retenção. Sem a limpeza automática ativada, os dados reciclados se acumulam e geram custos contínuos de armazenamento.
Gerenciar tabelas na lixeira
O PolarDB oferece três stored procedures no pacote dbms_recycle para gerenciar tabelas recicladas.
Listar tabelas na lixeira
Execute a instrução abaixo para visualizar todas as tabelas presentes na lixeira:
call dbms_recycle.show_tables();
Exemplo de saída:
+-----------------+---------------+---------------+--------------+---------------------+---------------------+
| SCHEMA | TABLE | ORIGIN_SCHEMA | ORIGIN_TABLE | RECYCLED_TIME | PURGE_TIME |
+-----------------+---------------+---------------+--------------+---------------------+---------------------+
| __recycle_bin__ | __innodb_1063 | product_db | t1 | 2019-08-08 11:01:46 | 2019-08-15 11:01:46 |
| __recycle_bin__ | __innodb_1064 | product_db | t2 | 2019-08-08 11:01:46 | 2019-08-15 11:01:46 |
| __recycle_bin__ | __innodb_1065 | product_db | parent | 2019-08-08 11:01:46 | 2019-08-15 11:01:46 |
| __recycle_bin__ | __innodb_1066 | product_db | child | 2019-08-08 11:01:46 | 2019-08-15 11:01:46 |
+-----------------+---------------+---------------+--------------+---------------------+---------------------+
4 rows in set (0.00 sec)
As colunas da saída são:
|
Coluna |
Descrição |
|
|
Schema da lixeira ( |
|
|
Nome renomeado da tabela conforme aparece na lixeira. |
|
|
Schema original ao qual a tabela pertencia antes da exclusão. |
|
|
Nome original da tabela. |
|
|
Momento em que a tabela foi movida para a lixeira. |
|
|
Estimativa de quando a tabela será removida automaticamente. |
Restaurar uma tabela da lixeira
Execute a instrução a seguir para restaurar uma tabela reciclada para um banco de dados e nome de tabela específicos:
call dbms_recycle.restore_table('RECYCLE_TABLE', 'DEST_DB', 'DEST_TABLE');
|
Parâmetro |
Descrição |
|
|
Nome da tabela na lixeira (por exemplo, |
|
|
Banco de dados de destino. |
|
|
Novo nome para a tabela restaurada. |
Exemplo: restaure __innodb_1063 no banco de dados testDB com o nome testTable:
call dbms_recycle.restore_table('__innodb_1063', 'testDB', 'testTable');
O procedimentorestore_tabletem suporte apenas no PolarDB for MySQL 8.0 Cluster Edition com versão de revisão 8.0.1.1.12 ou posterior. Para verificar sua versão, consulte Consultar a versão do mecanismo . Sua conta deve ter as permissões ALTER_ACL e DROP_ACL no banco de dados__recycle_bin__, além das permissões CREATE_ACL e INSERT_ACL na tabela de destino.
Remover uma tabela da lixeira
Execute a instrução abaixo para excluir permanentemente uma tabela específica da lixeira antes do fim do período de retenção:
call dbms_recycle.purge_table('TABLE_NAME');
TABLE_NAME refere-se ao nome da tabela conforme exibido na lixeira (não ao nome original da tabela).
Exemplo: exclua permanentemente __innodb_1063:
call dbms_recycle.purge_table('__innodb_1063');
Sua conta precisa ter a permissão DROP tanto na tabela original quanto na tabela presente na lixeira.
Próximos passos
Em caso de dúvidas sobre operações DDL, entre em contato conosco.