ATTACH

ATTACH

예를 들어 데이터베이스를 다른 서버로 이동할 때, 테이블이나 딕셔너리를 연결(attach)해요.

출처: 문서

본문

Syntax

ATTACH TABLE|DICTIONARY|DATABASE [IF NOT EXISTS] [db.]name [ON CLUSTER cluster] ...

이 쿼리는 디스크에 데이터를 만들지 않고, 데이터가 이미 적절한 위치에 있다고 가정하며, 지정된 테이블, 딕셔너리 또는 데이터베이스에 대한 정보를 서버에 추가해요. ATTACH 쿼리를 실행한 후 서버는 테이블, 딕셔너리 또는 데이터베이스의 존재를 알게 됩니다.

테이블이 이전에 분리(DETACH 쿼리)되었다면 구조가 알려져 있으므로, 구조를 정의하지 않는 축약형을 사용할 수 있어요.

Attach Existing Table

Syntax

ATTACH TABLE [IF NOT EXISTS] [db.]name [ON CLUSTER cluster]

이 쿼리는 서버를 시작할 때 사용돼요. 서버는 테이블 메타데이터를 ATTACH 쿼리가 담긴 파일로 저장하며, 실행 시 이 쿼리들을 그냥 실행합니다(서버에 명시적으로 생성되는 일부 시스템 테이블은 제외).

테이블이 영구적으로 분리되었다면 서버 시작 시 다시 연결되지 않으므로, 명시적으로 ATTACH 쿼리를 사용해야 해요.

Create New Table And Attach Data

With Specified Path to Table Data

이 쿼리는 제공된 구조로 새 테이블을 만들고 user_files의 제공된 디렉터리에서 테이블 데이터를 연결해요. 이 쿼리에는 READ ON FILEWRITE ON FILE 권한이 필요합니다. 디렉터리를 읽어 새 테이블의 데이터 경로로 이동시키기 때문이에요.

Syntax

ATTACH TABLE name FROM 'path/to/data/' (col1 Type1, ...)

Example

DROP TABLE IF EXISTS test;
INSERT INTO TABLE FUNCTION file('01188_attach/test/data.TSV', 'TSV', 's String, n UInt8') VALUES ('test', 42);
ATTACH TABLE test FROM '01188_attach/test' (s String, n UInt8) ENGINE = File(TSV);
SELECT * FROM test;
┌─s────┬──n─┐
│ test │ 42 │
└──────┴────┘

With Specified Table UUID

이 쿼리는 제공된 구조로 새 테이블을 만들고 지정된 UUID를 가진 테이블에서 데이터를 연결해요. Atomic 데이터베이스 엔진에서 지원됩니다.

Syntax

ATTACH TABLE name UUID '<uuid>' (col1 Type1, ...)

Attach MergeTree table as ReplicatedMergeTree

비복제 MergeTree 테이블을 ReplicatedMergeTree로 연결할 수 있어요. ReplicatedMergeTree 테이블은 default_replica_pathdefault_replica_name 설정의 값으로 생성됩니다. 복제 테이블을 일반 MergeTree로 연결하는 것도 가능해요.

이 쿼리에서 ZooKeeper의 테이블 데이터는 영향을 받지 않는다는 점에 유의하세요. 즉, attach 후 SYSTEM RESTORE REPLICA로 ZooKeeper에 메타데이터를 추가하거나 SYSTEM DROP REPLICA ... FROM ZKPATH ...로 지워야 해요.

기존 ReplicatedMergeTree 테이블에 리플리카를 추가하려고 한다면, 변환된 MergeTree 테이블의 모든 로컬 데이터가 분리(detached)된다는 점을 명심하세요.

Syntax

ATTACH TABLE [db.]name AS [NOT] REPLICATED

테이블을 복제로 변환

DETACH TABLE test;
ATTACH TABLE test AS REPLICATED;
SYSTEM RESTORE REPLICA test;

테이블을 비복제로 변환

테이블의 ZooKeeper 경로와 리플리카 이름을 가져와요.

SELECT replica_name, zookeeper_path FROM system.replicas WHERE table='test';
┌─replica_name─┬─zookeeper_path─────────────────────────────────────────────┐
│ r1           │ /clickhouse/tables/401e6a1f-9bf2-41a3-a900-abb7e94dff98/s1 │
└──────────────┴────────────────────────────────────────────────────────────┘

테이블을 비복제로 연결하고 ZooKeeper에서 리플리카의 데이터를 삭제해요.

DETACH TABLE test;
ATTACH TABLE test AS NOT REPLICATED;
SYSTEM DROP REPLICA 'r1' FROM ZKPATH '/clickhouse/tables/401e6a1f-9bf2-41a3-a900-abb7e94dff98/s1';

Attach Existing Dictionary

이전에 분리된 딕셔너리를 연결해요.

Syntax

ATTACH DICTIONARY [IF NOT EXISTS] [db.]name [ON CLUSTER cluster]

Attach Existing Database

이전에 분리된 데이터베이스를 연결해요.

Syntax

ATTACH DATABASE [IF NOT EXISTS] name [ENGINE=<database engine>] [ON CLUSTER cluster]

더 알아보기 (Learn more)