MaxCompute secara otomatis membuat backup data setiap kali data dimodifikasi dan menyimpan backup tersebut selama periode yang dapat dikonfigurasi. Jika data tidak sengaja dihapus atau ditimpa, Anda dapat memulihkannya ke versi sebelumnya apa pun dalam periode retensi.

Cara kerja
Selalu aktif — Diaktifkan secara default dengan periode retensi 24 jam. Tidak memerlukan penyimpanan eksternal dan tidak dikenai biaya tambahan.
Berkesinambungan — Setiap modifikasi memicu backup, sehingga tidak ada perubahan data yang terlewat di antara jendela backup terjadwal.
Pemulihan cepat — Operasi pemulihan tidak mengonsumsi sumber daya komputasi tambahan. Cukup satu perintah untuk memulihkan tabel, partisi, atau versi tertentu.
Batasan
Materialized views, object tables, dan external tables tidak didukung.
Tabel terklaster tidak dapat dipulihkan.
Setelah
PURGE TABLEdijalankan pada suatu tabel, data yang telah dipurge tidak dapat dipulihkan.Tabel atau partisi yang di-drop (termasuk tabel Delta) tidak dapat langsung dipulihkan ke Log Sequence Number (LSN) tertentu. Pulihkan terlebih dahulu tabelnya, lalu pulihkan ke LSN target.
Batasan tabel Delta
Tabel Delta atau partisi yang di-drop dapat dipulihkan sepenuhnya, tetapi tidak ke versi minor tertentu. Untuk mengkueri versi minor tertentu, gunakan time travel.
Setelah tabel yang di-drop dipulihkan:
Mengkueri tabel pada waktu sebelum drop mengembalikan data seolah-olah drop tidak pernah terjadi.
Mengkueri pada waktu antara drop dan pemulihan tidak mengembalikan data apa pun (sistem menganggapnya sebagai data yang dihapus).
Menjalankan kueri pada waktu after the restore mengembalikan data seolah-olah perintah DROP dan proses pemulihan tidak pernah terjadi. Data yang dipulihkan tidak dianggap sebagai Data inkremental.
Mengajukan kueri terhadap partition yang dihapus sebelum dipulihkan tidak mengembalikan hasil apa pun (sama seperti kueri biasa terhadap partisi yang tidak ada), bukan kesalahan.
Setiap siklus drop-dan-pulihkan menghasilkan timestamp commit dan nomor versi baru. Saat tabel berpartisi dipulihkan, versi terpisah dibuat untuk setiap partisi.
Konfigurasi periode retensi
Tetapkan jumlah hari MaxCompute menyimpan data backup. Rentang nilai yang valid adalah 0–30. Nilai default adalah 1 (24 jam). Mengatur ke 0 akan menonaktifkan backup.
-- Atur periode retensi menjadi 7 hari
setproject odps.timemachine.retention.days=7;Hanya Akun Alibaba Cloud atau administrator proyek yang dapat mengubah periode retensi.
Perilaku setelah mengubah periode retensi:
| Perubahan | Efek |
|---|---|
| Memperpanjang periode | Langsung berlaku pada hari yang sama |
| Memperpendek periode | MaxCompute secara otomatis menghapus data backup yang melebihi periode baru |
Untuk melihat pengaturan saat ini, jalankan setproject; pada MaxCompute client (odpscmd) dan periksa nilai odps.timemachine.retention.days.
Lihat riwayat backup
Daftar semua tabel termasuk tabel yang di-drop
SHOW HISTORY FOR tables;Filter berdasarkan nama:
SHOW HISTORY FOR tables LIKE test_restore_1;Contoh output:
Name Id Type IsPartitioned CreateTime DropTime
test_restore_1 a0b06367bd054d17a55505aa31601b89 MANAGED_TABLE FALSE 2025-07-18 16:32:13Memerlukan izin List pada proyek. Lihat Izin MaxCompute.
Lihat riwayat versi tabel
SHOW HISTORY FOR TABLE <table_name> [LIMIT <n>] [LSN '<lsn>' | OFFSET <offset>];Contoh:
SHOW HISTORY FOR TABLE test_restore_1;Contoh output:
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 OVERWRITEMemerlukan izin ShowHistory pada tabel. Jika tabel telah di-drop, perintah ini mengembalikan error. Gunakan SHOW HISTORY FOR tables LIKE <table_name>; sebagai gantinya.
Lihat riwayat versi tabel yang di-drop
Gunakan ID tabel yang diperoleh dari SHOW HISTORY FOR tables:
SHOW HISTORY FOR TABLE test_restore_2 ('id'='437b29466ba948b392b2090ec0a60fc2');Memerlukan izin List pada proyek.
Lihat riwayat versi partisi
-- Berdasarkan spesifikasi partisi
SHOW HISTORY FOR TABLE test_restore_part_1 PARTITION(ds='20250701');
-- Berdasarkan ID partisi (untuk partisi yang di-drop)
SHOW HISTORY FOR TABLE test_restore_part_1 PARTITION('id'='271aebf3e17a4a8e9f6b35733bf63db4');Memerlukan izin ShowHistory pada tabel.
Untuk melihat beberapa partisi sekaligus:
SHOW HISTORY FOR TABLE test_restore_part_1 ('id'='fbee66b56cf544d2a9999d5d0ce5d352')
PARTITION(ds='20250701') PARTITION(ds='20250702');Pulihkan tabel non-partisi
Pulihkan tabel yang di-drop
RESTORE TABLE <table_name> ('id'='<table_id>');Nama tabel tidak boleh bentrok dengan tabel yang sudah ada. Ubah nama tabel yang ada terlebih dahulu jika diperlukan.
Contoh:
-- Ubah nama tabel yang bentrok
ALTER TABLE test_restore_2 RENAME TO test_restore_2_rename;
-- Pulihkan tabel yang di-drop
RESTORE TABLE test_restore_2 ('id'='437b29466ba948b392b2090ec0a60fc2');Permissions:
Tabel yang ada: izin Update pada tabel.
Tabel yang tidak ada: izin CreateTable pada proyek.
Pulihkan tabel ke versi tertentu
RESTORE TABLE <table_name> TO LSN '<lsn>';Contoh:
RESTORE TABLE test_restore_1 TO LSN '0000000000000004';
SELECT * FROM test_restore_1;
-- Mengembalikan:
-- +------------+
-- | colname |
-- +------------+
-- | 2 |
-- +------------+Pulihkan tabel ke versi tertentu sebagai tabel baru
RESTORE TABLE <table_name> TO LSN '<lsn>' AS <new_table_name>;Perintah ini memiliki tiga perilaku tergantung pada tabel target:
| Skenario | Perilaku |
|---|---|
| Tabel target tidak ada | Membuat tabel baru dengan data yang dipulihkan |
| Tabel target ada dengan skema yang sama | Menimpa data tabel target |
| Tabel target ada dengan skema berbeda | Gagal dengan error ODPS-0110061 |
Contoh — pulihkan dan ubah nama:
RESTORE TABLE test_restore_2 TO LSN '0000000000000003' AS test_restore_new;
SELECT * FROM test_restore_new;
-- Mengembalikan:
-- +------------+
-- | colname |
-- +------------+
-- | 1 |
-- +------------+Pulihkan tabel berpartisi
Pulihkan tabel berpartisi yang di-drop
RESTORE TABLE <table_name> ('id'='<table_id>');Semua partisi yang ada pada saat drop dipulihkan.
Pulihkan partisi yang di-drop
Pulihkan satu atau beberapa partisi yang di-drop ke tabel yang sudah ada:
RESTORE TABLE <table_name> PARTITION('id'='<partition_id>') [PARTITION('id'='<partition_id>')];Tabel harus ada. Jika tabel juga di-drop, pulihkan tabel terlebih dahulu.
Contoh:
-- Lihat ID partisi
SHOW HISTORY FOR TABLE test_restore_part_y;
-- Pulihkan dua partisi yang di-drop
RESTORE TABLE test_restore_part_y
PARTITION('id'='a14d6cb4ab0c46378a6e284b257bbfaa')
PARTITION('id'='8c85184ec0b44fba8198274401df2519');Pulihkan partisi ke versi tertentu
RESTORE TABLE <table_name>
PARTITION(<partition_spec>) [PARTITION(<partition_spec>)]
TO LSN '<lsn>';Saat memulihkan beberapa partisi ke satu LSN, setiap partisi dipulihkan ke LSN yang ditentukan jika LSN tersebut benar-benar ada untuk partisi tersebut. Jika tidak, partisi dipulihkan ke LSN terdekat sebelumnya.
Contoh: Partisi pt1 memiliki LSN 100, 102, 104, 106. Partisi pt2 memiliki LSN 101, 103, 104, 105. Memulihkan keduanya ke LSN 102 akan memulihkan pt1 ke 102 dan pt2 ke 101.
RESTORE TABLE test_restore_part_y
PARTITION(ds='20250701') PARTITION(ds='20250702')
TO LSN '0000000000000010';Pulihkan partisi ke versi tertentu sebagai tabel baru
RESTORE TABLE <table_name>
PARTITION(<partition_spec>) [PARTITION(<partition_spec>)]
TO LSN '<lsn>' AS <new_table_name>;Contoh tabel Delta
Buat tabel Delta, masukkan data, lalu drop dan pulihkan
-- Buat tabel Delta
CREATE TABLE mf_dt (pk BIGINT NOT NULL PRIMARY KEY,
val BIGINT NOT NULL)
PARTITIONED BY (dd STRING, hh STRING)
TBLPROPERTIES ("transactional"="true");
-- Masukkan data
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';
-- Mengembalikan:
-- +----+-----+----+----+
-- | pk | val | dd | hh |
-- +----+-----+----+----+
-- | 1 | 1 | 01 | 01 |
-- | 4 | 4 | 01 | 01 |
-- | 5 | 5 | 01 | 01 |
-- | 2 | 2 | 01 | 01 |
-- | 3 | 30 | 01 | 01 |
-- +----+-----+----+----+Dapatkan ID tabel untuk pemulihan
Jalankan DESC EXTENDED mf_dt; dan temukan bidang TableID pada bagian Extended Info:
TableID: cd607cd938dc4ca6886dd12212995604Drop dan pulihkan tabel
DROP TABLE mf_dt;
RESTORE TABLE mf_dt ('id' = 'cd607cd938dc4ca6886dd12212995604');
-- Verifikasi data
SELECT * FROM mf_dt WHERE dd='01' AND hh='01';
-- Mengembalikan data yang sama seperti sebelum drop.Drop dan pulihkan partisi
-- Dapatkan ID partisi
SHOW HISTORY FOR TABLE mf_dt;
-- Drop partisi
ALTER TABLE mf_dt DROP PARTITION (dd = '01', hh = '01');
-- Pulihkan partisi
RESTORE TABLE mf_dt PARTITION('id' = '51d38cc9ded344cf99188cd1a806e5d2');
-- Verifikasi data
SELECT * FROM mf_dt WHERE dd='01' AND hh='01';
-- Mengembalikan data yang sama seperti sebelum drop.Time travel pada tabel yang dipulihkan
Setelah tabel Delta dipulihkan, kueri time travel tetap berfungsi:
-- Kueri versi tertentu
SELECT * FROM mf_dt version AS OF 2 WHERE dd = '01' AND hh = '01';
-- Mengembalikan:
-- +----+-----+----+----+
-- | pk | val | dd | hh |
-- +----+-----+----+----+
-- | 1 | 1 | 01 | 01 |
-- | 3 | 3 | 01 | 01 |
-- | 2 | 2 | 01 | 01 |
-- +----+-----+----+----+
-- Kueri versi terbaru
SELECT * FROM mf_dt version AS OF get_latest_version('mf_dt')
WHERE dd = '01' AND hh = '01';
-- Mengembalikan data saat ini.Pembersihan file data (tabel Delta)
Tabel Delta menyimpan data historis dalam periode time travel, yang menimbulkan biaya penyimpanan tambahan. Sistem secara otomatis menghapus data historis yang tidak diperlukan dalam waktu satu hari ketika semua kondisi berikut terpenuhi:
Data lebih lama dari periode time travel. (Jika time travel dinonaktifkan untuk tabel, semua data historis memenuhi syarat.)
Data telah melebihi lifecycle atau di-drop, dan juga telah melebihi waktu perlindungan backup.
"Data historis" mengacu pada file data yang dipindahkan ke direktori Keranjang daur ulang. Operasi seperti melebihi lifecycle, menjalankan drop, melakukan compaction, atau menjalankan INSERT OVERWRITE semuanya memindahkan file data ke Keranjang daur ulang.Pembersihan paksa dengan PURGE
Dalam operasi normal, biarkan sistem menangani pembersihan secara otomatis. Gunakan PURGE TABLE hanya dalam keadaan darurat—misalnya, ketika jumlah file berlebihan menyebabkan ketidakstabilan disk atau data historis menyebabkan lonjakan biaya tak terduga.
PURGE TABLE <table_name>;Setelah menjalankan perintah ini, kueri time travel mungkin tidak lagi mengembalikan data historis.
Contoh:
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);
-- Time travel mengembalikan data versi 2
SELECT * FROM mf_ttt version AS OF 2;
-- +----+-----+
-- | pk | val |
-- +----+-----+
-- | 1 | 1 |
-- | 2 | 2 |
-- +----+-----+
-- Setelah compaction, time travel tetap berfungsi
ALTER TABLE mf_ttt compact major;
SELECT * FROM mf_ttt version AS OF 2;
-- Hasil sama seperti di atas
-- Setelah purge, time travel mengembalikan data berbeda
PURGE TABLE mf_ttt;
SELECT * FROM mf_ttt version AS OF 2;
-- +----+-----+
-- | pk | val |
-- +----+-----+
-- | 1 | 1 |
-- | 3 | 3 |
-- | 2 | 20 |
-- +----+-----+Referensi perintah
| Skenario | Perintah | Deskripsi |
|---|---|---|
| Configure retention | setproject odps.timemachine.retention.days=<days>; | Atur periode retensi (0–30 hari). Default: 1. |
setproject; | Lihat pengaturan proyek saat ini termasuk periode retensi. | |
| View backup history | SHOW HISTORY FOR tables [LIKE <name>]; | Daftar semua tabel termasuk tabel yang di-drop. Memerlukan izin List. |
SHOW HISTORY FOR TABLE <name> [LIMIT <n>] [LSN '<lsn>' | OFFSET <n>]; | Lihat riwayat versi tabel. Memerlukan izin ShowHistory. | |
SHOW HISTORY FOR TABLE <name> ('id'='<id>'); | Lihat riwayat versi tabel yang di-drop berdasarkan ID-nya. Memerlukan izin List. | |
SHOW HISTORY FOR TABLE <name> <partition_spec>; | Lihat riwayat versi partisi. Memerlukan izin ShowHistory. | |
SHOW HISTORY FOR TABLE <name> PARTITION('id'='<id>'); | Lihat riwayat versi partisi yang di-drop berdasarkan ID-nya. | |
| Restore data | RESTORE TABLE <name> ('id'='<id>'); | Pulihkan tabel atau partisi yang di-drop. |
RESTORE TABLE <name> TO LSN '<lsn>'; | Pulihkan tabel ke versi tertentu. | |
RESTORE TABLE <name> TO LSN '<lsn>' AS <new_name>; | Pulihkan tabel ke versi tertentu dan simpan sebagai tabel baru (atau yang sudah ada). | |
RESTORE TABLE <name> PARTITION('id'='<id>') [...]; | Pulihkan satu atau beberapa partisi yang di-drop. | |
RESTORE TABLE <name> <partition_spec> [...] TO LSN '<lsn>'; | Pulihkan partisi ke versi tertentu. | |
RESTORE TABLE <name> <partition_spec> [...] TO LSN '<lsn>' AS <new_name>; | Pulihkan partisi ke versi tertentu dan simpan sebagai tabel baru. | |
| Cleanup | PURGE TABLE <name>; | Hapus paksa data historis di Keranjang daur ulang. |
Catatan penggunaan
Gunakan versi terbaru MaxCompute client untuk mengakses semua perintah backup dan pemulihan.
Tabel backup hanya dibuat saat data dimodifikasi. Tidak ada modifikasi berarti tidak ada entri backup.
Data backup yang melebihi periode retensi secara otomatis dihapus dan tidak dapat dipulihkan atau dikueri.
Untuk informasi tentang izin yang diperlukan, lihat Izin MaxCompute.