본문으로 건너뛰기
최종 수정: 에

다른 TP 시스템에서 데이터 마이그레이션

이 문서는 MySQL, SQL Server, Oracle, PostgreSQL과 같은 기존 트랜잭션(OLTP / TP) 데이터베이스에서 Apache Doris로 데이터를 마이그레이션하는 방법을 설명합니다. Doris는 일회성 마이그레이션, 오프라인 일괄 동기화, 실시간 증분 동기화를 포괄하는 여러 데이터 적재 옵션을 제공합니다.

마이그레이션 옵션 개요​

다음 표에는 Doris가 지원하는 주요 마이그레이션 옵션이 요약되어 있습니다. 데이터 볼륨, 동기화 지연 시간 요구 사항, CDC(변경 데이터 캡처) 필요 여부에 따라 옵션을 선택할 수 있습니다.

옵션적용 시나리오동기화 모드전체 데이터베이스 지원증분 / CDC 지원
Multi-Catalog일회성 마이그레이션, 임시 쿼리, CTAS 테이블 생성오프라인 / 필요 시SQL로 구현아니요
Flink Doris Connector (JDBC)Flink 스택에서의 오프라인 일괄 동기화오프라인아니요아니요
Flink Doris Connector (CDC)실시간 전체 + 증분 동기화실시간지원지원(INSERT / UPDATE / DELETE)
Spark ConnectorSpark 스택에서의 일괄 데이터 쓰기오프라인아니요아니요
Streaming JobDoris에 내장된 MySQL / PostgreSQL 지속 동기화스트리밍(지속)지원지원
타사 도구(NineData / DataX / SeaTunnel / CloudCanal)기존 동기화 플랫폼, 시각적 운영오프라인 / 실시간지원지원

참고: 외부 컴퓨팅 엔진을 도입하지 않고 마이그레이션을 완료해야 한다면 Multi-Catalog 또는 Streaming Job을 사용하세요. 실시간 증분 동기화가 필요하다면 Flink Doris Connector + CDC, Streaming Job, 또는 MySQL 호환 소스에서 Doris로 사용할 수 있는 NineData를 사용하세요.


JDBC Catalog를 사용해 TP 데이터베이스의 테이블을 Doris의 외부 테이블로 매핑한 다음, INSERT INTO 또는 CREATE TABLE AS SELECT (CTAS)를 사용해 데이터를 적재합니다.

단계​

  1. 원본 TP 데이터베이스를 가리키는 JDBC Catalog를 생성합니다.
  2. INSERT INTO를 사용해 기존 Doris 테이블에 쓰거나, CTAS를 사용해 테이블을 생성하고 데이터를 한 단계로 적재합니다.
  3. 행 수와 필드 일관성을 확인합니다.

예시: MySQL에서 데이터 마이그레이션​

CREATE CATALOG mysql_catalog properties(
'type' = 'jdbc',
'user' = 'root',
'password' = '123456',
'jdbc_url' = 'jdbc:mysql://host:3306/mysql_db',
'driver_url' = 'mysql-connector-java-8.0.25.jar',
'driver_class' = 'com.mysql.cj.jdbc.Driver'
);

-- Load into an existing table with INSERT INTO
INSERT INTO internal.doris_db.tbl1
SELECT * FROM mysql_catalog.mysql_db.table1;

-- Create the table and load data in one step with CTAS
CREATE TABLE internal.doris_db.tbl1
PROPERTIES('replication_num' = '1')
AS
SELECT * FROM mysql_catalog.mysql_db.table1;

자세한 내용은 Catalog 데이터 적재를 참조하세요.


Flink를 사용하면 TP 시스템 동기화를 오프라인 일괄 모드 또는 실시간 증분 모드로 실행할 수 있습니다.

이 옵션은 Flink 스택에서 오프라인으로 데이터를 이동하는 데 적합합니다. 다음 Flink SQL 예시는 해당 패턴을 보여 줍니다.

CREATE TABLE student_source (
id INT,
name STRING,
age INT,
PRIMARY KEY (id) NOT ENFORCED
) WITH (
'connector' = 'jdbc',
'url' = 'jdbc:mysql://localhost:3306/mydatabase',
'table-name' = 'students',
'username' = 'username',
'password' = 'password'
);

CREATE TABLE student_sink (
id INT,
name STRING,
age INT
)
WITH (
'connector' = 'doris',
'fenodes' = '127.0.0.1:8030',
'table.identifier' = 'test.students',
'username' = 'root',
'password' = 'password',
'sink.label-prefix' = 'doris_label'
);

INSERT into student_sink select * from student_source;

자세한 내용은 Flink JDBC를 참조하세요.

Flink CDC를 사용하면 하나의 작업에서 전체 데이터를 읽고 증분 변경을 캡처할 수 있으며, INSERT / UPDATE / DELETE 이벤트를 동기화할 수 있습니다.

단일 테이블 실시간 동기화 예시​

SET 'execution.checkpointing.interval' = '10s';

CREATE TABLE cdc_mysql_source (
id int
,name VARCHAR
,PRIMARY KEY (id) NOT ENFORCED
) WITH (
'connector' = 'mysql-cdc',
'hostname' = '127.0.0.1',
'port' = '3306',
'username' = 'root',
'password' = 'password',
'database-name' = 'database',
'table-name' = 'table'
);

