원자적 테이블 교체
Doris는 두 OLAP 테이블 간의 원자적 교체를 지원합니다. 단일 ALTER TABLE 문으로 테이블 이름을 서로 바꾸거나 테이블 전체를 교체할 수 있어, 기존의 "먼저 삭제한 다음 데이터를 적재하는" 방식에서 발생하는 쿼리 가용성 공백을 방지합니다.
적용 시나리오
중간에 "데이터가 비어 있는" 상태를 노출하지 않고 테이블의 모든 데이터를 다시 써야 하는 워크로드에는 원자적 테이블 교체를 사용합니다.
| 시나리오 | 권장 방법 |
|---|---|
| 테이블 전체 재작성(예: 오프라인 전체 백필) | CREATE TABLE LIKE로 새 테이블을 생성하고 새 데이터를 적재한 다음 기존 테이블을 원자적으로 교체합니다 |
| 특정 파티션만 교체 | 임시 파티션을 참조하세요 |
| 롤백을 위해 기존 테이블 유지 | swap = true를 사용합니다. 기존 테이블 데이터가 새 테이블 이름 아래로 이동합니다 |
| 교체 후 기존 테이블을 유지할 필요가 없음 | swap = false를 사용합니다. 기존 테이블이 즉시 삭제됩니다 |
작업 절차
"기존 테이블 tbl1을 새 데이터로 교체하는 작업"을 예로 들면, 표준 절차는 다음과 같습니다.
-
기존 테이블의 스키마를 기반으로 새 테이블을 생성합니다.
CREATE TABLE tbl2 LIKE tbl1; -
새 테이블
tbl2에 새 데이터를 적재합니다. -
원자적 교체를 실행합니다.
ALTER TABLE tbl1 REPLACE WITH TABLE tbl2
[PROPERTIES('swap' = 'true')]; -
swap매개변수에 따라 결과를 확인합니다(자세한 내용은 아래 참조).
구문
ALTER TABLE [db.]tbl1 REPLACE WITH TABLE tbl2
[PROPERTIES('swap' = 'true')];
의미: 테이블 tbl1을 테이블 tbl2로 교체합니다. swap 매개변수는 교체 후 기존 테이블을 처리하는 방식을 제어합니다.
swap 매개변수의 동작
| swap 값 | 교체 후 tbl1의 데이터 | 교체 후 tbl2의 상태 | 일반적인 용도 |
|---|---|---|---|
true(기본값) | tbl2의 원래 데이터 | 유지되며 tbl1의 원래 데이터를 포함함(두 테이블이 서로 교환됨) | 롤백이나 비교를 위해 기존 데이터 유지 |
false | tbl2의 원래 데이터 | 삭제되며 복구할 수 없음 | 새 데이터만 필요하고 기존 테이블은 폐기해도 되는 경우 |
동작 원리
원자적 교체는 여러 DDL 단계를 하나의 원자적 작업으로 통합합니다. 외부에서는 순간적으로 전환되는 것처럼 보입니다.
-
swap = true인 경우:- 테이블 B의 이름을 테이블 A로 변경합니다.
- 테이블 A의 이름을 테이블 B로 변경합니다.
-
swap = false인 경우:- 테이블 A를 삭제합니다.
- 테이블 B의 이름을 테이블 A로 변경합니다.
이 단계들은 메타데이터 계층에서 하나의 원자적 트랜잭션으로 실행되므로, 외부 쿼리에는 중간 상태가 노출되지 않습니다.
참고 사항
- 교체는 두 OLAP 테이블 사이에서만 지원됩니다. 다른 테이블 유형은 지원되지 않습니다.
- 시스템은 두 테이블의 스키마가 동일한지 검증하지 않습니다. 스키마 호환성은 직접 확인해야 합니다.
swap = false인 경우, 교체된 기존 테이블은 즉시 삭제되며 복구할 수 없습니다. 이 옵션은 신중하게 사용하세요.- 교체해도 권한 설정은 변경되지 않습니다. 권한은 테이블 이름을 기준으로 확인하기 때문입니다. 교체 후 새 테이블은 원래 테이블 이름에 연결된 권한을 자동으로 상속합니다.
자주 묻는 질문
질문1: 교체 시 이미 실행 중인 쿼리도 영향을 받나요?
답변: 교체는 메타데이터 계층에서 수행되는 원자적 작업입니다. 이미 요청된 쿼리는 원래 테이블 데이터를 대상으로 실행을 완료하고, 새 쿼리는 교체 후의 데이터에 접근합니다.
질문2: 열, 인덱스 또는 파티션이 서로 다른 두 테이블도 교체할 수 있나요?
답변: 가능합니다. 시스템은 스키마 일치 여부를 검증하지 않지만, 스키마 호환성을 유지하는 것이 좋습니다. 그렇지 않으면 열 이름이나 타입 변경으로 인해 다운스트림 쿼리와 애플리케이션에서 오류가 발생할 수 있습니다.
질문3: 교체 후 원래 테이블 데이터를 복구할 수 있나요?
답변: swap = true인 경우, 원래 테이블 데이터가 기존 tbl2 이름 아래에 보존되므로 복구할 수 있습니다. swap = false인 경우, 원래 테이블이 삭제되었으므로 복구할 수 없습니다.
질문4: 파티션에도 원자적 교체를 사용할 수 있나요?
답변: 가능합니다. 파티션 단위로 원자적 덮어쓰기를 수행하려면 임시 파티션 기능을 사용하세요.
관련 문서
- 임시 파티션: 파티션 단위 원자적 덮어쓰기
CREATE TABLE LIKE: 기존 테이블 스키마를 기반으로 새 테이블을 빠르게 생성