全部產品
Search
文件中心

MaxCompute:備份與恢複

更新時間:Jun 19, 2024

本文為您介紹MaxCompute的備份與恢複功能和操作命令,並提供參考樣本。

概述

MaxCompute提供資料備份與恢複功能,系統會自動備份資料的歷史版本(例如被刪除或修改前的資料)並保留一定時間,您可以對保留周期內的資料進行快速恢複,避免因誤操作遺失資料。備份與恢複

備份與恢複功能具備以下特點:

  • 預設開啟,不需要手動開通

    該功能不依賴外部儲存,系統預設為所有MaxCompute專案開放的資料保留周期為24小時,備份和儲存免費。

  • 自動持續備份

    系統自動對發生變更的資料進行備份,多次變更時將備份多個資料版本,相比固定周期性的備份策略,可以有效避免因誤操作遺失資料。

  • 恢複快速,操作簡單

    MaxCompute具備先進的中繼資料和多資料版本管理能力,備份和恢複操作不佔用額外的計算資源,您可以通過命令快速恢複不同規模的資料。

備份與恢複功能目前處於公測階段,備份和儲存免費。自2021年10月15日起,MaxCompute開始對備份的資料隨用隨付。

注意事項

使用備份恢複功能時,您需要注意如下事項:

  • 如果您通過MaxCompute用戶端查看錶的備份資訊,建議您下載最新版本的MaxCompute用戶端,歷史版本的用戶端可能無法查看到備份恢複參數及表的備份資訊。

  • 對錶執行一次修改操作就會產生一個備份版本。如果未對錶執行修改操作,不會產生備份版本。

  • 當某個備份版本的保留天數超過專案設定的備份資料保留天數時,MaxCompute會自動刪除備份版本。被刪除的備份版本無法恢複,也無法查詢到。

  • 如果表執行過Purge命令後,資料將無法恢複。

  • 已經刪除的表或分區(包含Delta Table),無法直接通過恢複到指定版本的方式進行恢複,需要先恢複表或分區後,再恢複到對應的版本 。

  • Delta Table使用限制:

    • Restore操作只支援完整恢複已Drop的表或者分區,不支援Restore到具體的小版本,如想查詢歷史小版本資料可通過timetravel查詢擷取。

    • 已Drop的表或者分區,通過Restore恢複後,對於TimeTravel查詢與Incremental查詢的行為和沒Drop前基本保持一致,但以下細節需要注意:

      • Drop後的表,在沒有Restore恢複前,包括timetravel在內的任何查詢都是不支援的,會直接報錯; Drop後的分區,任何查詢都無法查詢到資料;和常設查詢行為保持一致。

      • Drop後的表,在Restore恢複後,如果timetravel / incremental查詢的時間小於Restore操作時間,大於等於Drop操作時間,則認為資料已經刪除,查詢不到資料。

      • Drop後的表,在Restore恢複後,如果timetravel / incremental查詢的時間小於Drop操作時間,則查詢結果相當於沒有執行過Drop操作時保持一致。

      • Drop後的表,在Restore恢複後,如果timetravel / incremental查詢的時間大於等於Restore操作時間,則查詢結果相當於沒有執行過Drop和Restore操作時保持一致。即Restore操作恢複的資料不會認為是新增的資料。

    • Drop和Restore操作依然會產生對應的Commit時間和Version。對於分區表而言,Restore整張表時,每個分區會單獨Restore,從而產生獨立的Version。

操作命令

備份與恢複功能涉及的操作命令如下表所示。

情境

命令

功能

許可權說明

設定備份資料保留周期

setproject odps.timemachine.retention.days=days;

設定備份資料的保留天數。在此期間,您可以將目前的版本恢複至任意一個備份的資料版本。

days的取值範圍為[0,30],預設值為1。0代表關閉備份功能。

調整備份周期後的生效策略為:

  • 延長備份周期:新的備份周期於當日開始生效。

  • 縮短備份周期:系統將自動刪除超過保留周期的備份資料。

僅阿里雲帳號或專案系統管理員可以操作。

setproject;

通過MaxCompute用戶端執行此命令列印專案層級的參數資訊,MaxCompute用戶端使用請參見使用本地用戶端(odpscmd)串連。您可以查看odps.timemachine.retention.days參數的取值。例如odps.timemachine.retention.days=1,代表當前專案備份資料的保留周期為1天(24小時)。

