MaxCompute では、データが変更されるたびに自動的にバックアップが実行され、バックアップデータは設定可能な期間(保持期間)にわたって保存されます。データを誤って削除または上書きした場合でも、保持期間内であれば、任意の以前のバージョンへ復元できます。

仕組み
常時有効 —— デフォルトで有効化されており、保持期間は 24 時間です。外部ストレージは不要で、追加コストも発生しません。
継続的バックアップ —— データの変更ごとにバックアップがトリガーされるため、スケジュールされたバックアップ間隔内でデータ変更が見逃されることはありません。
高速復元 —— 復元操作は追加のコンピューティングリソースを消費しません。単一のコマンドで、テーブル、パーティション、または特定のバージョンを復元できます。
制限事項
マテリアライズドビュー、オブジェクトテーブル、および外部テーブルはサポートされていません。
クラスターテーブルは復元できません。
PURGE TABLEコマンドをテーブルに対して実行した後は、パージされたデータを復元できません。削除されたテーブルまたはパーティション(Delta テーブルを含む)は、特定のログシーケンス番号(LSN)へ直接復元できません。まずテーブルを復元し、その後対象の LSN へ復元してください。
Delta テーブルの制限事項
削除された Delta テーブルまたはパーティションは完全に復元できますが、特定のマイナーバージョンへの復元はできません。特定のマイナーバージョンをクエリするには、タイムトラベルを使用します。
削除されたテーブルを復元した後の動作:
テーブルのクエリを[削除前]の時点で実行すると、削除が行われなかったかのようにデータが返されます。
ある時点で[削除と解凍の間]にクエリを実行すると、データを返しません(システムはこれを削除済みとして扱います)。
「[復元後]」の時点でのクエリ実行では、削除も復元も行われなかったかのようにデータが返されます。復元されたデータは増分データとして扱われません。
復元前の削除済みパーティションに対するクエリでは、エラーではなく結果が空になります(存在しないパーティションに対する通常のクエリと同様です)。
1 回の「削除 → 復元」サイクルごとに、新しいコミットタイムスタンプおよびバージョン番号が生成されます。パーティションテーブルを復元する場合、各パーティションごとに個別のバージョンが作成されます。
保持期間の設定
MaxCompute がバックアップデータを保持する日数を設定します。有効範囲は 0~30 日です。デフォルト値は 1(24 時間)です。0 に設定すると、バックアップ機能が無効化されます。
-- 保持期間を 7 日間に設定
setproject odps.timemachine.retention.days=7;保持期間の変更は、Alibaba Cloud アカウントまたはプロジェクト管理者のみが実行できます。
保持期間変更後の動作:
| 変更内容 | 影響 |
|---|---|
| 期間の延長 | 当日から適用されます |
| 期間の短縮 | MaxCompute が、新しい期間を超えるバックアップデータを自動的に削除します |
現在の設定を表示するには、MaxCompute クライアント (odpscmd) で setproject; を実行し、odps.timemachine.retention.days の値を確認します。
バックアップ履歴の表示
すべてのテーブル(削除済みテーブルを含む)の一覧表示
SHOW HISTORY FOR tables;名前でフィルタリングするには:
SHOW HISTORY FOR tables LIKE test_restore_1;出力例:
Name Id Type IsPartitioned CreateTime DropTime
test_restore_1 a0b06367bd054d17a55505aa31601b89 MANAGED_TABLE FALSE 2025-07-18 16:32:13プロジェクトに対する一覧表示権限が必要です。詳細については、「MaxCompute の権限」をご参照ください。
テーブルのバージョン履歴の表示
SHOW HISTORY FOR TABLE <table_name> [LIMIT <n>] [LSN '<lsn>' | OFFSET <offset>];実行例:
SHOW HISTORY FOR TABLE test_restore_1;出力例:
ObjectType ObjectId ObjectName VERSION(LSN) Time Operation
TABLE a0b06367bd054d17a55505aa31601b89 test_restore_1 0000000000000001 2025-07-18 16:32:14 CREATE
TABLE a0b06367bd054d17a55505aa31601b89 test_restore_1 0000000000000002 2025-07-18 16:52:08 OVERWRITE
TABLE a0b06367bd054d17a55505aa31601b89 test_restore_1 0000000000000003 2025-07-18 16:52:12 OVERWRITE
TABLE a0b06367bd054d17a55505aa31601b89 test_restore_1 0000000000000004 2025-07-18 16:52:14 OVERWRITE
TABLE a0b06367bd054d17a55505aa31601b89 test_restore_1 0000000000000005 2025-07-18 16:52:17 OVERWRITEこのコマンドを実行するには、テーブルに対する ShowHistory 権限が必要です。テーブルがすでに削除されている場合、このコマンドはエラーを返します。その場合は代わりに SHOW HISTORY FOR tables LIKE <table_name>; を使用してください。
削除済みテーブルのバージョン履歴の表示
SHOW HISTORY FOR tables から取得したテーブル ID を使用します:
SHOW HISTORY FOR TABLE test_restore_2 ('id'='437b29466ba948b392b2090ec0a60fc2');この操作にはプロジェクトに対する List 権限が必要です。
パーティションのバージョン履歴の表示
-- パーティション仕様による指定
SHOW HISTORY FOR TABLE test_restore_part_1 PARTITION(ds='20250701');
-- パーティション ID による指定(削除済みパーティションの場合)
SHOW HISTORY FOR TABLE test_restore_part_1 PARTITION('id'='271aebf3e17a4a8e9f6b35733bf63db4');この操作にはテーブルに対する ShowHistory 権限が必要です。
複数のパーティションを一度に表示するには:
SHOW HISTORY FOR TABLE test_restore_part_1 ('id'='fbee66b56cf544d2a9999d5d0ce5d352')
PARTITION(ds='20250701') PARTITION(ds='20250702');非パーティションテーブルの復元
削除済みテーブルの復元
RESTORE TABLE <table_name> ('id'='<table_id>');テーブル名は既存のテーブルと重複してはなりません。必要に応じて、既存のテーブルを事前にリネームしてください。
実行例:
-- 衝突するテーブルをリネーム
ALTER TABLE test_restore_2 RENAME TO test_restore_2_rename;
-- 削除済みテーブルを復元
RESTORE TABLE test_restore_2 ('id'='437b29466ba948b392b2090ec0a60fc2');必要な権限:
既存のテーブル:テーブルに対する Update 権限
存在しないテーブル:プロジェクトに対する CreateTable 権限
特定のバージョンへのテーブル復元
RESTORE TABLE <table_name> TO LSN '<lsn>';実行例:
RESTORE TABLE test_restore_1 TO LSN '0000000000000004';
SELECT * FROM test_restore_1;
-- 出力結果:
-- +------------+
-- | colname |
-- +------------+
-- | 2 |
-- +------------+特定のバージョンを新規テーブルとして復元
RESTORE TABLE <table_name> TO LSN '<lsn>' AS <new_table_name>;このコマンドの動作は、対象テーブルの状態によって以下の 3 通りに分かれます:
| シナリオ | 動作 |
|---|---|
| 対象テーブルが存在しない場合 | 復元データで新規テーブルが作成されます |
| 対象テーブルが存在し、スキーマが一致する場合 | 対象テーブルのデータが上書きされます |
| 対象テーブルが存在し、スキーマが異なる場合 | エラー ODPS-0110061 で失敗します |
実行例 —— 復元とリネーム:
RESTORE TABLE test_restore_2 TO LSN '0000000000000003' AS test_restore_new;
SELECT * FROM test_restore_new;
-- 出力結果:
-- +------------+
-- | colname |
-- +------------+
-- | 1 |
-- +------------+パーティションテーブルの復元
削除済みパーティションテーブルの復元
RESTORE TABLE <table_name> ('id'='<table_id>');削除時に存在していたすべてのパーティションが復元されます。
削除済みパーティションの復元
既存のテーブルに対して、1 つ以上の削除済みパーティションを復元します:
RESTORE TABLE <table_name> PARTITION('id'='<partition_id>') [PARTITION('id'='<partition_id>')];対象テーブルは存在している必要があります。テーブル自体も削除されている場合は、まずテーブルを復元してください。
実行例:
-- パーティション ID の確認
SHOW HISTORY FOR TABLE test_restore_part_y;
-- 2 つの削除済みパーティションを復元
RESTORE TABLE test_restore_part_y
PARTITION('id'='a14d6cb4ab0c46378a6e284b257bbfaa')
PARTITION('id'='8c85184ec0b44fba8198274401df2519');パーティションを特定のバージョンへ復元
RESTORE TABLE <table_name>
PARTITION(<partition_spec>) [PARTITION(<partition_spec>)]
TO LSN '<lsn>';複数のパーティションを同一の LSN へ復元する場合、各パーティションについて、その LSN が存在すれば指定 LSN へ、存在しなければ直近の先行 LSN へ復元されます。
例: パーティション pt1 の LSN が 100、102、104、106 であり、パーティション pt2 の LSN が 101、103、104、105 であるとき、両方を LSN 102 へ復元すると、pt1 は LSN 102 へ、pt2 は LSN 101 へ復元されます。
RESTORE TABLE test_restore_part_y
PARTITION(ds='20250701') PARTITION(ds='20250702')
TO LSN '0000000000000010';パーティションを特定のバージョンとして新規テーブルへ復元
RESTORE TABLE <table_name>
PARTITION(<partition_spec>) [PARTITION(<partition_spec>)]
TO LSN '<lsn>' AS <new_table_name>;Delta テーブルの実行例
Delta テーブルの作成、データ挿入、削除および復元
-- Delta テーブルの作成
CREATE TABLE mf_dt (pk BIGINT NOT NULL PRIMARY KEY,
val BIGINT NOT NULL)
PARTITIONED BY (dd STRING, hh STRING)
TBLPROPERTIES ("transactional"="true");
-- データの挿入
INSERT OVERWRITE TABLE mf_dt PARTITION(dd='01', hh='01')
VALUES (1, 1), (2, 2), (3, 3);
INSERT INTO TABLE mf_dt PARTITION(dd='01', hh='01')
VALUES (3, 30), (4, 4), (5, 5);
SELECT * FROM mf_dt WHERE dd='01' AND hh='01';
-- 出力結果:
-- +----+-----+----+----+
-- | pk | val | dd | hh |
-- +----+-----+----+----+
-- | 1 | 1 | 01 | 01 |
-- | 4 | 4 | 01 | 01 |
-- | 5 | 5 | 01 | 01 |
-- | 2 | 2 | 01 | 01 |
-- | 3 | 30 | 01 | 01 |
-- +----+-----+----+----+復元用のテーブル ID の取得
DESC EXTENDED mf_dt; を実行し、拡張情報セクション内の TableID フィールドを確認します:
TableID: cd607cd938dc4ca6886dd12212995604テーブルの削除および復元
DROP TABLE mf_dt;
RESTORE TABLE mf_dt ('id' = 'cd607cd938dc4ca6886dd12212995604');
-- データの検証
SELECT * FROM mf_dt WHERE dd='01' AND hh='01';
-- 削除前のデータと同じものが返されます。パーティションの削除および復元
-- パーティション ID の取得
SHOW HISTORY FOR TABLE mf_dt;
-- パーティションの削除
ALTER TABLE mf_dt DROP PARTITION (dd = '01', hh = '01');
-- パーティションの復元
RESTORE TABLE mf_dt PARTITION('id' = '51d38cc9ded344cf99188cd1a806e5d2');
-- データの検証
SELECT * FROM mf_dt WHERE dd='01' AND hh='01';
-- 削除前のデータと同じものが返されます。復元済みテーブルにおけるタイムトラベル
Delta テーブルを復元した後も、タイムトラベルによるクエリは引き続き利用可能です:
-- 特定のバージョンをクエリ
SELECT * FROM mf_dt version AS OF 2 WHERE dd = '01' AND hh = '01';
-- 出力結果:
-- +----+-----+----+----+
-- | pk | val | dd | hh |
-- +----+-----+----+----+
-- | 1 | 1 | 01 | 01 |
-- | 3 | 3 | 01 | 01 |
-- | 2 | 2 | 01 | 01 |
-- +----+-----+----+----+
-- 最新バージョンをクエリ
SELECT * FROM mf_dt version AS OF get_latest_version('mf_dt')
WHERE dd = '01' AND hh = '01';
-- 現在のデータが返されます。データファイルのクリーンアップ(Delta テーブル)
Delta テーブルでは、タイムトラベル期間内の既存データが保持されるため、追加のストレージコストが発生します。システムは、以下の条件が [すべて] 満たされた場合に、1 日以内に不要な既存データを自動的に削除します:
データがタイムトラベル期間より古いものであること。(テーブルでタイムトラベルが無効化されている場合は、すべての履歴データが該当します。)
データがライフサイクルを超過したか、削除され、[および] バックアップ保護期間を超過しています。
「履歴データ」とは、ゴミ箱ディレクトリへ移動されたデータファイルを指します。ライフサイクルの超過、削除操作、コンパクション実行、INSERT OVERWRITE の実行など、さまざまな操作によってデータファイルがゴミ箱へ移動されます。PURGE による強制クリーンアップ
通常は、システムによる自動クリーンアップを許可してください。緊急時(例:過剰なファイル数がディスクの不安定性を引き起こしている場合、または履歴データが予期せぬコスト増加を招いている場合など)のみ、PURGE TABLE を使用してください。
PURGE TABLE <table_name>;このコマンドを実行した後、タイムトラベルクエリで履歴データが返されなくなる場合があります。
例:
CREATE TABLE mf_ttt (pk BIGINT NOT NULL PRIMARY KEY,
val BIGINT NOT NULL)
TBLPROPERTIES ("transactional"="true");
INSERT INTO TABLE mf_ttt VALUES (1, 1), (2, 2);
INSERT INTO TABLE mf_ttt VALUES (2, 20), (3, 3);
-- タイムトラベルでバージョン 2 のデータを取得
SELECT * FROM mf_ttt version AS OF 2;
-- 出力結果:
-- +----+-----+
-- | pk | val |
-- +----+-----+
-- | 1 | 1 |
-- | 2 | 2 |
-- +----+-----+
-- コンパクションを実行後も、タイムトラベルは正常に動作
ALTER TABLE mf_ttt compact major;
SELECT * FROM mf_ttt version AS OF 2;
-- 上記と同じ結果
-- PURGE 実行後、タイムトラベルの結果が変化
PURGE TABLE mf_ttt;
SELECT * FROM mf_ttt version AS OF 2;
-- 出力結果:
-- +----+-----+
-- | pk | val |
-- +----+-----+
-- | 1 | 1 |
-- | 3 | 3 |
-- | 2 | 20 |
-- +----+-----+コマンドリファレンス
| シナリオ | コマンド | 説明 |
|---|---|---|
| 保持期間の設定 | setproject odps.timemachine.retention.days=<days>; | 保持期間(0~30 日)を設定します。デフォルト値は 1 です。 |
setproject; | 保持期間を含む、プロジェクトの現在の設定を表示します。 | |
| バックアップ履歴の表示 | SHOW HISTORY FOR tables [LIKE <name>]; | 削除済みテーブルを含むすべてのテーブルを一覧表示します。List 権限が必要です。 |
SHOW HISTORY FOR TABLE <name> [LIMIT <n>] [LSN '<lsn>' | OFFSET <n>]; | テーブルのバージョン履歴を表示します。ShowHistory 権限が必要です。 | |
SHOW HISTORY FOR TABLE <name> ('id'='<id>'); | ID を指定して削除済みテーブルのバージョン履歴を表示します。List 権限が必要です。 | |
SHOW HISTORY FOR TABLE <name> <partition_spec>; | パーティションのバージョン履歴を表示します。ShowHistory 権限が必要です。 | |
SHOW HISTORY FOR TABLE <name> PARTITION('id'='<id>'); | ID を指定して削除済みパーティションのバージョン履歴を表示します。 | |
| データの復元 | RESTORE TABLE <name> ('id'='<id>'); | 削除済みテーブルまたはパーティションを復元します。 |
RESTORE TABLE <name> TO LSN '<lsn>'; | テーブルを特定のバージョンへ復元します。 | |
RESTORE TABLE <name> TO LSN '<lsn>' AS <new_name>; | テーブルを特定のバージョンへ復元し、新規(または既存)テーブルとして保存します。 | |
RESTORE TABLE <name> PARTITION('id'='<id>') [...]; | 1 つ以上の削除済みパーティションを復元します。 | |
RESTORE TABLE <name> <partition_spec> [...] TO LSN '<lsn>'; | パーティションを特定のバージョンへ復元します。 | |
RESTORE TABLE <name> <partition_spec> [...] TO LSN '<lsn>' AS <new_name>; | パーティションを特定のバージョンへ復元し、新規テーブルとして保存します。 | |
| クリーンアップ | PURGE TABLE <name>; | ゴミ箱内の履歴データを強制削除します。 |
注意事項
すべてのバックアップおよび復元コマンドを利用するには、最新版の MaxCompute クライアント を使用してください。
バックアップテーブルは、データが変更された場合にのみ作成されます。変更がない場合は、バックアップエントリは作成されません。
保持期間を超過したバックアップデータは自動的に削除され、復元またはクエリできなくなります。
必要な権限についての詳細については、「MaxCompute の権限」をご参照ください。