こちらを参考に実際に動かしてみます。
テーブルの準備
このようなテーブルを対象にバックアップを行います。main.default.clone_source
というテーブルです。
SELECT * FROM main.default.clone_source;
意図的にレコードを削除します。
```sql
DELETE FROM main.default.clone_source WHERE dropoff_zip="10003";
テーブル履歴を確認します。
DESCRIBE HISTORY main.default.clone_source;
DELETE
が記録されています。
version timestamp userId userName operation operationParameters job notebook clusterId readVersion isolationLevel isBlindAppend operationMetrics userMetadata engineInfo
1 2024-02-28T07:33:46.000+00:00 null null DELETE {"predicate":"[\"(dropoff_zip#9563 = 10003)\"]"} null null null 0 WriteSerializable false {"numRemovedFiles":"0","numRemovedBytes":"0","numCopiedRows":"0","numDeletionVectorsAdded":"1","numDeletionVectorsRemoved":"0","numAddedChangeFiles":"0","executionTimeMs":"1625","numDeletionVectorsUpdated":"0","numDeletedRows":"14","scanTimeMs":"1024","numAddedFiles":"0","numAddedBytes":"0","rewriteTimeMs":"575"} null Databricks-Runtime/14.1.x-photon-scala2.12
0 2024-02-28T07:24:50.000+00:00 null null CREATE OR REPLACE TABLE AS SELECT {"partitionBy":"[]","description":null,"isManaged":"true","properties":"{\"delta.checkpoint.writeStatsAsStruct\":\"true\",\"delta.checkpoint.writeStatsAsJson\":\"false\",\"delta.enableDeletionVectors\":\"true\"}","statsOnLoad":"false"} null null null WriteSerializable false {"numFiles":"1","numOutputRows":"326","numOutputBytes":"11530"} null Databricks-Runtime/14.1.x-photon-scala2.12
メタデータも確認しておきます。
DESCRIBE DETAIL main.default.clone_source;
format id name description location createdAt lastModified partitionColumns clusteringColumns numFiles sizeInBytes properties minReaderVersion minWriterVersion tableFeatures statistics
delta 9232bce9-cf65-40c7-9118-31e09c7b79fa main.default.clone_source null s3://taka-uc-s3-bucket/4c55425f-e291-45f8-a4e7-29a103c19e29/tables/18a826db-8b6b-436f-9a2d-1ad319f7ac7f 2024-02-28T07:24:47.232+00:00 2024-02-28T07:33:46.000+00:00 [] [] 1 11530 {"delta.checkpoint.writeStatsAsStruct":"true","delta.checkpoint.writeStatsAsJson":"false","delta.enableDeletionVectors":"true"} 3 7 ["deletionVectors"] {"numRowsDeletedByDeletionVectors":"14","numDeletionVectors":"1"}
Deep Cloneによるバックアップ
まずは、Deep Cloneでテーブルをコピーします。Deep Cloneとは:
ディープクローンは、既存のテーブルのメタデータに加えて、ソーステーブルのデータをクローンターゲットにコピーする クローン です。 さらに、ストリーム メタデータも複製されるため、Delta テーブルに書き込むストリームをソース テーブルで停止し、中断したところから複製のターゲットで続行できます。
-- DEEP CLONE
CREATE OR REPLACE TABLE main.default.clone_target DEEP CLONE main.default.clone_source;
履歴を確認します。
DESCRIBE HISTORY main.default.clone_target;
こちらにありますように履歴はコピーされません。
version timestamp userId userName operation operationParameters job notebook clusterId readVersion isolationLevel isBlindAppend operationMetrics userMetadata engineInfo
0 2024-02-28T07:34:10.000+00:00 null null CLONE {"source":"main.default.clone_source","sourceVersion":"1","isShallow":"false"} null null null -1 Serializable false {"removedFilesSize":"0","numRemovedFiles":"0","sourceTableSize":"11530","numCopiedFiles":"1","copiedFilesSize":"11530","sourceNumOfFiles":"1"} null Databricks-Runtime/14.1.x-photon-scala2.12
メタデータはコピーされています。
DESCRIBE DETAIL main.default.clone_target;
format id name description location createdAt lastModified partitionColumns clusteringColumns numFiles sizeInBytes properties minReaderVersion minWriterVersion tableFeatures statistics
delta 0e3e6dfe-0ac7-44ce-9cc6-df3884dd541a main.default.clone_target null s3://taka-uc-s3-bucket/4c55425f-e291-45f8-a4e7-29a103c19e29/tables/bb8f8b30-506d-4396-b2b6-9da376e87b04 2024-02-28T07:24:47.232+00:00 2024-02-28T07:34:10.000+00:00 [] [] 1 11530 {"delta.checkpoint.writeStatsAsStruct":"true","delta.checkpoint.writeStatsAsJson":"false","delta.enableDeletionVectors":"true"} 3 7 ["deletionVectors"] {"numRowsDeletedByDeletionVectors":"14","numDeletionVectors":"1"}
次に、別のS3バケットにアーカイブとしてバックアップします。
-- アーカイブとしてバックアップ
CREATE OR REPLACE TABLE delta.`s3://taka-external-location-bucket/archive/clone_target` CLONE main.default.clone_target
source_table_size source_num_of_files num_removed_files num_copied_files removed_files_size copied_files_size
11530 1 0 1 0 11530
S3バケットを確認します。
LIST "s3://taka-external-location-bucket/archive/clone_target";
Deltaが書き込まれています。
path name size modification_time
s3://taka-external-location-bucket/archive/clone_target/deletion_vector_ea508a74-96cc-448c-be5e-f344353e67c0.bin deletion_vector_ea508a74-96cc-448c-be5e-f344353e67c0.bin 69 1709105768000
s3://taka-external-location-bucket/archive/clone_target/part-00000-851f2536-e190-4fe4-a8a7-53da890e8528.c000.snappy.parquet part-00000-851f2536-e190-4fe4-a8a7-53da890e8528.c000.snappy.parquet 11530 1709105769000
s3://taka-external-location-bucket/archive/clone_target/_delta_log/ _delta_log/ 0 1709105775001
Deep Cloneによるリストア
バックアップしたテーブルを削除してみます。
DROP TABLE main.default.clone_target;
バックアップからリストアします。
CREATE OR REPLACE TABLE main.default.clone_target CLONE delta.`s3://taka-external-location-bucket/archive/clone_target`
source_table_size source_num_of_files num_removed_files num_copied_files removed_files_size copied_files_size
11530 1 0 1 0 11530
復旧しました。
SELECT * FROM main.default.clone_target;
なお、Deep Cloneはインクリメンタルに動作するので、定期実行している場合、以前クローンした後の変更のみがバックアップされます。
既存の Delta テーブルの場合、ソース テーブルの新しいメタデータと新しいデータを含む新しいコミットが作成されます。 この新しいコミットはインクリメンタルであり、最後のクローン以降の新しい変更のみがテーブルにコミットされます。
ここではテーブルレベルでのバックアップ・リストアを説明しましたが、S3レベルでバックアップ・リストアを行いたい場合にはこちらを参考にしてください。