查看備份資料

show history for tables [like <table_name>];

查看當前專案內的表和處於備份狀態的表資訊,包括已經刪除表,支援根據表名進行過濾,與show tables;命令不相同。

您需要具備Project的List許可權。

許可權詳情請參見MaxCompute許可權

show history for table <table_name>;

查看指定表的備份資料,擷取保留周期內備份的各個資料版本資訊。

  • 如果表存在,您需要具備Table的ShowHistory許可權。

  • 如果表已刪除,執行該命令會報錯,您可以通過show history for tables [like <table_name>];命令尋找已經刪除的表及備份的資料版本資訊。

許可權詳情請參見MaxCompute許可權

show history for table table_name ('id'='xxxx');

查看已刪除表的備份資料,擷取保留周期內備份的各個資料版本資訊。

您可以通過show history for tables [like <table_name>];命令尋找已經刪除的表,擷取表名和表ID資訊。

您需要具備Project的List許可權。

許可權詳情請參見MaxCompute許可權

show history for table table_name partition_spec;

查看指定分區的備份資料,擷取保留周期內備份的各個資料版本資訊。

無。

show history for table table_name PARTITION('id'='xxxx');

查看已刪除分區的備份資料,擷取保留周期內備份的各個資料版本資訊。id可以通過show history for table <table_name>;命令返回結果中的ObjectId欄位擷取。

恢複資料

restore table table_name ('id'='xxxxx');

恢複已刪除的表。

您可以通過show history for tables [like <table_name>];命令尋找已經刪除的表,擷取表名和表ID資訊。

  • 執行表恢複操作時:

    • 如果表存在,您需要具備Table的Update許可權。

    • 如果表不存在,您需要具備Project的CreateTable許可權。

      許可權詳情請參見MaxCompute許可權

    說明

    不支援聚簇表(cluster table)。

  • 執行分區恢複操作時,只能指定1個LSN,即備份版本。

    當一次性恢複多個分區時,MaxCompute會將每個分區都恢複至指定LSN。如果某個分區不存在指定的LSN,MaxCompute會將該分區恢複至其第1個LSN。

    例如,pt1的LSN分別為100、102、104和106,pt2的LSN分別為101、103、104和105,執行命令如下。

    restore table table_name PARTITION(pt='1') PARTITION(pt='2') to LSN '102';

    執行結果為:pt1恢複至102版本,pt2恢複至101版本。

restore table table_name to LSN 'xxxx';

恢複表至指定版本。

您可以通過show history for table <table_name>;命令擷取表的版本資訊。

restore table table_name to LSN 'xxxx' as new_table_name;

恢複表至指定版本,並命名為新表或將資料更新到不同名的表中。

restore table table_name PARTITION('id'='xxxx')[PARTITION('id'='xxxx')];

恢複已刪除的指定分區,支援一次恢複多個分區。通常用於恢複因執行drop partition操作或被生命週期回收後,需要恢複的分區。

restore table table_name partition_spec1[partition_spec2 ]to LSN 'xxxx';

恢複指定分區至指定版本,支援一次恢複多個分區。通常用於恢複因執行overwritemerge操作後,需要恢複的分區。

restore table table_name partition_spec1[partition_spec2 ]to LSN 'xxxx' as new_table_name;

恢複指定分區至指定版本,並命名為新表。

資料檔案清理操作

相對於普通表而言, Delta Table會額外保留time traval時間周期內的歷史資料,當然也需要支付額外的儲存成本,其他情境,系統會在合適的時機(最長不超過一天)自動刪除不需要的歷史資料檔案,使用者不需要額外操作,也可節省對應的儲存成本,可刪除的歷史資料包括:

  • 早於timetravel時間周期的歷史資料。如果表配置了不支援timetravel查詢,所有的歷史資料都可自動刪除。

  • 超過了生命週期或者執行Drop操作後,並且也超過了崑崙鏡備份保護時間的歷史資料。

歷史資料需滿足上面所有的條件,才可被自動刪除。

說明

