Embulk에서 MySQL에서 PostgreSQL로 데이터 전송

소개



다른 RDBMS간에 데이터를 전송하는 작업이 발생했습니다.
조사하고 있는 가운데, 지금 게다가 Embulk를 알았으므로 그 사용법의 메모입니다.
이번에는 MySQL -> PostgreSQL 데이터로드를 수행합니다.

Embulk이란?



공식 GitHub

Embulk is a parallel bulk data loader that helps data transfer between various storages, databases, NoSQL and cloud services.
Embulk supports plugins to add functions. You can share the plugins to keep your custom scripts readable, maintainable, and reusable.

자쿠리 설명하면
  • Embulk는 대량의 데이터를 병렬로로드하는 도구입니다.
  • 로드의 입출력처는 스토리지, 데이터베이스, NoSQL이나 클라우드 서비스가 대응
  • 플러그인을 사용하여 기능을 추가 할 수 있습니다

  • 환경 구축



    Docker를 사용하여 환경을 구축합니다.

    전제


  • Docker, docker-compose 설치됨

  • 디렉토리 구성


    embulk
    ├── Dockerfile
    ├── docker-compose.yml
    ├── mysql
    │   └── init
    │       ├── 01_database.sql
    │       └── 02_mock_data.sql
    └── postgres
        └── init
            └── 01_database.sql
    

    데이터베이스



    docker-compose를 이용하여 MySQL과 PostgreSQl을 구축합니다.

    docker-compose.yml
    version: "3"
    services:
      mysql:
        image: mysql
        ports:
          - "3306:3306"
        volumes:
          - ./mysql/init:/docker-entrypoint-initdb.d
        command: --default-authentication-plugin=mysql_native_password
        environment:
          MYSQL_ROOT_PASSWORD: root
    
      postgres:
        image: postgres
        ports:
          - "5432:5432"
        environment:
          POSTGRES_USER: root
          POSTGRES_PASSWORD: root
        volumes:
          - ./postgres/init:/docker-entrypoint-initdb.d/
    
      adminer:
        image: adminer
        ports:
          - 8080:8080
    

    데이터베이스 초기화



    MySQL

    여기 에서 샘플 데이터 sql을 다운로드합니다.

    mysql/init/01_database.sql
    create database embulk_in;
    

    mysql/init/02_mock_data.sql
    se embulk_in;
    
    create table MOCK_DATA (
        id INT,
        first_name VARCHAR(50),
        last_name VARCHAR(50),
        email VARCHAR(50),
        gender VARCHAR(50),
        ip_address VARCHAR(20)
    );
    insert into MOCK_DATA (id, first_name, last_name, email, gender, ip_address) values (1, 'August', 'Stribling', '[email protected]', 'Male', '11.65.224.59');
    insert into MOCK_DATA (id, first_name, last_name, email, gender, ip_address) values (2, 'Ian', 'Danovich', '[email protected]', 'Male', '135.187.239.143');
    ...
    

    PostgreSQL



    postgres/init/01_database.sql
    create database embulk_out;
    

    embulk



    Embulk용 Dockerfile을 만듭니다.

    여기 를 참고로 Dockerfile을 작성합니다.

    Dockerfile
    FROM openjdk:8-jre-alpine
    
    # install Embulk
    RUN wget -q https://dl.embulk.org/embulk-latest.jar -O /bin/embulk \
        && chmod +x /bin/embulk
    
    # add plugin
    RUN apk add --no-cache libc6-compat \
        && embulk gem install embulk-input-mysql \
        && embulk gem install embulk-output-postgresql 
    
    WORKDIR /embulk
    
    ENTRYPOINT ["java", "-jar", "/bin/embulk"]
    

    플러그인


  • embulk-input-mysql
  • MySQL 입력용

  • embulk-output-postgresql
  • PostgreSQL output


  • 시작



    embulk 의 이미지 작성과 컨테이너를 기동시킵니다.
    # embulkのイメージを作成
    docker build -y embulk .
    # MySQLとPostgreSQLのコンテナを起動
    docker-compose up -d
    

    확인



    Adminer에서 MySQL 데이터를 확인합니다.




    로드



    구성 파일 작성



    MySQL에서 PostgreSQL로 데이터를로드하는 구성 파일을 만듭니다.

    embulk/seed.yml
    in:
      type: mysql
      host: {localhostのプライベートアドレス}
      user: root
      password: "root"
      database: embulk_in
      table: MOCK_DATA
    out:
      type: postgresql
      host: {localhostのプライベートアドレス}
      user: root
      password: "root"
      database: embulk_out
      table: MOCK_DATA
      mode: insert
      column_options:
        id: { type: "INT" }
        first_name: { type: " VARCHAR(50)" }
        last_name: { type: " VARCHAR(50)" }
        email: { type: " VARCHAR(50)" }
        gender: { type: " VARCHAR(50)" }
        ip_address: { type: " VARCHAR(20)" }
    

    실행



    로드합니다.
    # seed.ymlから完全なコンフィグファイルを生成
    docker run --rm -it -v $(pwd):/embulk embulk guess seed.yml -o config.yml
    # dry run
    docker run --rm -it -v $(pwd):/embulk embulk preview config.yml
    # 実行
    docker run --rm -it -v $(pwd):/embulk embulk run config.yml
    

    확인



    Adminer에서 PostgreSQL 데이터를 확인합니다.




    끝에



    이용하고 싶은 플러그인이 없어도(Hive라든지), JDBC만 있으면 embulk-input-jdbc 등으로 로드할 수 있어 이용 범위가 넓다고 느꼈습니다.

    좋은 웹페이지 즐겨찾기