メインコンテンツへスキップ
メインコンテンツへスキップ

S3 エンドポイントを利用したバックアップ / リストア

この記事では、S3 エンドポイント経由で S3 バケットにバックアップを保存したり、S3 バケット上のバックアップからリストアしたりする方法について説明します。

構文

-- コアコマンド
BACKUP | RESTORE [ASYNC]
--- バックアップ/復元の対象(または除外対象)
TABLE [db.]table_name           [AS [db.]table_name_in_backup] |
DICTIONARY [db.]dictionary_name [AS [db.]name_in_backup] |
DATABASE database_name          [AS database_name_in_backup] |
TEMPORARY TABLE table_name      [AS table_name_in_backup] |
VIEW view_name                  [AS view_name_in_backup] |
[EXCEPT TABLES ...] |
ALL [EXCEPT {TABLES|DATABASES}...] } [,...]
--- 
[ON CLUSTER 'cluster_name']
--- バックアップまたは復元の保存先/復元元
TO|FROM 
File('<path>/<filename>') | 
Disk('<disk_name>', '<path>/') | 
S3('<S3 endpoint>/<path>', '<Access key ID>', '<Secret access key>', '<extra_credentials>') |
AzureBlobStorage('<connection string>/<url>', '<container>', '<path>', '<account name>', '<account key>')
--- 追加設定
[SETTINGS ...]

詳しくは、「コマンドの概要」を参照してください。

使用例

S3エンドポイントへの増分バックアップ

この例では、S3エンドポイントへバックアップを作成し、そこから復元を行います。

注記

完全バックアップと増分バックアップの違いについては、「バックアップの種類」を参照してください

この方法を使用するには、以下の情報が必要です:

パラメータ
S3エンドポイントhttps://backup-ch-docs.s3.us-east-1.amazonaws.com/backups/
アクセスキーIDBKIOZLE2VYN3VXXTP9RC
シークレットアクセスキー40bwYnbqN7xU8bVePaUCh3+YEyGXu8UOMV9ANpwL
ヒント

S3バケットの作成については、「S3オブジェクトストレージをClickHouseディスクとして使用する」のセクションを参照してください

バックアップの保存先は次のように指定します:

S3('<s3 endpoint>/<directory>', '<access key id>', '<secret access key>', '<extra_credentials>')

セットアップ

以下のデータベースとテーブルを作成し、ランダムなデータを挿入します:

CREATE DATABASE IF NOT EXISTS test_db;
CREATE TABLE test_db.test_table
(
    `key` Int,
    `value` String,
    `array` Array(String)
)
ENGINE = MergeTree
ORDER BY tuple()
INSERT INTO test_db.test_table SELECT *
FROM generateRandom('key Int, value String, array Array(String)')
LIMIT 1000

ベースバックアップの作成

増分バックアップには、開始点となる_ベース_バックアップが必要です。S3保存先の最初のパラメータはS3エンドポイントで、その後にこのバックアップに使用するバケット内のディレクトリが続きます。この例では、ディレクトリ名はmy_backupです。

以下のコマンドを実行してベースバックアップを作成します:

BACKUP TABLE test_db.test_table TO S3(
'https://backup-ch-docs.s3.us-east-1.amazonaws.com/backups/base_backup',
'<access key id>',
'<secret access key>'
)
┌─id───────────────────────────────────┬─status─────────┐
│ de442b75-a66c-4a3c-a193-f76f278c70f3 │ BACKUP_CREATED │
└──────────────────────────────────────┴────────────────┘

データの追加

増分バックアップには、ベースバックアップとバックアップ対象テーブルの現在の内容との差分が格納されます。増分バックアップを取得する前に、さらにデータを追加します:

INSERT INTO test_db.test_table SELECT *
FROM generateRandom('key Int, value String, array Array(String)')
LIMIT 100

増分バックアップの取得

このバックアップコマンドはベースバックアップと似ていますが、SETTINGS base_backupとベースバックアップの場所が追加されています。増分バックアップの保存先はベースと同じディレクトリではなく、同じエンドポイントでバケット内の異なるターゲットディレクトリであることに注意してください。ベースバックアップはmy_backupにあり、増分はmy_incrementalに書き込まれます:

BACKUP TABLE test_db.test_table TO S3(
'https://backup-ch-docs.s3.us-east-1.amazonaws.com/backups/incremental_backup',
'<access key id>',
'<secret access key>'
)
SETTINGS base_backup = S3(
'https://backup-ch-docs.s3.us-east-1.amazonaws.com/backups/base_backup',
'<access key id>',
'<secret access key>'
)
┌─id───────────────────────────────────┬─status─────────┐
│ f6cd3900-850f-41c9-94f1-0c4df33ea528 │ BACKUP_CREATED │
└──────────────────────────────────────┴────────────────┘

増分バックアップからの復元

このコマンドは、増分バックアップを新しいテーブルtest_table_restoredに復元します。
増分バックアップを復元する際、ベースバックアップも含まれることに注意してください。 復元時には増分バックアップのみを指定します:

RESTORE TABLE data AS test_db.test_table_restored FROM S3(
'https://backup-ch-docs.s3.us-east-1.amazonaws.com/backups/incremental_backup',
'<access key id>',
'<secret access key>'
)
┌─id───────────────────────────────────┬─status───┐
│ ff0c8c39-7dff-4324-a241-000796de11ca │ RESTORED │
└──────────────────────────────────────┴──────────┘

件数の検証

元のテーブルdataには2回の挿入が行われ、1回目は1,000行、2回目は100行で、合計1,100行です。 復元されたテーブルに1,100行が含まれていることを検証します:

SELECT count()
FROM test_db.test_table_restored
┌─count()─┐
│    1100 │
└─────────┘

内容の検証

元のテーブルtest_tableの内容と復元されたテーブルtest_table_restoredの内容を比較します:

SELECT throwIf((
   SELECT groupArray(tuple(*))
   FROM test_db.test_table
   ) != (
   SELECT groupArray(tuple(*))
   FROM test_db.test_table_restored
), 'Data does not match after BACKUP/RESTORE')