> ## Documentation Index
> Fetch the complete documentation index at: https://private-7c7dfe99-fix-nav-issues.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

> ClickHouse Backup 및 복원 개요

# S3 엔드포인트로 또는 S3 엔드포인트에서 BACKUP / RESTORE

이 문서에서는 S3 엔드포인트를 통해 S3 버킷으로 Backup하거나 S3 버킷에서 복원하는 방법을 설명합니다.

<div id="syntax">
  ## 구문
</div>

```sql theme={null}
-- 핵심 명령어
BACKUP | RESTORE 
--- 백업/복원 대상 (또는 제외 대상)
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 ...]
[ASYNC]
```

**각 명령에 대한 자세한 내용은 ["명령 요약"](/ko/concepts/features/backup-restore/overview#command-summary)을 확인하십시오.**

<div id="usage-examples">
  ## 사용 예시
</div>

<div id="incremental-backup-to-an-s3-endpoint">
  ### S3 엔드포인트에 증분 Backup
</div>

이 예시에서는 S3 엔드포인트에 Backup을 생성한 다음, 다시 해당 Backup에서 복원합니다.

<Note>
  전체 Backup과 증분 Backup의 차이점에 대한 설명은 ["백업 유형"](/ko/concepts/features/backup-restore/overview#backup-types)을 참조하십시오.
</Note>

이 메서드를 사용하려면 다음 정보가 필요합니다:

| 매개변수     | 예시                                                           |
| -------- | ------------------------------------------------------------ |
| S3 엔드포인트 | `https://backup-ch-docs.s3.us-east-1.amazonaws.com/backups/` |
| 액세스 키 ID | `BKIOZLE2VYN3VXXTP9RC`                                       |
| 비밀 액세스 키 | `40bwYnbqN7xU8bVePaUCh3+YEyGXu8UOMV9ANpwL`                   |

<Tip>
  S3 버킷을 생성하는 방법은 ["S3 객체 스토리지를 ClickHouse 디스크로 사용"](/ko/integrations/connectors/data-ingestion/AWS/integrating-s3-with-clickhouse#configuring-s3-for-clickhouse-use) 섹션에서 설명합니다.
</Tip>

Backup 대상은 다음과 같이 지정합니다:

```sql theme={null}
S3('<s3 endpoint>/<directory>', '<access key id>', '<secret access key>', '<extra_credentials>')
```

<br />

<Steps>
  <Step>
    #### 설정

    다음 데이터베이스와 테이블을 생성하고 여기에 무작위 데이터를 몇 건 삽입하세요:

    ```sql theme={null}
    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()
    ```

    ```sql theme={null}
    INSERT INTO test_db.test_table SELECT *
    FROM generateRandom('key Int, value String, array Array(String)')
    LIMIT 1000
    ```
  </Step>

  <Step>
    #### 기준 백업 생성

    증분 백업을 수행하려면 시작점이 되는 *기준* 백업이 필요합니다. S3 대상의 첫 번째 매개변수는 S3 엔드포인트이며, 그다음에는
    이 백업에 사용할 버킷 내 디렉터리가 지정됩니다. 이 예시에서 디렉터리 이름은 `my_backup`입니다.

    기준 백업을 생성하려면 다음 명령을 실행하세요:

    ```sql theme={null}
    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>'
    )
    ```

    ```response theme={null}
    ┌─id───────────────────────────────────┬─status─────────┐
    │ de442b75-a66c-4a3c-a193-f76f278c70f3 │ BACKUP_CREATED │
    └──────────────────────────────────────┴────────────────┘
    ```
  </Step>

  <Step>
    #### 데이터 더 추가하기

    증분 백업에는 기준 백업과
    백업 대상 테이블의 현재 내용 간 차이가 반영됩니다. 증분 백업을
    수행하기 전에 데이터를 더 추가하십시오:

    ```sql theme={null}
    INSERT INTO test_db.test_table SELECT *
    FROM generateRandom('key Int, value String, array Array(String)')
    LIMIT 100
    ```
  </Step>

  <Step>
    #### 증분 백업 수행

    이 백업 명령은 기준 백업과 유사하지만, `SETTINGS base_backup`과 기준 백업의 위치를 추가로 지정합니다. 증분 백업의 대상은 기준 백업과 같은 디렉터리가 아닙니다. 동일한 endpoint를 사용하지만, 버킷 내에서는 다른 대상 디렉터리를 사용합니다. 기준 백업은 `my_backup`에 있고, 증분 백업은 `my_incremental`에 기록됩니다:

    ```sql theme={null}
    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>'
    )
    ```

    ```response theme={null}
    ┌─id───────────────────────────────────┬─status─────────┐
    │ f6cd3900-850f-41c9-94f1-0c4df33ea528 │ BACKUP_CREATED │
    └──────────────────────────────────────┴────────────────┘
    ```
  </Step>

  <Step>
    #### 증분 백업에서 복원

    이 명령은 증분 백업을 새 테이블 `test_table_restored`로 복원합니다.
    증분 백업을 복원하면 기준 백업도 함께 복원됩니다.
    복원할 때는 **증분 백업**만 지정하십시오:

    ```sql theme={null}
    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>'
    )
    ```

    ```response theme={null}
    ┌─id───────────────────────────────────┬─status───┐
    │ ff0c8c39-7dff-4324-a241-000796de11ca │ RESTORED │
    └──────────────────────────────────────┴──────────┘
    ```
  </Step>

  <Step>
    #### 개수 확인

    원본 테이블 `data`에는 2번 삽입되었습니다. 한 번은 1,000행, 다른 한 번은 100행으로, 총 1,100행입니다.
    복원된 테이블에 1,100행이 있는지 확인하십시오:

    ```sql theme={null}
    SELECT count()
    FROM test_db.test_table_restored
    ```

    ```response theme={null}
    ┌─count()─┐
    │    1100 │
    └─────────┘
    ```
  </Step>

  <Step>
    #### 내용 확인

    원본 테이블 `test_table`의 내용과 복원된 테이블 `test_table_restored`의 내용을 비교합니다:

    ```sql theme={null}
    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')
    ```
  </Step>
</Steps>