此處的歷史資料特指已經遷移到資源回收筒目錄的資料檔案,一般情況下,除了超過生命週期或者執行Drop操作外,執行Compaction或者insert overwrite也會導致當前資料寫入目錄的存量資料檔案遷移至資源回收筒目錄,等待系統自動刪除。

  • 檔案強制清理文法

    --手動強制移除資源回收筒的歷史資料檔案
    purge table <table_name>;
  • 使用說明與限制

    • 執行此命令後,系統會立即刪除資源回收筒中的所有的歷史資料,可能導致timetravel操作無法查詢歷史資料。

    • 一般只在特殊情境中執行此命令應急,比如檔案太多導致磁碟讀寫不穩定,歷史資料太多導致成本暴增等。正常情況下,資源回收筒中的歷史資料等待系統自動刪除即可。

  • 使用樣本

    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);
    
    select * from mf_ttt version as of 2;
    --返回
    +------------+------------+
    | pk         | val        |
    +------------+------------+
    | 1          | 1          |
    | 2          | 2          |
    +------------+------------+
    
    --執行compaction-> purge -> timetravel查詢
    alter table mf_ttt compact major;
    select * from mf_ttt version as of 2;
    --返回
    +------------+------------+
    | pk         | val        |
    +------------+------------+
    | 1          | 1          |
    | 2          | 2          |
    +------------+------------+
    
    purge table mf_ttt;
    select * from mf_ttt version as of 2;
    --返回
    +------------+------------+
    | pk         | val        |
    +------------+------------+
    | 1          | 1          |
    | 3          | 3          |
    | 2          | 20         |
    +------------+------------+

查看備份資料樣本

