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
-