AlloyDB로 데이터 내보내기 (역방향 ETL)

이 문서에서는 BigQuery에서 PostgreSQL용 AlloyDB로 역방향 추출, 변환, 로드 (역방향 ETL) 워크플로를 설정하는 방법을 설명합니다. EXPORT DATA을 사용하여 이 작업을 수행할 수 있습니다.

시작하기 전에

  • 내보낸 데이터를 수신할 데이터베이스, 스키마, 테이블을 포함하는 AlloyDB 클러스터 및 인스턴스를 만듭니다. 내보내기 작업을 실행하기 전에 대상 스키마와 테이블이 있어야 합니다.

  • 타겟 AlloyDB 인스턴스는 READY 상태의 PRIMARY 인스턴스여야 합니다.

  • AlloyDB 인스턴스에 연결하려면 BigQuery 연결을 만드세요. 연결은 사용자 이름과 비밀번호로 인증되어야 합니다. 연결에 지정된 데이터베이스 사용자에게 대상 테이블에 대한 INSERT 권한과 대상 스키마에 대한 USAGE 권한이 있어야 합니다.

  • BigQuery Enterprise 또는 Enterprise Plus 등급 예약을 만듭니다.

  • 사용자에게 이 문서의 각 작업을 수행하는 데 필요한 권한을 부여하는 Identity and Access Management(IAM) 역할을 부여하세요.

필요한 역할

BigQuery 데이터를 AlloyDB로 내보내는 데 필요한 권한을 얻으려면 관리자에게 프로젝트에 대한 다음 IAM 역할을 부여해 달라고 요청하세요.

역할 부여에 대한 자세한 내용은 프로젝트, 폴더, 조직에 대한 액세스 관리를 참조하세요.

커스텀 역할이나 다른 사전 정의된 역할을 통해 필요한 권한을 얻을 수도 있습니다.

제한사항

  • AlloyDB 내보내기는 일괄 내보내기만 지원합니다. 연속 쿼리를 사용하여 AlloyDB로 내보낼 수는 없습니다.

  • AlloyDB로 내보낸 데이터는 새 행으로만 추가됩니다. 내보내기 프로세스는 AlloyDB 내의 기존 레코드를 수정하거나 삭제하지 않습니다. 대상 테이블에 PRIMARY KEY 또는 UNIQUE 제약 조건이 정의되어 있지 않으면 동일한 데이터를 여러 번 내보내면 중복 항목이 발생합니다.

  • 데이터 무결성을 보장하려면 AlloyDB 테이블에 PRIMARY KEY 또는 UNIQUE 제약 조건을 정의하는 것이 좋습니다. 내보내기 작업은 고유한 일치 키가 있는 경우 기존 레코드를 업데이트하는 '업서트'를 실행하지 않습니다. 수신되는 행이 PRIMARY KEY 또는 UNIQUE 제약 조건을 위반하면 전체 내보내기 작업이 실패합니다.

  • 동일한 AlloyDB 테이블에 여러 개의 동시 EXPORT DATA 작업을 실행하지 않는 것이 좋습니다. 이렇게 하면 데이터 손실이나 작업 실패와 같은 예측할 수 없는 동작이 발생할 수 있습니다. 한 번에 하나의 내보내기 작업만 특정 테이블에 쓰도록 확인하는 것이 좋습니다.

  • BigQuery 연결을 통한 사용자 이름 및 비밀번호 인증만 지원됩니다.

  • ARRAY, BYTES, GEOGRAPHY, INTERVAL, STRUCT BigQuery 데이터 유형은 지원되지 않습니다.

  • BigQuery SELECT 문에서 대상 AlloyDB 테이블에 있는 열을 생략하는 경우 해당 열은 NULL 값을 허용하거나 AlloyDB에 정의된 기본값이 있어야 합니다. NOT NULL 제약 조건이 있고 기본값이 없는 경우 내보내기가 실패합니다.

  • AlloyDB로 내보내기는 BigQuery Enterprise 또는 Enterprise Plus 버전에서만 지원됩니다. BigQuery Standard 버전 및 주문형 컴퓨팅에서는 지원되지 않습니다. 자세한 내용은 관리 기능을 참고하세요.

  • AlloyDB로의 추출 작업과 같은 BigQuery 작업은 최대 6시간 동안 지속됩니다. 내보내기 크기가 매우 큰 경우 내보내기를 여러 개의 작은 작업으로 나누는 것이 좋습니다.