以test_restore專案為例,為您介紹如何查看錶的備份資料。

  • 查看所有表的備份資料。

    執行show history for tables [like <table_name>];命令,樣本如下。

    ## 建立表mf_slot。
    odps@ test_restore>Create Table mf_slot(a string);
    ## 查看錶mf_slot的備份資料。
    odps@ test_restore>show history for tables like mf_slot;

    返回結果如下。

    ID = 20230913031801784gyn8qbae3v8
    Name                    Id                                      Type                    IsPartitioned   CreateTime              DropTime
    mf_slot                 c75dccd60b224ff086171d39b1904eb4        MANAGED_TABLE           FALSE           2023-09-13 11:17:52
    
    OK
  • 查看指定表的備份資料。

    執行show history for table <table_name>;命令,樣本如下。

    ## 建立表test_restore_x。
    odps@ test_restore>Create Table test_restore_x(a string);
    ## 更新表test_restore_x資料。
    odps@ test_restore>INSERT OVERWRITE TABLE test_restore_x values("0");
    odps@ test_restore>INSERT OVERWRITE TABLE test_restore_x values("1");
    odps@ test_restore>INSERT OVERWRITE TABLE test_restore_x values("2");
    odps@ test_restore>INSERT OVERWRITE TABLE test_restore_x values("3");
    ## 查看錶test_restore_x的備份資料。
    odps@ test_restore>show history for table test_restore_x;

    返回結果如下。

    ObjectType  ObjectId                            ObjectName         LSN               Time                Operation
    TABLE       d6266b2c49b9418cb999dc65c10ad7ae    test_restore_x     0000000000000001  2020-02-18 14:17:58 CREATE
    TABLE       d6266b2c49b9418cb999dc65c10ad7ae    test_restore_x     0000000000000002  2020-02-18 14:22:26 OVERWRITE
    TABLE       d6266b2c49b9418cb999dc65c10ad7ae    test_restore_x     0000000000000003  2020-02-18 14:23:32 OVERWRITE
    TABLE       d6266b2c49b9418cb999dc65c10ad7ae    test_restore_x     0000000000000004  2020-02-18 14:24:37 OVERWRITE
    TABLE       d6266b2c49b9418cb999dc65c10ad7ae    test_restore_x     0000000000000005  2020-02-18 14:25:44 OVERWRITE
  • 查看已刪除表的備份資料。

    執行show history for table table_name ('id'='xxxx');命令,樣本如下。

    ## 刪除表test_restore_x。
    odps@ test_restore>drop table test_restore_x;
    ## 確認刪除表test_restore_x操作。
    Confirm to "drop table test_restore_x;" (yes/no)? yes
    ## 查看刪除表test_restore_x的備份資料。
    odps@ test_restore>show history for table test_restore_x('id'='d6266b2c49b9418cb999dc65c10ad7ae');

    返回結果如下。

    ObjectType  ObjectId                            ObjectName         LSN                 Time                Operation
    TABLE       d6266b2c49b9418cb999dc65c10ad7ae    test_restore_x     0000000000000001    2020-02-18 14:17:58 CREATE
    TABLE       d6266b2c49b9418cb999dc65c10ad7ae    test_restore_x     0000000000000002    2020-02-18 14:22:26 OVERWRITE
    TABLE       d6266b2c49b9418cb999dc65c10ad7ae    test_restore_x     0000000000000003    2020-02-18 14:23:32 OVERWRITE
    TABLE       d6266b2c49b9418cb999dc65c10ad7ae    test_restore_x     0000000000000004    2020-02-18 14:24:37 OVERWRITE
    TABLE       d6266b2c49b9418cb999dc65c10ad7ae    test_restore_x     0000000000000005    2020-02-18 14:25:44 OVERWRITE
    TABLE       d6266b2c49b9418cb999dc65c10ad7ae    test_restore_x     0000000000000006    2020-02-18 14:30:32 DROP
  • 查看分區表或分區的備份資料。

    執行show history for table table_name ('id'='xxxx');命令,查看分區表的備份資料。執行show history for table table_name partition_spec;show history for table table_name PARTITION('id'='xxxx');命令,查看分區的備份資料。

    查看分區表的備份資料,樣本如下。

    ## 建立表test_restore_part_x。
    odps@ test_restore>Create Table test_restore_part_x(a string) PARTITIONED BY(ds string);
    ## 更新表test_restore_part_x。
    odps@ test_restore>INSERT OVERWRITE TABLE test_restore_part_x partition(ds="20191201") values ("1");
    odps@ test_restore>INSERT OVERWRITE TABLE test_restore_part_x partition(ds="20191202") values ("2");
    odps@ test_restore>INSERT OVERWRITE TABLE test_restore_part_x partition(ds="20191203") values ("3");
    odps@ test_restore>INSERT OVERWRITE TABLE test_restore_part_x partition(ds="20191204") values ("4");
    odps@ test_restore>INSERT OVERWRITE TABLE test_restore_part_x partition(ds="20191205") values ("5");
    odps@ test_restore>INSERT OVERWRITE TABLE test_restore_part_x partition(ds="20191205") values ("6");
    odps@ test_restore>INSERT OVERWRITE TABLE test_restore_part_x partition(ds="20200101") values ("20200101");
    odps@ test_restore>INSERT OVERWRITE TABLE test_restore_part_x partition(ds="20200102") values ("20200102");
    ## 查看錶test_restore_part_x的備份資料。
    odps@ test_restore>show history for table test_restore_part_x('id'='94d436523fe14ba39f33d2dee738c018');

    返回結果如下。

    ObjectType  ObjectId                            ObjectName             LSN                 Time                Operation
    TABLE       94d436523fe14ba39f33d2dee738c018    test_restore_part_x    0000000000000001    2020-02-18 17:29:35 CREATE
    PARTITION   f4614a34620346aaa729761f082aae74    ds=20191201            0000000000000002    2020-02-18 17:32:56 CREATE
    PARTITION   0698ed40169044c7bf66b14a3c3c2f35    ds=20191202            0000000000000003    2020-02-18 17:35:12 CREATE
    PARTITION   19f26f7b1976438c94f8f53cfb5c6912    ds=20191203            0000000000000004    2020-02-18 17:35:22 CREATE
    PARTITION   dc15ed7d5da441649a5f32c4929b2fb2    ds=20191204            0000000000000005    2020-02-18 17:35:57 CREATE
    PARTITION   e01128f1183b44369b06dae1e73a8134    ds=20191205            0000000000000006    2020-02-18 17:37:21 CREATE
    PARTITION   e01128f1183b44369b06dae1e73a8134    ds=20191205            0000000000000007    2020-02-18 17:37:48 OVERWRITE
    PARTITION   189727214c0d4e8e92b52814211dd086    ds=20200101            0000000000000008    2020-02-18 17:37:59 CREATE
    PARTITION   adbc79ade65d4b0dbea4a4dcbf0ce719    ds=20200102            0000000000000009    2020-02-18 17:38:09 CREATE

    查看分區的備份資料,樣本如下。

    ## 查看錶test_restore_part_x指定分區的備份資料。
    odps@ test_restore>show history for table test_restore_part_x('id'='94d436523fe14ba39f33d2dee738c018') partition(ds='20191201') partition(ds='20191202');

    返回結果如下。

    ObjectType  ObjectId                            ObjectName           LSN                 Time                Operation
    PARTITION   f4614a34620346aaa729761f082aae74    ds=20191201          0000000000000002    2020-02-18 17:32:56 CREATE
    PARTITION   0698ed40169044c7bf66b14a3c3c2f35    ds=20191202          0000000000000003    2020-02-18 17:35:12 CREATE

