Operações DDL acidentais, como DROP TABLE, podem causar perda de dados por não permitirem rollback. Para mitigar esse risco, a Alibaba Cloud oferece o recurso de lixeira. Ele move temporariamente as tabelas excluídas para uma lixeira, permite configurar um período de retenção para facilitar a recuperação de dados e inclui o pacote DBMS_RECYCLE para gerenciamento.
Pré-requisitos
Sua instância deve executar uma das seguintes versões:
RDS for MySQL 8.4
RDS for MySQL 8.0 com versão secundária do mecanismo 20191225 ou posterior
RDS for MySQL 5.7 com versão secundária do mecanismo 20210430 ou posterior
Parâmetros da lixeira
O recurso de lixeira possui cinco parâmetros:
|
Parâmetro |
Descrição |
|
loose_recycle_bin |
Defina se o recurso de lixeira será ativado nos níveis de sessão e global. Modifique esse parâmetro no console. Valor padrão: OFF. |
|
loose_recycle_bin_retention |
Especifique o período de retenção, em segundos, das tabelas na lixeira. O padrão é 604.800 (uma semana). Modifique esse parâmetro no console. |
|
loose_recycle_scheduler |
Controla a ativação do thread de limpeza assíncrona da lixeira. Modifique esse parâmetro no console. Valor padrão: OFF. |
|
loose_recycle_scheduler_interval |
Intervalo de verificação do thread de limpeza assíncrona, em segundos. O valor padrão é 30. Este parâmetro não pode ser modificado. |
|
loose_recycle_scheduler_purge_table_print |
Indica se logs detalhados das operações de limpeza assíncrona devem ser impressos. Valor padrão: OFF. Não é possível alterar este parâmetro. |
Para evitar o esgotamento do espaço em disco, defina um período de retenção adequado e ative o thread de limpeza em segundo plano.
Funcionamento
-
Mecanismo de reciclagem e limpeza
-
Mecanismo de reciclagem
Uma instrução
TRUNCATE TABLEmove a tabela original para um diretório dedicado da lixeira e cria uma nova tabela com a mesma estrutura em seu lugar.NotaEsse recurso é suportado apenas nas seguintes versões:
RDS for MySQL 8.4
RDS for MySQL 8.0 com versão secundária do mecanismo 20200331 ou posterior
Uma instrução
DROP TABLEouDROP DATABASEmove apenas os objetos de tabela relacionados para um diretório dedicado da lixeira. Outros objetos são tratados da seguinte forma:A operação não recicla objetos não relacionados à tabela. Eles são mantidos ou excluídos conforme a instrução específica da operação.
A operação exclui objetos dependentes que podem modificar dados da tabela, como gatilhos e chaves estrangeiras. No entanto, estatísticas de colunas não são limpas; elas são movidas para a lixeira junto com a tabela.
-
Mecanismo de limpeza
A lixeira inicia um thread em segundo plano para limpar de forma assíncrona os objetos de tabela que excederam o período de retenção definido pelo parâmetro loose_recycle_bin_retention. Caso a limpeza encontre uma tabela grande, outro thread em segundo plano é iniciado para excluir essa tabela assincronamente.
-
-
Permissões
Ao iniciar uma instância RDS for MySQL, o sistema inicializa um banco de dados chamado
__recycle_bin__, usado exclusivamente pela lixeira. O__recycle_bin__é um banco de dados de sistema que você não pode modificar ou excluir diretamente.Embora não seja possível executar diretamente uma instrução
drop tablenas tabelas da lixeira, utilize o comandocall dbms_recycle.purge_table('<TABLE>');para limpá-las.NotaA conta requer a permissão
DROPtanto na tabela original quanto na tabela presente na lixeira. -
Convenção de nomenclatura de tabelas na lixeira
A lixeira consolida tabelas de diferentes bancos de dados no único banco
__recycle_bin__. Para garantir nomes únicos, a lixeira utiliza o seguinte formato:"__" + <Storage Engine> + <SE private id>A tabela a seguir descreve os componentes do formato de nomenclatura.
Parâmetro
Descrição
Storage engine
Nome do mecanismo de armazenamento.
SE private id
ID exclusivo gerado pelo mecanismo de armazenamento para cada tabela. No mecanismo InnoDB, por exemplo, corresponde ao ID da tabela.
-
Reciclagem independente
As configurações da lixeira afetam apenas a instância local e não se propagam para nós com replicação de log ativada, como instâncias secundárias, somente leitura e de recuperação de desastres. Por exemplo, configure um período de retenção de 7 dias na instância primária e de 14 dias na secundária.
NotaPeríodos de retenção diferentes podem resultar em diferenças significativas no uso de espaço em disco entre as instâncias.
Se o banco de dados da lixeira e a tabela a ser reciclada estiverem em sistemas de arquivos diferentes, a execução de uma instrução
drop tableiniciará uma migração de arquivo de dados que pode ser demorada.Quando uma tabela compartilha um tablespace geral com outras tabelas, a reciclagem dessa tabela não move o arquivo de dados relacionado.
-
Visualize tabelas na lixeira
Para visualizar todas as tabelas na lixeira, execute o seguinte comando do pacote
DBMS_RECYCLE:call dbms_recycle.show_tables();Exemplo:
mysql> call dbms_recycle.show_tables(); +-----------------+---------------+---------------+--------------+---------------------+---------------------+ | 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)Parâmetro
Descrição
SCHEMA
Nome do banco de dados da lixeira.
TABLE
Nome da tabela na lixeira.
ORIGIN_SCHEMA
Nome original do banco de dados.
ORIGIN_TABLE
Nome original da tabela.
RECYCLED_TIME
Momento em que a tabela foi movida para a lixeira.
PURGE_TIME
Horário programado para a limpeza da tabela na lixeira.
-
Limpar manualmente uma tabela da lixeira
Para limpar manualmente uma tabela da lixeira, execute o seguinte comando do pacote
DBMS_RECYCLE:call dbms_recycle.purge_table('<TABLE>');Nota<TABLE>é o nome da tabela na lixeira.A conta precisa ter a permissão
DROPtanto na tabela original quanto na tabela da lixeira.
Exemplo:
call dbms_recycle.purge_table('__innodb_1063'); -
Restaurar uma tabela da lixeira
-
Para restaurar uma tabela da lixeira, utilize a interface fornecida pelo pacote
DBMS_RECYCLE.Execute o seguinte comando:
call dbms_recycle.restore_table('<RECYCLE_TABLE>','<DEST_DB>','<DEST_TABLE>');A tabela a seguir descreve os parâmetros.
Parâmetro
Descrição
RECYCLE_TABLE
Nome da tabela na lixeira a ser restaurada.
NotaSe apenas este parâmetro for especificado, a tabela será restaurada em seu local original com o nome original.
DEST_DB
Nome do banco de dados de destino.
DEST_TABLE
Nome da tabela de destino.
NotaO comando
restore_tableexige a permissãoSUPER. Como as contas de usuário não possuem essa permissão, não é possível executar esse comando manualmente.Exemplo:
mysql> call dbms_recycle.restore_table('__innodb_1063','testDB','testTable'); -
Restaurar dados de uma tabela na lixeira usando
INSERT ... SELECT.Primeiro, consulte todas as tabelas na lixeira para encontrar o nome da tabela que deseja restaurar no banco de dados
__recycle_bin__. Em seguida, crie uma tabela de destino com a mesma estrutura e use uma instruçãoINSERT ... SELECTpara importar os dados para a tabela de destino. Por exemplo:mysql> call dbms_recycle.show_tables(); +-----------------+---------------+---------------+--------------+---------------------+---------------------+ | SCHEMA | TABLE | ORIGIN_SCHEMA | ORIGIN_TABLE | RECYCLED_TIME | PURGE_TIME | +-----------------+---------------+---------------+--------------+---------------------+---------------------+ | __recycle_bin__ | __innodb_1132 | sbtest | sbtest1 | 2024-07-31 15:08:56 | 2024-08-07 15:08:56 | +-----------------+---------------+---------------+--------------+---------------------+---------------------+ 1 row in set (0.00 sec) mysql> CREATE TABLE `db1`.`t1` ( -> `id` int NOT NULL AUTO_INCREMENT, -> `k` int NOT NULL DEFAULT '0', -> `c` char(120) NOT NULL DEFAULT '', -> `pad` char(60) NOT NULL DEFAULT '', -> PRIMARY KEY (`id`), -> KEY `k_1` (`k`) -> ) ENGINE=InnoDB AUTO_INCREMENT=400001 DEFAULT CHARSET=utf8mb3; Query OK, 0 rows affected, 1 warning (0.01 sec) mysql> insert into `db1`.`t1` select * from `__recycle_bin__`.`__innodb_1132`; Query OK, 400000 rows affected (2.76 sec) Records: 400000 Duplicates: 0 Warnings: 0
-
Observações de uso
Gerencie a lixeira
O AliSQL fornece três funções no pacote DBMS_RECYCLE para gerenciar a lixeira: