본문으로 건너뛰기

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

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

기본 정보
  • 예상 소요 시간: 30분
  • 권장 운영 체제: MacOS, Ubuntu
  • Region: kr-central-2
  • 사전 준비 사항

시나리오 소개

이번 시나리오에서는 PostgreSQL에서 카카오클라우드 MySQL로 데이터를 이관하는 방법을 소개합니다. 주요 내용은 다음과 같습니다.

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

시나리오 구성 아키텍처

안내

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

사전 작업

1. 네트워크 환경 구축

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

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

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

    구분항목설정/입력값
    VPC 정보VPC 이름tutorial
    VPC IP 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. 카카오클라우드 콘솔 > Beyond Compute Service > Virtual Machine 메뉴로 이동합니다.

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

    구분항목설정/입력값비고
    기본 정보이름tutorial-migration
    개수1
    이미지Ubuntu 20.04
    인스턴스 타입m2a.large
    볼륨루트 볼륨20
    키 페어{USER_KEYPAIR}⚠️ 키 페어는 최초 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@{tutorial-migraton-public-ip}
    항목설명
    {private_key}프라이빗 키 파일 이름
    {tutorial-migration-public-ip}Virtual Machine > 인스턴스 메뉴에서 생성한 tutorial-migration 인스턴스 클릭 후, Network 탭에서 확인 가능
  4. 다음 명령어를 통해 마이그레이션 인스턴스를 설정합니다.

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

    sudo apt-get install php -y

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

    unzip pg2mysql-1.9.zip

Step 2. PostgreSQL 데이터 덤프 생성

pg_dump 덤프(PostgreSQL Dump)는 데이터베이스의 데이터를 백업하거나 이식하기 위해 사용하는 유틸리티이자 명령어입니다.

  1. 아래 명령어를 실행하여 PostgreSQL 덤프를 생성합니다.

    pg_dump -U postgres -h 127.0.0.1 -p 5432 {DATABASE_NAME} -n public --format=p > {PG_DUMP_FILE_NAME}.sql
  2. PostgreSQL 덤프를 MySQL 덤프로 변환합니다.

    php pg2mysql_cli.php {PG_DUMP_FILE_NAME}.sql {MYSQL_DUMP_FILE_NAME}.sql innodb
  3. 변환된 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";

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

    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);
    예시: 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";
    SET time_zone="+00:00";

    -- 데이터베이스 생성
    CREATE databases {DATABASE_NAME};

    -- 데이터베이스 선택
    USE {DATABASE_NAME};

    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);
    안내

    카카오클라우드 MySQL에는 데이터를 임포트할 데이터베이스가 없기 때문에 CREATE를 진행합니다.

Step 3. 카카오클라우드 MySQL 인스턴스에 데이터 임포트

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

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

Step 4. 데이터 정합성 확인

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

mysql> use {DATABASE_NAME};
Database changed

mysql> select * from {TABLE};