恢複非分區表示例

以test_restore專案為例,為您介紹如何恢複非分區表的資料。

  • 恢複已刪除的表。

    執行restore table table_name ('id'='xxxxx');命令,樣本如下。如果存在同名的表,您需要將同名的表重新命名後才能執行恢複操作。

    ## 查詢已刪除表test_restore_x的備份資料。
    odps@ test_restore>show history for table test_restore_x('id'='d6266b2c49b9418cb999dc65c10ad7ae');
    ## 建立同名表test_restore_part_x。
    odps@ test_restore>Create Table test_restore_x(a string);
    ## 恢複表test_restore_part_x,但因為存在同名表會報錯。
    odps@ test_restore>restore table test_restore_x('id'='d6266b2c49b9418cb999dc65c10ad7ae');
    ## 重新命名存在的同名表test_restore_part_x。
    odps@ test_restore>alter table test_restore_x rename to test_restore_x_rename;
    ## 恢複已刪除的表test_restore_part_x。
    odps@ test_restore>restore table test_restore_x('id'='d6266b2c49b9418cb999dc65c10ad7ae');

    返回結果顯示OK

  • 恢複表至指定版本。 對於已經刪除的表,需要先恢複表之後再進行此操作。

    執行restore table table_name to LSN 'xxxx';命令,樣本如下。

    ## 恢複表test_restore_x至指定版本。
    odps@ test_restore>restore table test_restore_x to LSN '0000000000000004';
    ## 查詢表test_restore_part_x資料。
    odps@ test_restore>select * from test_restore_x;

    返回結果如下。

    Summary:
    +---+
    | a |
    +---+
    | 2 |
    +---+
  • 恢複表至指定版本,並命名為新表或將資料更新到不同名的表中。

    執行restore table table_name to LSN 'xxxx' as new_table_name;命令,樣本如下。

    包含以下三種情境:

    • 恢複表至指定版本,並命名為新表。

      ## 恢複已刪除的表test_restore_x至指定版本,並命名為新表。
      odps@ test_restore>restore table test_restore_x to LSN '0000000000000005' as test_restore_x_v5;
      ## 查詢表test_restore_x_v5資料。
      odps@ test_restore>select * from test_restore_x_v5;

      返回結果如下。

      Summary:
      +---+
      | a |
      +---+
      | 3 |
      +---+
    • 恢複表至指定版本,並將資料更新到已存在的不同名表中。

      ## 恢複表test_restore_x至指定版本,並更新到已存在的不同名表中。
      odps@ test_restore>restore table test_restore_x to LSN '0000000000000005' as test_restore_x_v5;
      ## 查詢表test_restore_x_v5的備份資料。
      odps@ test_restore>show history for table test_restore_x_v5;

      返回結果如下。

      ObjectType  ObjectId                            ObjectName            LSN                 Time                Operation
      TABLE       2e17a61561e4456db8ab66d0dd41e1b9    test_restore_x_v5     0000000000000001    2020-02-18 16:18:41 CREATE
      TABLE       2e17a61561e4456db8ab66d0dd41e1b9    test_restore_x_v5     0000000000000003    2020-02-18 16:22:07 OVERWRITE
    • 恢複表至指定版本,並將資料更新到不同名且Schema不一致的表中。該操作執行失敗,兩個表的Schema必須要保持一致。樣本如下。

      ## 建立一個Schema不一致的表。
      odps@ test_restore>Create Table test_restore_2cols(a string, b string);
      ## 恢複表test_restore_x資料至指定版本,並將資料更新到test_restore_2cols表中。
      odps@ test_restore>restore table test_restore_x to LSN '0000000000000005' as test_restore_2cols;

      返回結果如下。

      FAILED: Catalog Service Failed, ErrorCode: 105, Error Message: ODPS-0110061: Failed to run ddltask - Restore table failed because: field schema not same, [{"comment":"","id":"","name":"a","type":"string"}] vs [{"comment":"","id":"","name":"a","type":"string"},{"comment":"","id":"","name":"b","type":"string"}]

