Todos os produtos
Search
Central de documentação

ApsaraDB RDS:Lixeira

Última atualização: Oct 09, 2026

Operações DDL acidentais, como DROP TABLE, podem causar perda de dados, pois não é possível revertê-las. Para mitigar esse risco, a Alibaba Cloud oferece o recurso de lixeira. Esse recurso move temporariamente as tabelas excluídas para uma lixeira, defina 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 execute uma das seguintes versões:

  • RDS for MySQL 8.4

  • RDS for MySQL 8.0 com uma versão secundária do motor 20191225 ou posterior

  • RDS for MySQL 5.7 com uma versão secundária do motor 20210430 ou posterior

Parâmetros da lixeira

O recurso de lixeira possui cinco parâmetros:

Parâmetro

Descrição

loose_recycle_bin

Especifique se a lixeira é ative nos níveis de sessão e global. Modifique esse parâmetro no console. Valor padrão: OFF.

loose_recycle_bin_retention

Defina o período de retenção, em segundos, das tabelas na lixeira. O valor padrão é 604.800 (uma semana). Modifique esse parâmetro no console.

loose_recycle_scheduler

Especifique se a thread de purga assíncrona da lixeira é ative. Modifique esse parâmetro no console. Valor padrão: OFF.

loose_recycle_scheduler_interval

O intervalo de polling da thread de purga assíncrona, em segundos. O valor padrão é 30. Não modifique este parâmetro.

loose_recycle_scheduler_purge_table_print

Defina se o sistema registra logs detalhados das operações de purga assíncrona. Valor padrão: OFF. Não modifique este parâmetro.

Importante

Para evitar o esgotamento do espaço em disco, defina um período de retenção adequado e ative a thread de purga em segundo plano.

Como funciona

  • Mecanismo de reciclagem e purga

    • Mecanismo de reciclagem

      Uma instrução TRUNCATE TABLE move a tabela original para um diretório dedicado da lixeira e crie uma nova tabela com a mesma estrutura em seu lugar.

      Nota

      Este recurso é compatível apenas com as seguintes versões:

      • RDS for MySQL 8.4

      • RDS for MySQL 8.0 com uma versão secundária do motor 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. O sistema os mantém ou os exclua com base na instrução de operação específica.

      • A operação exclua objetos dependentes capazes de modifique os dados da tabela, como triggers e chaves estrangeiras. No entanto, ela não purga as estatísticas de coluna, mas as move para a lixeira junto com a tabela.

    • Mecanismo de purga

      A lixeira inicia uma thread em segundo plano para purgar assincronamente os objetos de tabela que excederam o período de retenção defina pelo parâmetro loose_recycle_bin_retention. Se a purga encontrar uma tabela grande, ela inicia outra thread em segundo plano para exclua a tabela de forma assíncrona.

    • Permissões

      Ao iniciar uma instância do RDS for MySQL, o sistema crie um banco de dados chamado __recycle_bin__, de uso exclusivo da lixeira. O __recycle_bin__ é um banco de dados do sistema, o qual você não pode modifique nem exclua diretamente.

      Embora não seja possível execute diretamente uma instrução drop table nas tabelas da lixeira, use o comando call dbms_recycle.purge_table('<TABLE>'); para purgá-las.

      Nota

      A conta requer a permissão DROP tanto na tabela original quanto na tabela da lixeira.

    • Convenção de nomenclatura de tabelas na lixeira

      A lixeira consolida tabelas de diferentes bancos de dados em um único banco de dados __recycle_bin__. Para garantir nomes exclusivos para as tabelas, a lixeira usa 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

      O nome do motor de armazenamento.

      SE private id

      Um ID exclusivo que o motor de armazenamento gera para cada tabela. Por exemplo, no motor InnoDB, este é o ID da tabela.

    • Reciclagem independente

      As configurações da lixeira afetam apenas a instância local. Elas não se propagam para nós com replicação de log ativada, como instâncias secundárias, instâncias somente leitura e instâncias de recuperação de desastres. Por exemplo, configure um período de retenção de 7 dias em uma instância primária e um período de retenção de 14 dias em uma instância secundária.

      Nota

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

    • Observações de uso

      • Se o banco de dados da lixeira e a tabela que será reciclada residirem em sistemas de arquivos diferentes, a execução de uma instrução drop table inicia uma migração de arquivo de dados que pode consumir muito tempo.

      • 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 gerencie a lixeira:

      • Visualize as tabelas na lixeira

        Para visualize todas as tabelas na lixeira, use 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

        O nome do banco de dados da lixeira.

        TABLE

        O nome da tabela na lixeira.

        ORIGIN_SCHEMA

        O nome original do banco de dados.

        ORIGIN_TABLE

        O nome original da tabela.

        RECYCLED_TIME

        A hora em que a tabela foi movida para a lixeira.

        PURGE_TIME

        A hora programada para a tabela ser purgada da lixeira.

      • Purgue manualmente uma tabela da lixeira

        Para purgar manualmente uma tabela da lixeira, use o seguinte comando do pacote DBMS_RECYCLE:

        call dbms_recycle.purge_table('<TABLE>');
        Nota
        • <TABLE> é o nome da tabela na lixeira.

        • A conta requer a permissão DROP tanto na tabela original quanto na tabela da lixeira.

        Exemplo:

        call dbms_recycle.purge_table('__innodb_1063');
      • Restaure uma tabela da lixeira

        • Para restaurar uma tabela da lixeira, use a interface fornecida pelo pacote DBMS_RECYCLE.

          O 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

          O nome da tabela na lixeira a ser restaurada.

          Nota

          Se você especificar apenas este parâmetro, a tabela será restaurada em seu local original com seu nome original.

          DEST_DB

          O nome do banco de dados de destino.

          DEST_TABLE

          O nome da tabela de destino.

          Nota

          O comando restore_table requer a permissão SUPER. Como as contas de usuário não têm essa permissão, não é possível execute esse comando manualmente.

          Exemplo:

          mysql> call dbms_recycle.restore_table('__innodb_1063','testDB','testTable');
        • Restaure dados de uma tabela na lixeira usando INSERT ... SELECT.

          Primeiro, selecione 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