すべてのプロダクト
Search
ドキュメントセンター

ApsaraDB RDS:ごみ箱

最終更新日:May 13, 2026

DROP TABLE のような誤った DDL 操作はロールバックできないため、データ損失を引き起こす可能性があります。このリスクを軽減するために、Alibaba Cloud はごみ箱機能を提供しています。この機能は、削除されたテーブルを一時的にごみ箱に移動し、データを容易に回復できるよう保持期間を設定できるほか、管理用に DBMS_RECYCLE パッケージも提供します。

前提条件

インスタンスが次のいずれかのバージョンで稼働していること:

  • RDS for MySQL 8.4

  • RDS for MySQL 8.0 (マイナーエンジンバージョンが 20191225 以降)

  • RDS for MySQL 5.7 (マイナーエンジンバージョンが 20210430 以降)

ごみ箱パラメータ

ごみ箱機能には 5 つのパラメータがあります:

パラメータ

説明

loose_recycle_bin

セッションレベルおよびグローバルレベルでごみ箱機能を有効にするかどうかを指定します。このパラメータはコンソールで変更できます。デフォルト値:OFF。

loose_recycle_bin_retention

ごみ箱内のテーブルの保持期間 (秒) を指定します。デフォルトは 604,800 (1 週間) です。このパラメータはコンソールで変更できます。

loose_recycle_scheduler

ごみ箱の非同期パージスレッドを有効にするかどうかを指定します。このパラメータはコンソールで変更できます。デフォルト値:OFF。

loose_recycle_scheduler_interval

非同期パージスレッドのポーリング間隔 (秒) です。デフォルト値は 30 です。このパラメータは変更できません。

loose_recycle_scheduler_purge_table_print

非同期パージ操作の詳細ログを出力するかどうかを指定します。デフォルト値:OFF。このパラメータは変更できません。

重要

ディスク容量の枯渇を防ぐために、適切な保持期間を設定し、バックグラウンドパージスレッドを有効にしてください。

仕組み

  • リサイクルおよびパージの仕組み

    • リサイクルの仕組み

      TRUNCATE TABLE ステートメントは、元のテーブルをごみ箱専用ディレクトリに移動し、同じ構造の新しいテーブルを元の場所に作成します。

      説明

      この機能は次のバージョンでのみサポートされています:

      • RDS for MySQL 8.4

      • RDS for MySQL 8.0 (マイナーエンジンバージョンが 20200331 以降)

      DROP TABLE または DROP DATABASE ステートメントは、関連するテーブルオブジェクトのみをごみ箱専用ディレクトリに移動します。その他のオブジェクトは、次のとおりに処理されます:

      • テーブルと無関係なオブジェクトはリサイクルされません。保持されるか削除されるかは、実行したステートメントによって異なります。

      • トリガーや外部キーなど、テーブルデータを変更できる依存オブジェクトは削除されます。一方、列統計情報はパージされず、テーブルとともにごみ箱に移動されます。

    • パージの仕組み

      ごみ箱はバックグラウンドスレッドを起動し、loose_recycle_bin_retention パラメータで設定された保持期間を超えたテーブルオブジェクトを非同期にパージします。パージ時に大きなテーブルが見つかった場合は、別のバックグラウンドスレッドを起動してテーブルを非同期に削除します。

  • 権限

    RDS for MySQL インスタンスの起動時に、ごみ箱専用の __recycle_bin__ というデータベースが初期化されます。__recycle_bin__ はシステムデータベースであり、直接変更または削除することはできません。

    ごみ箱内のテーブルに対して drop table ステートメントを直接実行することはできませんが、call dbms_recycle.purge_table('<TABLE>'); コマンドを使用してパージできます。

    説明

    アカウントには、元のテーブルとごみ箱内のテーブルの両方に対する DROP 権限が必要です。

  • ごみ箱内のテーブル命名規則

    ごみ箱は、異なるデータベースのテーブルを単一の __recycle_bin__ データベースに集約します。テーブル名の一意性を確保するために、ごみ箱は次の形式を使用します:

    "__" + <Storage Engine> + <SE private id>

    次の表では、命名形式の構成要素について説明します。

    パラメータ

    説明

    ストレージエンジン

    ストレージエンジンの名前です。

    SE private id

    ストレージエンジンが各テーブルに対して生成する一意の ID です。たとえば InnoDB エンジンでは、これはテーブル ID になります。

  • 独立したリサイクル

    ごみ箱の設定はローカルインスタンスにのみ適用されます。読み取り専用インスタンス、セカンダリインスタンス、災害復旧インスタンスなど、ログレプリケーションが有効なノードには反映されません。たとえば、プライマリインスタンスで 7 日間の保持期間を設定し、セカンダリインスタンスで 14 日間の保持期間を設定できます。

    説明

    保持期間が異なると、インスタンス間のディスク使用量に大きな差が生じる場合があります。

