データ定義言語 (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