恢複分區表和分區樣本

以test_restore專案為例,為您介紹如何恢複分區表或分區的資料。

  • 恢複分區表。

    執行restore table table_name ('id'='xxxxx');命令,樣本如下。

    ## 建立表test_restore_part_x。
    odps@ test_restore>Create Table test_restore_part_x(a string) PARTITIONED BY(ds string);
    ## 更新表test_restore_part_x。
    odps@ test_restore>INSERT OVERWRITE TABLE test_restore_part_x partition(ds="20191201") values ("1");
    odps@ test_restore>INSERT OVERWRITE TABLE test_restore_part_x partition(ds="20191202") values ("2");
    odps@ test_restore>INSERT OVERWRITE TABLE test_restore_part_x partition(ds="20191203") values ("3");
    odps@ test_restore>INSERT OVERWRITE TABLE test_restore_part_x partition(ds="20191204") values ("4");
    odps@ test_restore>INSERT OVERWRITE TABLE test_restore_part_x partition(ds="20191205") values ("5");
    odps@ test_restore>INSERT OVERWRITE TABLE test_restore_part_x partition(ds="20191205") values ("6");
    odps@ test_restore>INSERT OVERWRITE TABLE test_restore_part_x partition(ds="20200101") values ("20200101");
    odps@ test_restore>INSERT OVERWRITE TABLE test_restore_part_x partition(ds="20200102") values ("20200102");
    ## 查看錶test_restore_part_x的分區。
    odps@ test_restore>list partitions test_restore_part_x;
    ## 查看錶test_restore_part_x的資料。
    odps@ test_restore>select * from test_restore_part_x;
    ## 刪除表test_restore_part_x。
    odps@ test_restore>drop table test_restore_part_x;
    ## 確認刪除表test_restore_part_x操作。
    Confirm to "drop table test_restore_part_x;" (yes/no)? yes
    ## 恢複表test_restore_part_x。
    odps@ test_restore>restore table test_restore_part_x('id'='94d436523fe14ba39f33d2dee738c018');
    ## 查看錶test_restore_part_x的備份資料。
    odps@ test_restore>show history for table test_restore_part_x('id'='94d436523fe14ba39f33d2dee738c018');
    ## 查看錶test_restore_part_x的分區。
    odps@ test_restore>list partitions test_restore_part_x;

    返回結果如下。

    ds=20191201
    ds=20191202
    ds=20191203
    ds=20191204
    ds=20191205
    ds=20200101
    ds=20200102
  • 恢複分區。 對於已經刪除的表,需要先恢複表之後再進行此操作。

    執行restore table table_name PARTITION('id'='xxxx')[PARTITION('id'='xxxx')];命令,樣本如下。

    ## 建立表test_restore_part_y。
    odps@ test_restore>Create Table test_restore_part_y(a string) PARTITIONED BY(ds string);
    ## 更新表test_restore_part_y。
    odps@ test_restore>INSERT OVERWRITE TABLE test_restore_part_y partition(ds="20191201") values ("1");
    odps@ test_restore>INSERT OVERWRITE TABLE test_restore_part_y partition(ds="20191202") values ("2");
    odps@ test_restore>INSERT OVERWRITE TABLE test_restore_part_y partition(ds="20191203") values ("3");
    odps@ test_restore>INSERT OVERWRITE TABLE test_restore_part_y partition(ds="20191204") values ("4");
    odps@ test_restore>INSERT OVERWRITE TABLE test_restore_part_y partition(ds="20191205") values ("5");
    odps@ test_restore>INSERT OVERWRITE TABLE test_restore_part_y partition(ds="20191206") values ("6");
    odps@ test_restore>INSERT OVERWRITE TABLE test_restore_part_y partition(ds="20200101") values ("20200101");
    odps@ test_restore>INSERT OVERWRITE TABLE test_restore_part_y partition(ds="20200102") values ("20200102");
    ## 查看錶test_restore_part_y的分區。
    odps@ test_restore>list partitions test_restore_part_y;
    ## 刪除表test_restore_part_y的分區。
    odps@ test_restore>alter table test_restore_part_y drop partition(ds='20191201'),partition(ds='20191202');
    ## 確認刪除分區操作。
    Confirm to "alter table test_restore_part_y drop partition(ds='20191201'),partition(ds='20191202');" (yes/no)? yes
    ## 查看錶test_restore_part_y的分區。
    odps@ test_restore>list partitions test_restore_part_y;
    ## 恢複表test_restore_part_y的分區。
    odps@ test_restore>restore table test_restore_part_y partition('id'='e6647109adbe44b69068a4dd83a577ad') partition('id'='bc4aaf375ab94998b02dabb0fed0b5fe');
    ## 查看錶test_restore_part_y的分區。
    odps@ test_restore>list partitions test_restore_part_y;

    返回結果如下。

    ds=20191201
    ds=20191202
    ds=20191203
    ds=20191204
    ds=20191205
    ds=20191206
    ds=20200101
    ds=20200102
  • 恢複分區至指定版本。 對於已經刪除的表,需要先恢複表之後再進行此操作。

    執行restore table table_name partition_spec1[partition_spec2] to LSN 'xxxx';命令,樣本如下。

    ## 更新分區表test_restore_part_y。
    odps@ test_restore>INSERT OVERWRITE TABLE test_restore_part_y partition(ds="20200101") values ("20200101_v1");
    odps@ test_restore>INSERT OVERWRITE TABLE test_restore_part_y partition(ds="20200102") values ("20200102_v1");
    odps@ test_restore>INSERT OVERWRITE TABLE test_restore_part_y partition(ds="20200101") values ("20200101_v2");
    odps@ test_restore>INSERT OVERWRITE TABLE test_restore_part_y partition(ds="20200102") values ("20200102_v2");
    ## 查看test_restore_part_y指定分區的資料。
    odps@ test_restore>select * from test_restore_part_y where ds='20200101' or ds='20200102';
    ## 恢複test_restore_part_y指定分區至指定版本。
    odps@ test_restore>restore table test_restore_part_y partition(ds='20200101') partition(ds='20200102') to LSN '0000000000000010';
    ## 查看test_restore_part_y指定分區的資料。
    odps@ test_restore>select * from test_restore_part_y where ds='20200101' or ds='20200102';

    返回結果如下。

    +---+----+
    | a | ds |
    +---+----+
    | 20200101| 20200101|
    | 20200102| 20200102|
    +---+----+
  • 恢複分區至指定版本,並命名為新表。 對於已經刪除的表,需要先恢複表之後再進行此操作。

    執行restore table table_name partition_spec1[partition_spec2] to LSN 'xxxx' as new_table_name;命令,樣本如下。

    ## 恢複分區至指定版本,並命名為新表test_restore_part_y_v10。
    odps@ test_restore>restore table test_restore_part_y partition(ds='20200101') partition(ds='20200102') to LSN '0000000000000010' as test_restore_part_y_v10;
    ## 查看新表test_restore_part_y_v10的資料。
    odps@ test_restore>select * from test_restore_part_y_v10;

    返回結果如下。

    +---+----+
    | a | ds |
    +---+----+
    
    | 20200101| 20200101|
    | 20200102| 20200102|
    +---+----+

