본문으로 건너뛰기

PostgreSQL에서 카카오클라우드 MySQL로 데이터 이관

PostgreSQL에서 카카오클라우드 MySQL로 데이터 마이그레이션하는 방법을 설명합니다.

기본 정보

시나리오 소개​

이번 시나리오에서는 PostgreSQL에서 카카오클라우드 MySQL로 데이터를 이관하는 방법을 소개합니다.

주요 내용은 다음과 같습니다.

  • 마이그레이션 환경 구성: 보안 그룹 설정과 마이그레이션을 위한 Bastion 호스트를 생성하여 데이터 이관을 준비합니다.
  • MySQL 데이터베이스 생성: 카카오클라우드 콘솔에서 관리형 MySQL 인스턴스를 생성합니다.
  • PostgreSQL 데이터 변환: pg_dump로 PostgreSQL 덤프를 생성한 후, pg2mysql 컨버터 툴로 MySQL 형식으로 변환합니다.
  • MySQL 데이터 임포트 및 검증: 변환된 데이터를 MySQL 인스턴스에 임포트하고 데이터 정합성을 확인합니다.

시나리오 구성 아키텍처

안내

pg2mysql 컨버터 툴은 PHP 기반으로 제공되는 오픈소스 소프트웨어로 자세한 정보는 공식 웹페이지를 참고해주시기 바랍니다.

시작하기 전에​

1. 네트워크 환경 구축​

카카오클라우드에서 데이터 이관 및 복제를 구축하기 전에 먼저 네트워크 환경 설정이 필요합니다. 아래 표의 항목과 값을 참조하여 VPC 및 퍼블릭 서브넷을 생성합니다.

  1. 카카오클라우드 콘솔 > Networking > VPC 메뉴로 이동합니다.

  2. 우측의 [+ VPC 생성] 버튼을 클릭한 후, 다음과 같이 VPC 및 서브넷을 생성합니다.

    구분항목설정/입력값
    VPC 정보VPC 이름tutorial
    VPC CIDR 블록10.0.0.0/16
    Availability Zone가용 영역 개수1
    첫 번째 AZkr-central-2-a
    서브넷 설정가용 영역당 퍼블릭 서브넷 개수1
    kr-central-2-a

    퍼블릭 서브넷 IPv4 CIDR 블록: 10.0.0.0/20

  3. 하단에 생성되는 토폴로지를 확인 후, 이상이 없다면 [생성] 버튼을 클릭합니다.

    • 서브넷의 상태는 Pending Create > Pending Update > Active 순서로 변경됩니다. Active 상태가 되어야 다음 단계를 진행할 수 있습니다.

2. 보안 그룹 설정​

보안 그룹 설정은 외부 불법 접근 차단과 필요한 트래픽 허용을 통해 데이터 안전성을 확보하고, 원활한 네트워크 통신을 위해 필요합니다.

보안 그룹: tutorial-bastion-sg
  1. 카카오클라우드 콘솔 > VPC > 보안 그룹 메뉴로 이동합니다. 아래 표를 참조하여 보안 그룹을 생성합니다.

    이름설명(선택)
    tutorial-bastion-sgBastion 호스트의 보안정책
  2. 하단의 [+ 추가하기] 버튼을 클릭한 뒤 인바운드 조건을 아래와 같이 설정하고 [적용] 버튼을 클릭합니다.

    추가할 인바운드 규칙항목설정값
    bastion inbound policy 1프로토콜TCP
    패킷 출발지{사용자 퍼블릭 IP}/32
    포트 번호5432
    정책 설명(선택)bastion inbound policy 1
    bastion inbound policy 2프로토콜TCP
    패킷 출발지{사용자 퍼블릭 IP}/32
    포트 번호22
    정책 설명(선택)bastion inbound policy 2

3. Bastion 호스트 설정​

Bastion 호스트는 클라우드 환경에서 데이터 이관 및 MySQL 접속을 위한 VM으로, 원격으로 클라우드 인스턴스에 안전하게 접근할 수 있는 게이트웨이 역할을 수행합니다.

  1. 카카오클라우드 콘솔 > Virtual Machine 메뉴로 이동합니다.

  2. 아래 표의 항목과 값을 참조하여 Bastion 호스트의 역할을 할 인스턴스를 생성합니다.

    구분항목설정/입력값비고
    기본 정보이름tutorial-migration
    개수1
    이미지Ubuntu 20.04
    인스턴스 타입m2a.large
    볼륨루트 볼륨20
    키 페어{PRIVATE_KEY}⚠️ 키 파일은 최초 1회 안전하게 보관해야 합니다.
    잃어버린 키는 복구할 수 없으며, 재발급이 필요합니다.
    네트워크VPCtutorial
    서브넷main (10.0.0.0/20)
    보안 그룹tutorial-bastion-sg

4. MySQL 데이터베이스 인스턴스 생성​

데이터 마이그레이션을 위한 MySQL 인스턴스를 생성합니다. 카카오클라우드의 MySQL은 완전 관리형 데이터베이스 서비스로, 복잡한 설치 없이 콘솔에서 간편하게 MySQL 인스턴스를 프로비저닝할 수 있습니다. 또한, 논리적으로 분리된 네트워크에서 안전하게 사용할 수 있습니다.

  1. 카카오클라우드 콘솔 > Data Store > MySQL 메뉴로 이동합니다.

  2. 인스턴스 그룹 탭에서 [인스턴스 그룹 생성] 버튼을 클릭한 뒤 다음을 참고하여 인스턴스 그룹을 생성합니다.

    구분항목설정/입력값비고
    기본 설정인스턴스 그룹 이름tutorial-mysql
    설명선택
    MySQL 설정엔진 버전지정된 값을 사용
    MySQL 사용자 이름admin
    MySQL 비밀번호root1234
    인스턴스 가용성/개수단일 (Primary 인스턴스)
    인스턴스 타입m2a.large
    스토리지 타입/크기100
    로그 스토리지 타입/크기100
    네트워크 설정VPCtutorial
    서브넷main(10.0.0.0/20)
    자동 백업자동 백업 옵션미사용

