BigQuery 대상 구성

이 페이지에서는 Datastream을 사용하여 소스 데이터베이스에서 데이터를 스트리밍하도록 BigQuery 대상을 구성하는 방법을 설명합니다.

대상 데이터 세트 구성

BigQuery 대상에 대한 데이터 세트를 구성할 때 다음 옵션 중 하나를 선택할 수 있습니다.

  • 각 스키마를 위한 데이터 세트: 소스의 스키마 이름에 따라 지정된 BigQuery 위치에서 데이터 세트를 선택하거나 만듭니다. 그 결과 Datastream은 소스의 각 스키마에 대해 BigQuery에 데이터 세트를 자동으로 만듭니다.

    이 옵션을 선택하면 Datastream이 스트림이 포함된 프로젝트에 데이터 세트를 만듭니다.

    예를 들어 MySQL 소스가 있고 이 소스에 mydb 데이터베이스가 있고 데이터베이스 내에 employees 테이블이 있으면 Datastream이 BigQuery에서 mydb 데이터 세트 및 employees 테이블을 만듭니다.

  • 모든 스키마를 위한 단일 데이터 세트: 스트림의 BigQuery 데이터 세트를 선택할 수 있습니다. Datastream은 모든 데이터를 이 데이터 세트로 스트리밍합니다. 선택한 데이터 세트에 대해 Datastream이 모든 테이블을 <schema>_<table>로 만듭니다.

    예를 들어 MySQL 소스가 있고 이 소스에 mydb 데이터베이스가 있고 데이터베이스 내에 employees 테이블이 있으면 Datastream이 선택한 데이터 세트에서 mydb_employees 테이블을 만듭니다.

쓰기 동작

Datastream이 BigQuery 대상에 기록된 각 테이블에 datastream_metadata라는 STRUCT 열을 추가합니다.

테이블의 소스에 기본 키가 있으면 열에 다음 필드가 포함됩니다.

  • UUID: 이 필드에는 string 데이터 유형이 있습니다.
  • SOURCE_TIMESTAMP: 이 필드에는 integer 데이터 유형이 있습니다.

테이블에 기본 키가 없으면 열에 추가 필드(IS_DELETED)가 포함됩니다. 이 필드에는 boolean 데이터 유형이 포함되며, Datastream이 대상으로 스트리밍하는 데이터가 소스의 DELETE 작업과 연결되어 있는지 여부를 나타냅니다. 기본 키가 없는 테이블은 추가만 가능합니다.

BigQuery로 데이터를 스트리밍할 때의 최대 이벤트 크기는 20MB입니다.

쓰기 모드 구성

스트림을 구성할 때 Datastream이 BigQuery에 변경 데이터를 기록하는 방법을 선택할 수 있습니다.

  • 병합: 기본 쓰기 모드입니다. 선택하면 BigQuery에 데이터가 소스 데이터베이스에 저장되는 방식이 반영됩니다. 즉, Datastream이 데이터의 모든 변경사항을 BigQuery에 기록한 후 BigQuery가 변경사항을 기존 데이터와 통합하여 소스 테이블의 복제본인 최종 테이블을 만듭니다. 병합 모드를 사용하면 변경 이벤트의 이전 레코드가 유지되지 않습니다. 예를 들어 행을 삽입한 후 업데이트하면 BigQuery는 업데이트된 데이터만 유지합니다. 그런 다음 소스 테이블에서 행을 삭제하면 BigQuery는 더 이상 해당 행의 레코드를 보관하지 않습니다.
  • 추가 전용: 추가 전용 쓰기 모드를 통해 BigQuery에 데이터를 변경 내역으로 추가할 수 있습니다(INSERT, UPDATE-INSERT, UPDATE-DELETE, DELETE 이벤트). 데이터의 이전 상태를 보존해야 하는 경우 이 모드를 사용하세요. 추가 전용 쓰기 모드를 더 잘 이해하려면 다음 시나리오를 고려하세요.
    • 초기 백필: 초기 백필 후에는 모든 이벤트가 동일한 타임스탬프, 범용 고유 식별자(UUID), 변경 시퀀스 넘버가 있는 INSERT 유형 이벤트로 BigQuery에 기록됩니다.
    • 기본 키 업데이트: 기본 키가 변경되면 BigQuery에 두 행이 기록됩니다.
      • 원래 기본 키가 있는 UPDATE-DELETE
      • 새 기본 키가 있는 UPDATE-INSERT
    • 행 업데이트: 행을 업데이트하면 단일 UPDATE-INSERT 행이 BigQuery에 기록됩니다.
    • 행 삭제: 행을 삭제하면 단일 DELETE 행이 BigQuery에 기록됩니다.

