- DETACH PARTITION|PART — 파티션 또는 파트를
detached디렉터리로 이동하고 메타데이터에서 분리합니다. - DROP PARTITION|PART — 파티션 또는 파트를 삭제합니다.
- DROP DETACHED PARTITION|PART -
detached에서 파트 또는 파티션에 속한 모든 파트를 삭제합니다. - FORGET PARTITION — 비어 있는 경우 ZooKeeper에서 파티션 메타데이터를 삭제합니다.
- ATTACH PARTITION|PART —
detached디렉터리에 있는 파티션 또는 파트를 테이블에 추가합니다. - ATTACH PARTITION FROM — 한 테이블의 데이터 파티션을 다른 테이블로 복사해 추가합니다.
- REPLACE PARTITION — 한 테이블의 데이터 파티션을 다른 테이블로 복사해 교체합니다.
- MOVE PARTITION TO TABLE — 데이터 파티션을 한 테이블에서 다른 테이블로 이동합니다.
- CLEAR COLUMN IN PARTITION — 파티션에서 지정한 컬럼의 값을 재설정합니다.
- CLEAR INDEX IN PARTITION — 파티션에서 지정한 보조 인덱스를 재설정합니다.
- FREEZE PARTITION — 파티션의 백업을 생성합니다.
- UNFREEZE PARTITION — 파티션의 백업을 제거합니다.
- FETCH PARTITION|PART — 다른 서버에서 파트 또는 파티션을 다운로드합니다.
- MOVE PARTITION|PART — 파티션/데이터 파트를 다른 디스크 또는 볼륨으로 이동합니다.
- UPDATE IN PARTITION — 조건에 따라 파티션 내부 데이터를 업데이트합니다.
- DELETE IN PARTITION — 조건에 따라 파티션 내부 데이터를 삭제합니다.
- REWRITE PARTS — 테이블의 파트(또는 특정 파티션)를 완전히 재작성합니다.
DETACH PARTITION|PART
detached 디렉터리로 이동합니다. 서버는 분리된 데이터 파티션이 없는 것처럼 해당 파티션을 더 이상 인식하지 않습니다. ATTACH 쿼리를 실행하기 전까지는 서버가 이 데이터를 알지 못합니다.
예시:
detached 디렉터리에 있는 데이터를 원하는 대로 처리할 수 있습니다. 파일 시스템에서 삭제하거나 그대로 둘 수 있습니다.
이 쿼리는 복제되며, 모든 레플리카의 detached 디렉터리로 데이터를 이동합니다. 이 쿼리는 리더 레플리카에서만 실행할 수 있습니다. 레플리카가 리더인지 확인하려면 system.replicas 테이블에 SELECT 쿼리를 수행하십시오. 또는 모든 레플리카에서 DETACH 쿼리를 실행하는 편이 더 쉽습니다. 그러면 리더 레플리카를 제외한 모든 레플리카에서 예외가 발생합니다(여러 리더가 허용됨).
DROP PARTITION|PART
분리된 PARTITION|PART 삭제
detached에서 제거합니다.
파티션 표현식을 설정하는 방법에 대한 자세한 내용은 파티션 표현식을 설정하는 방법 섹션을 참조하십시오.
FORGET PARTITION
ATTACH PARTITION|PART
detached 디렉터리에서 테이블에 데이터를 추가합니다. 전체 파티션이나 개별 파트의 데이터를 추가할 수 있습니다. 예시:
detached 디렉터리에 데이터가 있는지 확인합니다.
데이터가 있으면 해당 데이터의 무결성을 검사합니다. 모두 정상이면 데이터를 테이블에 추가합니다.
ATTACH 명령을 받은 비이니시에이터 레플리카가 자체 detached 폴더에서 올바른 체크섬을 가진 파트를 찾으면, 다른 레플리카에서 가져오지 않고 데이터를 ATTACH합니다.
올바른 체크섬을 가진 파트가 없으면, 해당 파트를 보유한 임의의 레플리카에서 데이터를 다운로드합니다.
한 레플리카의 detached 디렉터리에 데이터를 넣고 ALTER ... ATTACH 쿼리를 사용하여 모든 레플리카의 테이블에 추가할 수 있습니다.
ATTACH PARTITION FROM
table1의 데이터 파티션을 table2로 복사합니다.
다음 사항에 유의하십시오:
table1과table2어느 쪽에서도 데이터는 삭제되지 않습니다.table1은 임시 테이블일 수 있습니다.
- 두 테이블의 구조가 동일해야 합니다.
- 두 테이블은 동일한 파티션 키, 동일한 ORDER BY 키, 동일한 프라이머리 키를 가져야 합니다.
- 두 테이블은 동일한 스토리지 정책을 가져야 합니다.
- 대상 테이블에는 원본 테이블의 모든 인덱스와 프로젝션이 포함되어야 합니다. 대상 테이블에서
enforce_index_structure_match_on_partition_manipulation설정이 활성화되어 있으면 인덱스와 프로젝션이 완전히 동일해야 합니다. 그렇지 않으면 대상 테이블은 원본 테이블의 인덱스와 프로젝션을 모두 포함하는 상위 집합일 수 있습니다.
REPLACE PARTITION
table1에서 table2로 복사하고, table2의 기존 파티션을 대체합니다. 이 작업은 원자적으로 수행됩니다.
다음 사항에 유의하십시오.
table1의 데이터는 삭제되지 않습니다.table1은 임시 테이블일 수 있습니다.
- 두 테이블의 구조가 동일해야 합니다.
- 두 테이블의 파티션 키, ORDER BY 키, 프라이머리 키가 모두 동일해야 합니다.
- 두 테이블의 스토리지 정책이 동일해야 합니다.
- 대상 테이블에는 원본 테이블의 모든 인덱스와 프로젝션이 포함되어야 합니다. 대상 테이블에서
enforce_index_structure_match_on_partition_manipulation설정이 enabled 상태이면 인덱스와 프로젝션이 완전히 동일해야 합니다. 그렇지 않으면 대상 테이블은 원본 테이블의 인덱스와 프로젝션을 모두 포함하는 상위 집합일 수 있습니다.
MOVE PARTITION TO TABLE
table_source의 데이터를 삭제하면서 데이터 파티션을 table_source에서 table_dest로 이동합니다.
쿼리가 성공적으로 실행되려면 다음 조건을 충족해야 합니다.
- 두 테이블의 구조가 동일해야 합니다.
- 두 테이블의 파티션 키, ORDER BY 키, 프라이머리 키가 동일해야 합니다.
- 두 테이블의 스토리지 정책이 동일해야 합니다.
- 두 테이블은 동일한 엔진 계열(복제된 또는 비복제된)이어야 합니다.
- 대상 테이블에는 원본 테이블의 모든 인덱스와 프로젝션이 포함되어야 합니다. 대상 테이블에서
enforce_index_structure_match_on_partition_manipulation설정이 활성화되어 있으면 인덱스와 프로젝션이 완전히 동일해야 합니다. 그렇지 않으면 대상 테이블은 원본 테이블의 인덱스와 프로젝션을 모두 포함하는 상위 집합이어도 됩니다.
PARTITION에서 COLUMN 비우기
DEFAULT 절이 정의되어 있으면, 이 쿼리는 컬럼 값을 지정된 기본값으로 설정합니다.
예시:
FREEZE PARTITION
PARTITION 절을 생략하면 모든 파티션의 백업을 한 번에 생성합니다.
전체 백업 과정은 서버를 중지하지 않고 수행됩니다.
2019)를 지정할 수 있습니다. 그러면 해당하는 모든 파티션의 백업이 생성됩니다. 파티션 표현식 설정 방법은 파티션 표현식 설정 방법 섹션을 참조하십시오.
실행 시점에 데이터 스냅샷을 만들기 위해, 이 쿼리는 테이블 데이터의 하드링크를 생성합니다. 하드링크는 /var/lib/clickhouse/shadow/N/... 디렉터리에 배치되며, 각 항목의 의미는 다음과 같습니다.
/var/lib/clickhouse/는 구성에 지정된 ClickHouse 작업 디렉터리입니다.N은 백업의 순차 번호입니다.WITH NAME매개변수가 지정된 경우, 순차 번호 대신'backup_name'매개변수의 값이 사용됩니다.
테이블의 데이터 저장에 여러 디스크를 사용하는 경우,
shadow/N 디렉터리가 모든 디스크에 생성되며 PARTITION 표현식에 해당하는 데이터 파트가 저장됩니다./var/lib/clickhouse/ 내부와 동일한 디렉터리 구조가 생성됩니다. 이 쿼리는 모든 파일에 대해 chmod를 실행하여 쓰기를 금지합니다.
백업을 만든 후 /var/lib/clickhouse/shadow/의 데이터를 원격 서버로 복사한 다음 로컬 서버에서 삭제할 수 있습니다. ALTER t FREEZE PARTITION 쿼리는 복제되지 않습니다. 이 쿼리는 로컬 서버에만 로컬 백업을 생성합니다.
이 쿼리는 백업을 거의 즉시 생성합니다(단, 먼저 해당 테이블에 대해 현재 실행 중인 쿼리가 끝날 때까지 기다립니다).
ALTER TABLE t FREEZE PARTITION는 데이터만 복사하며, 테이블 메타데이터는 복사하지 않습니다. 테이블 메타데이터도 백업하려면 /var/lib/clickhouse/metadata/database/table.sql 파일을 복사하십시오.
백업에서 데이터를 복원하려면 다음 단계를 수행하십시오.
- 테이블이 없으면 생성합니다. 생성 쿼리를 확인하려면 .sql 파일을 사용하십시오(파일 안의
ATTACH를CREATE로 바꾸십시오). - 백업 내부의
data/database/table/디렉터리에서/var/lib/clickhouse/data/database/table/detached/디렉터리로 데이터를 복사합니다. ALTER TABLE t ATTACH PARTITION쿼리를 실행하여 데이터를 테이블에 추가합니다.
max_threads 설정으로 조정됩니다.
백업 및 데이터 복원에 대한 자세한 내용은 “ClickHouse의 백업 및 복원” 섹션을 참조하십시오.
UNFREEZE PARTITION
frozen 파티션을 디스크에서 제거합니다. PARTITION 절을 생략하면 모든 파티션의 백업이 한 번에 제거됩니다.
CLEAR INDEX IN PARTITION
CLEAR COLUMN과 유사하게 동작하지만, 컬럼 데이터 대신 인덱스를 재설정합니다.
FETCH PARTITION|PART
- 지정된 세그먼트에서 파티션|파트를 다운로드합니다. ‘path-in-zookeeper’에는 ZooKeeper에서 해당 세그먼트의 경로를 지정해야 합니다.
- 그런 다음 다운로드한 데이터를
table_name테이블의detached디렉터리에 저장합니다. ATTACH PARTITION|PART 쿼리를 사용해 데이터를 테이블에 추가하십시오.
- FETCH PARTITION
- FETCH PART
ALTER ... FETCH PARTITION|PART쿼리는 복제되지 않습니다. 파트 또는 파티션은 로컬 server의detached디렉터리에만 배치됩니다.ALTER TABLE ... ATTACH쿼리는 복제됩니다. 모든 레플리카에 데이터가 추가됩니다. 데이터는detached디렉터리에서 레플리카 중 하나에 추가되고, 나머지 레플리카에는 인접한 레플리카로부터 추가됩니다.
ALTER TABLE이지만, 실제로는 테이블 구조를 변경하지 않으며 테이블에서 사용할 수 있는 데이터도 즉시 바꾸지 않습니다.
MOVE PARTITION|PART
MergeTree 엔진 테이블의 파티션 또는 데이터 파트를 다른 볼륨이나 디스크로 이동합니다. 자세한 내용은 데이터 저장을 위해 여러 블록 디바이스 사용하기를 참조하십시오.
ALTER TABLE t MOVE 쿼리:
- 레플리카마다 서로 다른 스토리지 정책을 사용할 수 있으므로 복제되지 않습니다.
- 지정된 디스크 또는 볼륨이 구성되어 있지 않으면 오류를 반환합니다. 또한 스토리지 정책에 지정된 데이터 이동 조건을 적용할 수 없는 경우에도 오류를 반환합니다.
- 이동할 데이터가 백그라운드 프로세스, 동시에 실행되는
ALTER TABLE t MOVE쿼리 또는 백그라운드 데이터 병합에 의해 이미 이동된 경우에도 오류를 반환할 수 있습니다. 이 경우 사용자는 추가 작업을 수행할 필요가 없습니다.
UPDATE IN PARTITION
예시
관련 항목
DELETE IN PARTITION
예시
파트 재작성
use_const_adaptive_granularity와 같은 테이블 수준 설정이 기본적으로 새로 작성되는 파트에만 적용되기 때문입니다.
예시
관련 항목
파티션 표현식을 지정하는 방법
ALTER ... PARTITION 쿼리에서는 파티션 표현식을 여러 방식으로 지정할 수 있습니다.
system.parts테이블의partition컬럼 값으로 지정합니다. 예를 들어ALTER TABLE visits DETACH PARTITION 201901입니다.ALL키워드를 사용합니다. 이 방법은 DROP/DETACH/ATTACH/ATTACH FROM에서만 사용할 수 있습니다. 예를 들어ALTER TABLE visits ATTACH PARTITION ALL입니다.- 테이블의 파티셔닝 키 튜플과 타입이 일치하는 표현식 또는 상수의 튜플로 지정합니다. 파티셔닝 키가 단일 요소인 경우에는 표현식을
tuple (...)함수로 감싸야 합니다. 예를 들어ALTER TABLE visits DETACH PARTITION tuple(toYYYYMM(toDate('2019-01-25')))입니다. - 파티션 ID를 사용합니다. 파티션 ID는 파티션의 문자열 식별자이며, 가능하면 사람이 읽기 쉬운 형식으로 파일 시스템과 ZooKeeper에서 파티션 이름으로 사용됩니다. 파티션 ID는
PARTITION ID절에서 작은따옴표로 지정해야 합니다. 예를 들어ALTER TABLE visits DETACH PARTITION ID '201901'입니다. - ALTER ATTACH PART 및 DROP DETACHED PART 쿼리에서 파트 이름을 지정하려면 system.detached_parts 테이블의
name컬럼 값을 문자열 리터럴로 사용합니다. 예를 들어ALTER TABLE visits ATTACH PART '201901_1_1_0'입니다.
String 타입은 이름을 따옴표(')로 감싸서 지정해야 합니다. Date 및 Int* 타입은 따옴표가 필요하지 않습니다.
위의 모든 규칙은 OPTIMIZE 쿼리에도 동일하게 적용됩니다. 파티셔닝되지 않은 테이블을 최적화할 때 유일한 파티션만 지정해야 한다면 PARTITION tuple() 표현식을 사용하십시오. 예를 들어:
IN PARTITION은 ALTER TABLE 쿼리에서 UPDATE 또는 DELETE 표현식이 적용될 파티션을 지정합니다. 새 파트는 지정된 파티션에서만 생성됩니다. 따라서 테이블이 많은 파티션으로 나뉘어 있고 데이터의 일부만 업데이트하면 되는 경우 IN PARTITION을 사용하면 부하를 줄일 수 있습니다.
ALTER ... PARTITION 쿼리 예시는 테스트 00502_custom_partitioning_local 및 00502_custom_partitioning_replicated_zookeeper에서 확인할 수 있습니다.