Delta Table樣本

--建立表
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 |
| 3          | 30         | 01 | 01 |
| 4          | 4          | 01 | 01 |
| 5          | 5          | 01 | 01 |
| 2          | 2          | 01 | 01 |
+------------+------------+----+----+
--恢複表, 'table_id' 可以通過desc extended table擷取
desc extended mf_dt;
+------------------------------------------------------------------------------------+
| Owner:                    ALIYUN$mofan_***@test.aliyunid.com
| Project:                  mf_mc_bj                                                 |
| TableComment:                                                                      |
+------------------------------------------------------------------------------------+
| CreateTime:               2023-06-13 20:45:33                                      |
| LastDDLTime:              2023-06-13 20:45:33                                      |
| LastModifiedTime:         2023-06-13 20:45:41                                      |
+------------------------------------------------------------------------------------+
| InternalTable: YES      | Size: 8538                                               |
+------------------------------------------------------------------------------------+
| Native Columns:                                                                    |
+------------------------------------------------------------------------------------+
| Field    | Type   | Label | ExtendedLabel | Nullable | DefaultValue | Comment      |
+------------------------------------------------------------------------------------+
| pk       | bigint |       |               | false    | NULL         |              |
| val      | bigint |       |               | false    | NULL         |              |
+------------------------------------------------------------------------------------+
| Partition Columns:                                                                 |
+------------------------------------------------------------------------------------+
| dd              | string     |                                                     |
| hh              | string     |                                                     |
+------------------------------------------------------------------------------------+
| Extended Info:                                                                     |
+------------------------------------------------------------------------------------+
| TableID:                  a80ff25de1444ac3aa6a67a522d2110f                         |
| IsArchived:               false                                                    |
| PhysicalSize:             25614                                                    |
| FileNum:                  9                                                        |
| StoredAs:                 AliOrc                                                   |
| CompressionStrategy:      normal                                                   |
| Transactional:            true                                                     |
| IsolationMin:             NONSTRICT_SNAPSHOT_ISOLATION                             |
| odps.timemachine.retention.days: 1                                                        |
| encryption_enable:        false                                                    |
| ClusterType:              hash                                                     |
| BucketNum:                16                                                       |
| ClusterColumns:           [pk]                                                     |
| SortColumns:              [pk ASC]                                                 |
+------------------------------------------------------------------------------------+
drop table mf_dt;
restore table mf_dt ('id' = 'a80ff25de1444ac3aa6a67a522d2110f');
select * from mf_dt where dd='01' and hh='01';
--返回
+------------+------------+----+----+
| pk         | val        | dd | hh |
+------------+------------+----+----+
| 1          | 1          | 01 | 01 |
| 3          | 30         | 01 | 01 |
| 4          | 4          | 01 | 01 |
| 5          | 5          | 01 | 01 |
| 2          | 2          | 01 | 01 |
+------------+------------+----+----+

