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

ApsaraDB RDS:ごみ箱機能を使用する

最終更新日:Aug 29, 2024

データ定義言語 (DDL) 操作はロールバックできません。 ユーザーエラーが原因でデータが失われる可能性があります。 たとえば、ユーザーがDROP TABLEステートメントを実行すると、データが失われる可能性があります。 Alibaba Cloudにはごみ箱機能があり、ごみ箱にドロップされたテーブルを一時的に保存できます。 ドロップされたテーブルを取得できる保持期間を指定できます。 Alibaba Cloudは、ごみ箱にドロップされたテーブルの管理に役立つDBMS_RECYCLEパッケージも提供しています。

前提条件

RDSインスタンスは、次のいずれかのMySQLバージョンを実行します。

  • 20191225以降のマイナーエンジンバージョンを使用したMySQL 8.0

  • 20210430以降のマイナーエンジンバージョンを使用したMySQL 5.7

パラメーター

次の表に、ごみ箱機能に設定できるパラメーターを示します。

パラメーター

説明

loose_recycle_bin

ごみ箱機能を有効にするかどうかを指定します。 この機能は、RDSインスタンスまたは特定のセッションに対して有効にできます。 このパラメーターは、ApsaraDB RDSコンソールで変更できます。 既定値:OFF

loose_recycle_bin_保持

ごみ箱にテーブルを保持する期間。 単位は秒です。 デフォルト値: 604800 デフォルト値は7日です。 このパラメーターは、ApsaraDB RDSコンソールで変更できます。

loose_recycle_scheduler

ごみ箱を非同期でクリアするスレッドを有効にするかどうかを指定します。 このパラメーターは、ApsaraDB RDSコンソールで変更できます。 既定値:OFF

loose_recycle_scheduler_interval

ごみ箱からテーブルを非同期に削除するために使用されるスレッドの後のポーリング間隔。 単位は秒です。 デフォルト値:30。 このパラメーターは一時的に使用できません。

loose_recycle_scheduler_purge_table_print

システムが非同期でごみ箱をクリアするときに生成されるログを記録するかどうかを指定します。 デフォルト値: OFFこのパラメータは一時的に使用できません。

重要

ディスク容量の枯渇を防ぐため、loose_recycle_bin_retentionパラメーターを最適値に設定し、loose_recycle_schedulerパラメーターをONに設定することを推奨します。