max_staleness 옵션으로 BigQuery 테이블 사용

Datastream은 거의 실시간 수집의 일환으로 데이터 업데이트, 삽입, 삭제와 같은 upsert 작업을 위한 BigQuery의 기본 지원 기능을 사용합니다. upsert 작업을 사용하면 행이 추가, 수정 또는 삭제될 때 BigQuery 대상을 동적으로 업데이트할 수 있습니다. Datastream은 BigQuery Storage Write API를 사용하여 이러한 upsert 작업을 대상 테이블로 스트리밍합니다.

데이터 비활성 한도 지정

BigQuery는 구성된 데이터 비활성 한도에 따라 지속적으로 또는 쿼리 실행 시 백그라운드에서 소스 수정사항을 적용합니다. Datastream이 BigQuery에서 새 테이블을 만들 때 스트림의 현재 데이터 비활성 한도 값에 따라 테이블의 max_staleness 옵션이 설정됩니다.

max_staleness 옵션과 함께 BigQuery 테이블을 사용하는 방법에 대한 자세한 내용은 테이블 비활성을 참조하세요.

BigQuery 비용 관리

BigQuery 비용은 Datastream과 별도로 청구됩니다. BigQuery 비용을 관리하는 방법은 BigQuery CDC 가격 책정을 참조하세요.

데이터 유형 매핑

다음 표에는 지원되는 소스 데이터베이스에서 BigQuery 대상으로의 데이터 유형 변환이 나와 있습니다.


소스 데이터베이스 소스 데이터 유형 BigQuery 데이터 유형
MySQL BIGINT(size) LONG
MySQL BIGINT (unsigned) DECIMAL
MySQL BINARY(size) STRING (hex encoded)
MySQL BIT(size) INT64
MySQL BLOB(size) STRING (hex encoded)
MySQL BOOL INT64
MySQL CHAR(size) STRING
MySQL DATE DATE
MySQL DATETIME(fsp) DATETIME
MySQL DECIMAL(precision, scale) 정밀도 값이 38 이하이고 배율 값이 9 이하이면 NUMERIC입니다. 그 외의 경우에는 BIGNUMERIC입니다.
MySQL DOUBLE(size, d) FLOAT64
MySQL ENUM(val1, val2, val3, ...) STRING
MySQL FLOAT(precision) FLOAT64
MySQL FLOAT(size, d) FLOAT64
MySQL INTEGER(size) INT64
MySQL

JSON

JSON
MySQL LONGBLOB STRING (hex encoded)
MySQL LONGTEXT STRING (hex encoded)
MySQL MEDIUMBLOB STRING (hex encoded)
MySQL MEDIUMINT(size) INT64
MySQL MEDIUMTEXT STRING
MySQL SET(val1, val2, val3, ...) STRING
MySQL SMALLINT(size) INT64
MySQL TEXT(size) STRING
MySQL TIME(fsp) INTERVAL
MySQL TIMESTAMP(fsp) TIMESTAMP
MySQL TINYBLOB STRING (hex encoded)
MySQL TINYINT(size) INT64
MySQL TINYTEXT STRING
MySQL VARBINARY(size) STRING (hex encoded)
MySQL VARCHAR STRING
MySQL YEAR INT64
Oracle ANYDATA UNSUPPORTED
Oracle BFILE STRING
Oracle BINARY DOUBLE FLOAT64
Oracle BINARY FLOAT FLOAT64
Oracle BLOB BYTES
Oracle CHAR STRING
Oracle CLOB STRING
Oracle DATE DATETIME
Oracle DOUBLE PRECISION FLOAT64
Oracle FLOAT(p) FLOAT64
Oracle INTERVAL DAY TO SECOND UNSUPPORTED
Oracle INTERVAL YEAR TO MONTH UNSUPPORTED
Oracle LONG/LONG RAW STRING
Oracle NCHAR STRING
Oracle NCLOB STRING
Oracle NUMBER STRING
Oracle NUMBER(precision=*) STRING
Oracle NUMBER(precision, scale<=0) p<=18이면 INT64입니다. 18<p=<78인 경우 매개변수화된 10진수 유형에 매핑합니다. p>=79인 경우 STRING에 매핑합니다.
Oracle NUMBER(precision, scale>0) 0<p=<78이면 매개변수화된 십진수 유형에 매핑합니다. p>=79인 경우 STRING에 매핑합니다.
Oracle NVARCHAR2 STRING
Oracle RAW STRING
Oracle ROWID STRING
Oracle SDO_GEOMETRY UNSUPPORTED
Oracle SMALLINT INT64
Oracle TIMESTAMP TIMESTAMP
Oracle TIMESTAMP WITH TIME ZONE TIMESTAMP
Oracle UDT (user-defined type) UNSUPPORTED
Oracle UROWID STRING
Oracle VARCHAR STRING
Oracle VARCHAR2 STRING
Oracle XMLTYPE UNSUPPORTED
PostgreSQL ARRAY JSON
PostgreSQL BIGINT INT64
PostgreSQL BIT BYTES
PostgreSQL BIT_VARYING BYTES
PostgreSQL BOOLEAN BOOLEAN
PostgreSQL BOX UNSUPPORTED
PostgreSQL BYTEA BYTES
PostgreSQL CHARACTER STRING
PostgreSQL CHARACTER_VARYING STRING
PostgreSQL CIDR STRING
PostgreSQL CIRCLE UNSUPPORTED
PostgreSQL DATE DATE
PostgreSQL DOUBLE_PRECISION FLOAT64
PostgreSQL ENUM STRING
PostgreSQL INET STRING
PostgreSQL INTEGER INT64
PostgreSQL INTERVAL INTERVAL
PostgreSQL JSON JSON
PostgreSQL JSONB JSON
PostgreSQL LINE UNSUPPORTED
PostgreSQL LSEG UNSUPPORTED
PostgreSQL MACADDR STRING
PostgreSQL MONEY FLOAT64
PostgreSQL NUMERIC 정밀도가 -1이면 STRING입니다(BigQuery NUMERIC 유형에는 고정 정밀도가 필요함). 그 외의 경우에는 BIGNUMERIC/NUMERIC입니다. 자세한 내용은 PostgreSQL 문서의 임의 정밀도 숫자 섹션을 참조하세요.
PostgreSQL OID INT64
PostgreSQL PATH UNSUPPORTED
PostgreSQL POINT UNSUPPORTED
PostgreSQL POLYGON UNSUPPORTED
PostgreSQL REAL FLOAT64
PostgreSQL SMALLINT INT64
PostgreSQL SMALLSERIAL INT64
PostgreSQL SERIAL INT64
PostgreSQL TEXT STRING
PostgreSQL TIME TIME
PostgreSQL TIMESTAMP TIMESTAMP
PostgreSQL TIMESTAMP_WITH_TIMEZONE TIMESTAMP
PostgreSQL TIME_WITH_TIMEZONE TIME
PostgreSQL TSQUERY STRING
PostgreSQL TSVECTOR STRING
PostgreSQL TXID_SNAPSHOT STRING
PostgreSQL UUID STRING
PostgreSQL XML STRING
SQL Server BIGINT INT64
SQL Server BINARY BYTES
SQL Server BIT BOOL
SQL Server CHAR STRING
SQL Server DATE DATE
SQL Server DATETIME2 DATETIME
SQL Server DATETIME DATETIME
SQL Server DATETIMEOFFSET TIMESTAMP
SQL Server DECIMAL BIGNUMERIC
SQL Server FLOAT FLOAT64
SQL Server IMAGE BYTES
SQL Server INT INT64
SQL Server MONEY BIGNUMERIC
SQL Server NCHAR STRING
SQL Server NTEXT STRING
SQL Server NUMERIC BIGNUMERIC
SQL Server NVARCHAR STRING
SQL Server NVARCHAR(MAX) STRING
SQL Server REAL FLOAT64
SQL Server SMALLDATETIME DATETIME
SQL Server SMALLINT INT64
SQL Server SMALLMONEY NUMERIC
SQL Server TEXT STRING
SQL Server TIME TIME
SQL Server TIMESTAMP/ROWVERSION BYTES
SQL Server TINYINT INT64
SQL Server UNIQUEIDENTIFIER STRING
SQL Server VARBINARY BYTES
SQL Server VARBINARY(MAX) BYTES
SQL Server VARCHAR STRING
SQL Server VARCHAR(MAX) STRING
SQL Server XML STRING

PostgreSQL 배열을 BigQuery 배열 데이터 유형으로 쿼리

PostgreSQL 배열을 BigQueryARRAY 데이터 유형으로 쿼리하려는 경우 BigQuery JSON_VALUE_ARRAY 함수를 사용하여 JSON 값을 BigQuery 배열로 변환할 수 있습니다.

  SELECT ARRAY(SELECT CAST(element AS TYPE) FROM UNNEST(JSON_VALUE_ARRAY(BQ_COLUMN_NAME,'$')) AS element) AS array_col
  