-- Supports synchronization of INSERT / UPDATE / DELETE events
CREATE TABLE doris_sink (
id INT,
name STRING
)
WITH (
'connector' = 'doris',
'fenodes' = '127.0.0.1:8030',
'table.identifier' = 'database.table',
'username' = 'root',
'password' = '',
'sink.properties.format' = 'json',
'sink.properties.read_json_by_line' = 'true',
'sink.enable-delete' = 'true', -- Synchronize delete events
'sink.label-prefix' = 'doris_label'
);

insert into doris_sink select id,name from cdc_mysql_source;

전체 데이터베이스 / 다중 테이블 동기화​

TP 데이터베이스의 전체 데이터베이스 또는 다중 테이블을 동기화할 때 Flink Doris Connector는 스키마 동기화와 데이터 쓰기를 한 단계로 수행하는 즉시 사용 가능한 전체 데이터베이스 동기화 기능을 제공합니다.

<FLINK_HOME>bin/flink run \
-Dexecution.checkpointing.interval=10s \
-Dparallelism.default=1 \
-c org.apache.doris.flink.tools.cdc.CdcTools \
lib/flink-doris-connector-1.16-24.0.1.jar \
mysql-sync-database \
--database test_db \
--mysql-conf hostname=127.0.0.1 \
--mysql-conf port=3306 \
--mysql-conf username=root \
--mysql-conf password=123456 \
--mysql-conf database-name=mysql_db \
--including-tables "tbl1|test.*" \
--sink-conf fenodes=127.0.0.1:8030 \
--sink-conf username=root \
--sink-conf password=123456 \
--sink-conf jdbc-url=jdbc:mysql://127.0.0.1:9030 \
--sink-conf sink.label-prefix=label \
--table-conf replication_num=1

자세한 내용은 전체 데이터베이스 동기화를 참조하세요.


옵션 3: Spark Connector​

이 옵션은 이미 Spark를 사용해 일괄 처리를 수행하는 시나리오에 적합합니다. Spark Connector의 JDBC Source를 사용해 TP 데이터베이스에서 읽고 Doris Sink를 사용해 Doris에 쓸 수 있습니다.

val jdbcDF = spark.read
.format("jdbc")
.option("url", "jdbc:postgresql:dbserver")
.option("dbtable", "schema.tablename")
.option("user", "username")
.option("password", "password")
.load()

jdbcDF.write.format("doris")
.option("doris.table.identifier", "db.table")
.option("doris.fenodes", "127.0.0.1:8030")
.option("user", "root")
.option("password", "")
.save()

관련 문서:


옵션 4: Streaming Job(Doris에 내장된 지속 동기화)​

Doris는 외부 컴퓨팅 엔진에 의존하지 않고 MySQL 또는 PostgreSQL에서 데이터를 지속적으로 동기화하는 내장 Streaming Job 기능을 제공합니다.

다중 테이블 동기화 예시​

CREATE JOB multi_table_sync
ON STREAMING
FROM MYSQL (
"jdbc_url" = "jdbc:mysql://127.0.0.1:3306",
"driver_url" = "mysql-connector-j-8.0.31.jar",
"driver_class" = "com.mysql.cj.jdbc.Driver",
"user" = "root",
"password" = "123456",
"database" = "test",
"include_tables" = "user_info,order_info",
"offset" = "initial"
)
TO DATABASE target_test_db (
"table.create.properties.replication_num" = "1"
)

자세한 내용은 Postgres / MySQL 지속 적재를 참조하세요.


옵션 5: 타사 동기화 도구​

앞서 설명한 기본 제공 옵션 외에도 커뮤니티 프로젝트나 공급업체가 제공하는 타사 동기화 도구를 사용해 데이터를 마이그레이션할 수 있습니다. 특히 이미 동기화 플랫폼을 사용하고 있거나 시각적 인터페이스를 통해 작업을 관리하려는 경우에 적합합니다.


FAQ​

Q1: MySQL 테이블 몇 개를 Doris로 일회성 마이그레이션하려면 어떤 옵션을 선택해야 하나요?

Multi-Catalog을 사용하세요. JDBC Catalog를 생성한 후 INSERT INTO 또는 CTAS를 실행하면 추가 구성 요소 없이 마이그레이션을 완료할 수 있습니다.

Q2: MySQL에서 Doris로 증분 데이터(UPDATE / DELETE 포함)를 실시간으로 동기화하려면 어떻게 해야 하나요?

Flink Doris Connector + Flink CDC를 사용하고 Doris Sink에서 sink.enable-delete = true를 활성화하거나, Doris에 내장된 Streaming Job을 사용해 지속적으로 동기화하세요.

Q3: 전체 MySQL 데이터베이스를 한 단계로 Doris에 동기화하려면 어떻게 해야 하나요?

Flink Doris Connector의 mysql-sync-database 전체 데이터베이스 동기화 기능 또는 Streaming Job의 다중 테이블 동기화 기능을 사용하세요. 두 옵션 모두 스키마와 데이터를 한 단계로 동기화합니다.

Q4: Oracle, SQL Server, PostgreSQL도 원본 데이터베이스로 지원되나요?

예. Multi-Catalog와 Flink / Spark Connector는 각각의 JDBC 드라이버를 통해 Oracle, SQL Server, PostgreSQL과 같은 TP 데이터베이스를 지원합니다. Streaming Job은 현재 MySQL과 PostgreSQL을 지원합니다.

Q5: 마이그레이션 중 Doris 테이블의 복제본 수를 어떻게 지정하나요?

PROPERTIES('replication_num' = 'N')을 CTAS 문에 지정하거나, Flink 전체 데이터베이스 동기화 명령에서 --table-conf replication_num=N을 전달하세요.