위치 고려사항

AlloyDB로 데이터를 내보내는 데는 BigQuery 데이터 세트와 AlloyDB 인스턴스의 위치에 관한 특정 요구사항이 있습니다.

  • 동일한 리전 내보내기: 대상 AlloyDB 인스턴스가 BigQuery 데이터 세트와 정확히 동일한 Google Cloud 리전에 있어야 합니다. 예를 들어 us-east1의 데이터 세트는 us-east1의 AlloyDB 인스턴스로만 내보낼 수 있습니다.

  • 멀티 리전 내보내기:

    • US 멀티 리전의 데이터 세트는 us-central1 리전에 있는 AlloyDB 인스턴스로만 내보낼 수 있습니다.
    • EU 멀티 리전의 데이터 세트는 europe-west4 리전에 있는 AlloyDB 인스턴스로만 내보낼 수 있습니다.

앞서 언급한 조합 이외의 리전 간 내보내기는 지원되지 않습니다.

alloydb_options으로 내보내기 구성

alloydb_options 옵션을 사용하여 대상 AlloyDB 스키마, 테이블, 최대 연결 수를 지정할 수 있습니다. 구성은 JSON 문자열로 표현됩니다. table 매개변수만 필수이고 다른 매개변수는 모두 선택사항입니다.

내보내기를 구성할 때 SELECT 문의 열에는 대상 AlloyDB 테이블의 열 이름과 일치하는 별칭이 있어야 합니다.

EXPORT DATA
  WITH CONNECTION `PROJECT_ID.LOCATION.CONNECTION_ID`
  OPTIONS(
    format='ALLOYDB',
    uri="https://alloydb.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/clusters/CLUSTER_ID/instances/INSTANCE_ID",
    alloydb_options="""{
      "schema": "SCHEMA_NAME",
      "table": "TABLE_NAME",
      "max_parallel_connections": MAX_CONNECTIONS
    }"""
  )
AS SELECT * FROM `mydataset.table1`;

다음을 바꿉니다.

  • PROJECT_ID: Google Cloud 프로젝트의 이름입니다.
  • LOCATION: 연결 및 타겟 인스턴스의 위치입니다.
  • CONNECTION_ID: BigQuery 연결의 이름입니다.
  • CLUSTER_ID: AlloyDB 클러스터의 이름입니다.
  • INSTANCE_ID: 대상 AlloyDB 인스턴스의 이름입니다.
  • SCHEMA_NAME (선택사항): AlloyDB의 대상 스키마 이름입니다. 제공되지 않으면 데이터베이스 사용자에 대해 구성된 기본 스키마가 사용됩니다.
  • TABLE_NAME: 스키마 접두사 없이 AlloyDB에 있는 기존 대상 테이블의 이름입니다.
  • MAX_CONNECTIONS (선택사항): BigQuery 작업자에서 AlloyDB 인스턴스로의 동시 병렬 연결의 최대 수입니다. 연결을 제한하면 대규모 내보내기 중에 타겟 인스턴스가 과부하되는 것을 방지할 수 있습니다.

데이터 내보내기

EXPORT DATA을 사용하여 데이터를 BigQuery 테이블에서 AlloyDB 테이블로 내보낼 수 있습니다.

다음 예시에서는 mydataset.table1이라는 테이블에서 선택한 필드를 my_target_table이라는 AlloyDB 테이블로 내보냅니다.

EXPORT DATA
  WITH CONNECTION `myproject.us-central1.my-alloydb-conn`
  OPTIONS (
    format='ALLOYDB',
    uri="https://alloydb.googleapis.com/v1/projects/myproject/locations/us-central1/clusters/my-cluster/instances/my-instance",
    alloydb_options="""{
      "schema": "public",
      "table": "my_target_table"
    }"""
  )
AS SELECT
  col1 AS id,
  col2 AS name,
  col3 AS value
FROM
  `mydataset.table1`;

가격 책정

EXPORT DATA 문을 사용하여 데이터를 AlloyDB로 내보내면 BigQuery 용량 계산 가격 책정을 사용하여 요금이 청구됩니다.

데이터를 내보낸 후 AlloyDB에 데이터를 저장하는 데는 요금이 청구됩니다. 자세한 내용은 PostgreSQL용 AlloyDB 가격 책정을 참고하세요.