--恢複分區,'partition_id'可通過show history for table
show history for table mf_dt;
ObjectType	ObjectId                        	ObjectName          	VERSION(LSN)    	Time               	Operation       
TABLE     	a80ff25de1444ac3aa6a67a522d2110f	mf_dt              	0000000000000001	2023-06-13 20:45:33	CREATE          
PARTITION 	90a22a7f485742f7b56c460ce1c246be	dd=01/hh=01         	0000000000000002	2023-06-13 20:45:37	CREATE          
PARTITION 	90a22a7f485742f7b56c460ce1c246be	dd=01/hh=01         	0000000000000003	2023-06-13 20:45:42	APPEND          
TABLE     	a80ff25de1444ac3aa6a67a522d2110f	mf_dt              	0000000000000004	2023-06-13 20:46:49	DROP            
TABLE     	a80ff25de1444ac3aa6a67a522d2110f	mf_dt              	0000000000000005	2023-06-13 20:46:51	RESTORE         
PARTITION 	90a22a7f485742f7b56c460ce1c246be	dd=01/hh=01         	0000000000000006	2023-06-13 20:46:52	RESTORE  

alter table mf_dt drop partition (dd = '01', hh = '01');
restore table mf_dt partition('id' = '90a22a7f485742f7b56c460ce1c246be');
select * from mf_dt where dd='01' and hh='01';
+------------+------------+----+----+
| pk         | val        | dd | hh |
+------------+------------+----+----+
| 1          | 1          | 01 | 01 |
| 3          | 30         | 01 | 01 |
| 4          | 4          | 01 | 01 |
| 5          | 5          | 01 | 01 |
| 2          | 2          | 01 | 01 |
+------------+------------+----+----+

--timetravel查詢restore的表
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';
--返回
+------------+------------+----+----+
| pk         | val        | dd | hh |
+------------+------------+----+----+
| 1          | 1          | 01 | 01 |
| 3          | 30         | 01 | 01 |
| 4          | 4          | 01 | 01 |
| 5          | 5          | 01 | 01 |
| 2          | 2          | 01 | 01 |
+------------+------------+----+----+