시작하기​

Step 1. 마이그레이션을 위한 인스턴스 설정​

  1. Virtual Machine > 인스턴스 탭에서 미리 생성해둔 MySQL 데이터베이스 인스턴스 tutorial-migration를 선택 후, 우측의 [퍼블릭 IP 연결] 버튼을 클릭하고 퍼블릭 IP를 할당합니다.

    • 연결된 Public IP는 네트워크 탭에서 확인할 수 있습니다.
  2. 로컬 환경에서 터미널 실행 후, cd 명령어를 사용하여 키 파일을 다운로드받은 폴더로 이동합니다.

    • 키 파일을 최초 생성해서 사용했다면, 기본적으로 다운로드 폴더에 저장됩니다. (cd ~/Downloads)
  3. 다음 명령어를 실행하여 SSH 접근합니다.

    chmod 400 {PRIVATE_KEY}.pem # 읽기 권한 부여
    ssh -i {PRIVATE_KEY}.pem ubuntu@{MIGRATION_PUBLIC_IP}
    항목설명
    {PRIVATE_KEY}키 파일 이름
    {MIGRATION_PUBLIC_IP}tutorial-migration 인스턴스의 퍼블릭 IP
  4. 다음 명령어를 통해 마이그레이션 인스턴스를 설정합니다.

    마이그레이션 인스턴스 설정
    sudo apt-get update -y

    sudo apt-get install php unzip postgresql mysql-client -y

    wget https://www.easyredmine.com/ER/media/knowledge-base/pg2mysql-1.9.zip

    unzip pg2mysql-1.9.zip

Step 2. PostgreSQL 데이터 덤프 생성​

  1. PostgreSQL에서 예제 테이블과 데이터를 먼저 준비합니다.

    예제 테이블 생성
    sudo -u postgres psql

    # psql 내에서 실행
    CREATE TABLE public.users (
    id INT NOT NULL,
    name VARCHAR(50),
    email VARCHAR(50)
    );

    INSERT INTO public.users (id, name, email) VALUES
    (1, 'Alice', 'alice@example.com'),
    (2, 'Bob', 'bob@example.com'),
    (3, 'Charlie', 'charlie@example.com');

    ALTER TABLE public.users
    ADD CONSTRAINT users_pkey PRIMARY KEY (id);

    -- 비밀번호 설정
    \password postgres

    -- 종료
    \q
  2. 준비한 테이블을 pg_dump로 추출합니다.

    덤프 파일 생성
    cd pg2mysql-1.9/

    pg_dump -U postgres -h 127.0.0.1 -p 5432 -n public \
    --format=p > PG_DUMP_FILE.sql
  3. 추출된 PostgreSQL 덤프 파일을 pg2mysql을 이용해 MySQL 호환 포맷으로 변환합니다.

    MySQL 변환
    php pg2mysql_cli.php PG_DUMP_FILE.sql MYSQL_DUMP_FILE.sql innodb
  4. 변환된 MySQL 파일을 아래와 같이 수정합니다.

    예시: MYSQL DUMP 파일 AS-IS
    # Converted with pg2mysql-1.9
    # Converted on Thu, 25 Jul 2024 05:11:47 +0000
    # Lightbox Technologies Inc. http://www.lightbox.ca

    SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
    -- SET time_zone="+00:00"; ← 일부 환경에서는 제거 필요
    예시: MySQL DUMP 파일 TO-BE
    # Converted with pg2mysql-1.9
    # Converted on Thu, 25 Jul 2024 05:11:47 +0000
    # Lightbox Technologies Inc. http://www.lightbox.ca

    SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";

    -- 데이터베이스 생성
    CREATE DATABASE psql_to_mysql;

    -- 데이터베이스 선택
    USE psql_to_mysql;

    CREATE TABLE users (
    id int(11) NOT NULL,
    name varchar(50),
    email varchar(50)
    ) ENGINE=innodb;

    INSERT INTO users (id, name, email) VALUES
    ('1', 'Alice', 'alice@example.com'),
    ('2', 'Bob', 'bob@example.com'),
    ('3', 'Charlie', 'charlie@example.com');

    ALTER TABLE users
    ADD CONSTRAINT users_pkey PRIMARY KEY (id);
    안내

    변환된 SQL 파일에는 MySQL에 맞는 테이블 생성문이 포함되어 있으나, 카카오클라우드 MySQL에는 기본 데이터베이스가 없기 때문에 CREATE DATABASE 구문을 통해 데이터베이스를 먼저 생성합니다.

Step 3. MySQL 인스턴스에 데이터 임포트​

카카오클라우드 MySQL 인스턴스에 MySQL 덤프 파일을 임포트합니다.

mysql -u {USER} -h {MYSQL_ENDPOINT} -p < MYSQL_DUMP_FILE.sql

Step 4. 데이터 정합성 확인​

카카오클라우드 MySQL에서 임포트한 데이터베이스의 데이터 정합성을 확인합니다.

카카오클라우드 MySQL 인스턴스 접속 및 데이터 확인
mysql -u {USER} -h {MYSQL_ENDPOINT} -p
MySQL 내 데이터 확인
mysql> use {DATABASE_NAME};
Database changed

mysql> select * from {TABLE_NAME};