다음을 바꿉니다.

  • TYPE: PostgreSQL 소스 배열의 요소 유형과 일치하는 BigQuery 유형입니다. 예를 들어 소스 유형이 BIGINT 값의 배열인 경우 TYPEINT64로 바꿉니다.

    데이터 유형을 매핑하는 방법에 대한 자세한 내용은 데이터 유형 매핑을 참조하세요.

  • BQ_COLUMN_NAME: BigQuery 테이블의 관련 열 이름입니다.

값을 변환하는 방식에는 두 가지 예외가 있습니다.

  • 소스 열의 BIT, BIT_VARYING 또는 BYTEA 값 배열에 대해 다음 쿼리를 실행합니다.

    SELECT ARRAY(SELECT FROM_BASE64(element) FROM UNNEST(JSON_VALUE_ARRAY(BQ_COLUMN_NAME,'$')) AS element) AS array_of_bytes
    
  • 소스 열의 JSON 또는 JSONB 값 배열의 경우 JSON_QUERY_ARRAY 함수를 사용합니다.

    SELECT ARRAY(SELECT element FROM UNNEST(JSON_QUERY_ARRAY(BQ_COLUMN_NAME,'$')) AS element) AS array_of_jsons
    

알려진 제한사항

BigQuery를 대상으로 사용할 경우의 알려진 제한사항은 다음과 같습니다.

  • Datastream 스트림과 동일한 Google Cloud 프로젝트에 있는 BigQuery 데이터 세트에만 데이터를 복제할 수 있습니다.
  • 소스 데이터베이스의 테이블에 기본 키(예: 사용자 ID)가 있고 테이블에 변경사항이 있어 기본 키가 다른 경우(이 예시에서는 기본 키가 사용자 ID가 됨). Datastream은 이 변경사항을 대상으로 스트리밍할 수 없습니다.

    Datastream이 수정된 기본 키가 있는 대상으로 테이블을 스트리밍하도록 하려면 다음 단계를 완료합니다.

    1. 소스 데이터베이스 테이블의 기본 키를 변경합니다.
    2. 스트림의 총 지연 시간 측정항목을 확인하고 적어도 현재 지연 시간만큼 기다려 진행 중인 이벤트가 대상에 기록되는지 확인합니다. 이렇게 하면 원래 기본 키를 사용하는 모든 이벤트가 성공적으로 스트리밍됩니다.
    3. 스트림을 일시중지합니다.
    4. 대상에서 테이블을 삭제합니다.
    5. 스트림을 재개합니다.
    6. 테이블에서 백필을 트리거합니다.
  • BigQuery의 기본 키는 다음 데이터 유형이어야 합니다.

    • DATE
    • BOOL
    • GEOGRAPHY
    • INT64
    • NUMERIC
    • BIGNUMERIC
    • STRING
    • TIMESTAMP
    • DATETIME

    지원되지 않는 데이터 유형의 기본 키가 포함된 테이블은 Datastream에서 복제되지 않습니다.

  • BigQuery는 ., $, /, @, + 문자가 있는 테이블 이름을 지원하지 않습니다. DataStream은 대상 테이블을 만들 때 이러한 문자를 밑줄로 바꿉니다.

    예를 들어 소스 데이터베이스의 table.name은 BigQuery에서 table_name이 됩니다.

    BigQuery의 테이블 이름에 대한 자세한 내용은 테이블 이름 지정을 참조하세요.

  • BigQuery는 4개를 초과하는 클러스터링 열을 지원하지 않습니다. 기본 키 열이 4개를 초과하는 테이블을 복제할 때 Datastream은 기본 키 열 4개를 클러스터링 열로 사용합니다.
  • Datastream은 PostgreSQL infinity 날짜 유형과 같은 범위를 벗어난 날짜 및 시간 리터럴을 다음 값에 매핑합니다.
    • 양수 DATE9999-12-31 값으로
    • 음수 DATE0001-01-01 값으로
    • 양수 TIMESTAMP9999-12-31 23:59:59.999000 UTC 값으로
    • 음수 TIMESTAMP0001-01-01 00:00:00 UTC 값으로
  • BigQuery는 FLOAT 또는 REAL 데이터 유형의 기본 키가 있는 스트리밍 테이블을 지원하지 않습니다. 이러한 테이블은 복제되지 않습니다.
  • BigQuery 날짜 유형 및 범위에 대한 자세한 내용은 데이터 유형을 참조하세요.