Todos os produtos
Search
Central de documentação

ApsaraDB RDS:Lixeira

Última atualização: Jun 26, 2026

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.

Importante

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 TABLE move a tabela original para um diretório dedicado da lixeira e cria uma nova tabela com a mesma estrutura em seu lugar.

      Nota

      Esse 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 TABLE ou DROP DATABASE move 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 table nas tabelas da lixeira, utilize o comando call dbms_recycle.purge_table('<TABLE>'); para limpá-las.

    Nota

    A conta requer a permissão DROP tanto 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.

    Nota

    Períodos de retenção diferentes podem resultar em diferenças significativas no uso de espaço em disco entre as instâncias.

  • Observações de uso

    • 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 table iniciará 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.

    Gerencie a lixeira

    O AliSQL fornece três funções no pacote DBMS_RECYCLE para gerenciar a lixeira:

    • 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 DROP tanto 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.

        Nota

        Se 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.

        Nota

        O comando restore_table exige a permissão SUPER. 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ção INSERT ... SELECT para 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