Delta LakeのDeep Cloneによるテーブルのバックアップ

こちらを参考に実際に動かしてみます。

https://docs.databricks.com/ja/delta/clone.html

# テーブルの準備

このようなテーブルを対象にバックアップを行います。`main.default.clone_source`というテーブルです。
![Screenshot 2024-02-28 at 16.42.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/044b3d5c-d904-6952-ebb9-5cd386a4a4cb.png)


```sql
SELECT * FROM main.default.clone_source;
```
```

意図的にレコードを削除します。

```sql
DELETE FROM main.default.clone_source WHERE dropoff_zip="10003";
```

[テーブル履歴](https://docs.databricks.com/ja/delta/history.html)を確認します。

```sql
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
```

メタデータも確認しておきます。

```sql
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](https://docs.databricks.com/ja/sql/language-manual/delta-clone.html)でテーブルをコピーします。Deep Cloneとは:

> ディープクローンは、既存のテーブルのメタデータに加えて、ソーステーブルのデータをクローンターゲットにコピーする クローン です。 さらに、ストリーム メタデータも複製されるため、Delta テーブルに書き込むストリームをソース テーブルで停止し、中断したところから複製のターゲットで続行できます。

```sql
-- DEEP CLONE
CREATE OR REPLACE TABLE main.default.clone_target DEEP CLONE main.default.clone_source;
```

履歴を確認します。

```sql
DESCRIBE HISTORY main.default.clone_target;
```
[こちら](https://docs.databricks.com/ja/delta/clone.html#clone-types)にありますように履歴はコピーされません。
```
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
```

メタデータはコピーされています。

```sql
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バケットにアーカイブとしてバックアップします。

```sql
-- アーカイブとしてバックアップ
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バケットを確認します。

```sql
LIST "s3://taka-external-location-bucket/archive/clone_target";
```

Deltaが書き込まれています。

```sql
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によるリストア

バックアップしたテーブルを削除してみます。

```sql
DROP TABLE main.default.clone_target;
```

バックアップからリストアします。

```sql
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
```

復旧しました。

```sql
SELECT * FROM main.default.clone_target;
```
![Screenshot 2024-02-28 at 16.53.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/1d42646b-ff98-8824-1316-9cca1f8ff18f.png)

なお、Deep Cloneはインクリメンタルに動作するので、定期実行している場合、以前クローンした後の変更のみがバックアップされます。

> 既存の Delta テーブルの場合、ソース テーブルの新しいメタデータと新しいデータを含む新しいコミットが作成されます。 この新しいコミットはインクリメンタルであり、最後のクローン以降の新しい変更のみがテーブルにコミットされます。


ここではテーブルレベルでのバックアップ・リストアを説明しましたが、S3レベルでバックアップ・リストアを行いたい場合にはこちらを参考にしてください。

https://docs.aws.amazon.com/ja_jp/aws-backup/latest/devguide/s3-backups.html


### はじめてのDatabricks

[はじめてのDatabricks](https://qiita.com/taka_yayoi/items/8dc72d083edb879a5e5d)

### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)