説明

  • リサイクルと削除

    • Recycling

      TRUNCATE TABLEステートメントを実行してテーブルを切り捨てると、切り詰められたテーブルがごみ箱に移動します。 次に、システムは、切り捨てられたテーブルの元のディレクトリに、切り捨てられたテーブルと同じスキーマを使用するテーブルを作成します。

      説明

      このメカニズムは、20200331以降のマイナーエンジンバージョンでMySQL 8.0を実行するRDSインスタンスでのみサポートされます。

      DROP TABLEまたはDROP DATABASEステートメントを実行してテーブルまたはデータベースを削除すると、削除されたテーブルに関連するオブジェクトのみがごみ箱に移動します。 システムは、次のポリシーに基づいて残りのオブジェクトを削除します。

      • オブジェクトがドロップされたテーブルに関連していない場合、システムは実行するステートメントに基づいてオブジェクトを保持するかどうかを決定します。 これらのオブジェクトはリサイクルされません。

      • オブジェクトがドロップされたテーブルに基づいており、テーブル内のデータを変更する可能性がある場合、システムはオブジェクトを削除します。 オブジェクトは、トリガおよび外部キーを含む。 システムは列統計を削除しません。 これらの統計は、ドロップされたテーブルとともにごみ箱に移動されます。

    • 削除

      ごみ箱は、recycle_bin_retentionパラメーターで指定された期間より長く保存されているテーブルを非同期にパージするためのバックグラウンドスレッドを開始します。 大量のデータを持つテーブルの場合、システムは別のバックグラウンドスレッドを起動して、これらのテーブルを非同期にパージします。

  • 権限コントロール

    RDSインスタンスを起動すると、__recycle_bin__ という名前のデータベースが作成され、ごみ箱に移動されたデータが格納されます。 __recycle_bin__ データベースはシステムデータベースであり、変更または削除することはできません。

    DROP TABLEステートメントを実行して、ごみ箱からテーブルを削除することはできません。 ただし、call dbms_recycle.purge_table('<TABLE>'); メソッドを使用して、ごみ箱からテーブルを削除できます。

    説明

    使用するアカウントには、RDSインスタンスとごみ箱の両方でDROPステートメントを実行する権限が必要です。

  • ごみ箱での表の命名

    __recycle_bin__ データベース内のテーブルは、異なるデータベースに由来し、同じ名前を持つことができます。 各テーブルがごみ箱内で一意の名前を持つようにするために、システムは次の命名規則を実装します。

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

    下表に、各パラメーターを説明します。

    パラメーター

    説明

    ストレージエンジン

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

    SEプライベートid

    テーブルを識別するためにストレージエンジンによって生成される一意の値。 たとえば、InnoDBテーブルを識別するために使用される一意の値は、テーブルのIDです。

  • 独立したリサイクル

    RDSインスタンスのごみ箱の設定は、そのRDSインスタンスにのみ適用されます。 プライマリRDSインスタンスのごみ箱の設定は、バイナリログがレプリケートされるセカンダリ、読み取り専用、またはディザスタリカバリRDSインスタンスには適用されません。 たとえば、プライマリRDSインスタンスで7日間の保持期間を指定し、セカンダリRDSインスタンスで14日間の保持期間を指定できます。

    説明

    RDSインスタンスのストレージ使用量は、インスタンスで指定した保持期間によって異なります。

使用上の注意

  • __recycle_bin__データベースとリサイクルするテーブルが異なるファイルシステムにある場合、DROP tableステートメントを実行してテーブルを削除した後、システムはテーブルを格納するテーブルスペースから関連するデータファイルを移行する可能性があります。 このプロセスには時間がかかります。

  • 一般的なテーブルスペースには、複数のテーブルを格納できます。 DROP TABLE文を実行して一般表領域からテーブルを削除した場合、関連するデータファイルは一般表領域から移行されません。

ごみ箱を管理する

AliSQLを使用すると、ごみ箱で次の操作を実行できます。

  • ごみ箱に一時的に保存されているすべてのテーブルを表示します。

    次のコマンドを実行して、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)

    パラメーター

    説明

    スキーマ

    テーブルがごみ箱に移動された後にテーブルを格納するデータベースの名前。

    テーブル

    テーブルがごみ箱に移動された後のテーブルの名前。

    ORIGIN_SCHEMA

    テーブルがごみ箱に移動される前にテーブルを格納するデータベースの名前。

    ORIGIN_TABLE

    テーブルがごみ箱に移動される前のテーブルの名前。

    リサイクル_時間

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

    パージ_時間

    ごみ箱からテーブルが削除される予定の時刻。

  • ごみ箱からテーブルをパージします。

    次のコマンドを実行して、DBMS_RECYCLEで必要なインターフェイスを呼び出し、ごみ箱内のテーブルをパージします。

    call dbms_recycle.purge_table('<TABLE>');
    説明
    • TABLEパラメーターは、テーブルがごみ箱に移動された後のテーブルの名前を指定します。

    • 使用するアカウントには、RDSインスタンスとごみ箱の両方で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_テーブル

      宛先テーブルの名前。

      説明

      restore_tableコマンドを実行するには、スーパーユーザーの資格情報が必要です。 したがって、このコマンドは実行できません。

      例:

      mysql> call dbms_recycle.restore_table('__innodb_1063','testDB','testTable');
    • INSERTを実行します... ごみ箱内のテーブルを復元するためのSELECT文。

      ごみ箱に一時的に保存されているテーブルを照会します。 次に、SQL文の出力から __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