注意事項

  • ごみ箱データベースとリサイクル対象のテーブルが異なるファイルシステム上にある場合、drop table ステートメントを実行するとデータファイルの移行が開始され、時間がかかる可能性があります。

  • テーブルが他のテーブルと汎用表領域を共有している場合、そのテーブルをリサイクルしても関連するデータファイルは移動されません。

ごみ箱の管理

AliSQL は、ごみ箱を管理するために DBMS_RECYCLE パッケージに 3 つの機能を提供します:

  • ごみ箱内のテーブルの表示

    ごみ箱内のすべてのテーブルを表示するには、DBMS_RECYCLE パッケージの次のコマンドを使用します:

    call dbms_recycle.show_tables();

    例:

    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)

    パラメータ

    説明

    SCHEMA

    ごみ箱のデータベース名です。

    TABLE

    ごみ箱内のテーブル名です。

    ORIGIN_SCHEMA

    元のデータベース名です。

    ORIGIN_TABLE

    元のテーブル名です。

    RECYCLED_TIME

    テーブルがごみ箱に移動された時刻です。

    PURGE_TIME

    テーブルをごみ箱からパージする予定時刻です。

  • ごみ箱からのテーブルの手動パージ

    ごみ箱からテーブルを手動でパージするには、DBMS_RECYCLE パッケージの次のコマンドを使用します:

    call dbms_recycle.purge_table('<TABLE>');
    説明
    • <TABLE> は、ごみ箱内のテーブル名です。

    • アカウントには、元のテーブルとごみ箱内のテーブルの両方に対する DROP 権限が必要です。

    例:

    call dbms_recycle.purge_table('__innodb_1063');
  • ごみ箱からのテーブルのリストア

    • ごみ箱からテーブルをリストアするには、DBMS_RECYCLE パッケージが提供するインターフェイスを使用します。

      コマンドは次のとおりです:

      call dbms_recycle.restore_table('<RECYCLE_TABLE>','<DEST_DB>','<DEST_TABLE>');

      次の表では、パラメータについて説明します。

      パラメータ

      説明

      RECYCLE_TABLE

      リストアするごみ箱内のテーブル名です。

      説明

      このパラメータのみを指定した場合、テーブルは元の場所に元の名前でリストアされます。

      DEST_DB

      移行先データベース名です。

      DEST_TABLE

      移行先テーブル名です。

      説明

      restore_table コマンドには SUPER 権限が必要です。ユーザーアカウントにはこの権限が付与されないため、このコマンドを手動で実行することはできません。

      例:

      mysql> call dbms_recycle.restore_table('__innodb_1063','testDB','testTable');
    • INSERT ... SELECT を使用して、ごみ箱内のテーブルからデータをリストアすることもできます。

      最初に、ごみ箱内のすべてのテーブルを照会し、__recycle_bin__ データベース内でリストアしたいテーブル名を特定します。次に、同じ構造の移行先テーブルを作成し、INSERT ... SELECT ステートメントを使用してデータを移行先テーブルに取り込みます。例:

      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