덤프 파일을 사용하여 외부 데이터베이스에서 복제 설정

이 페이지에서는 외부 서버에서 만든 덤프 파일이 있는 경우 복제를 설정하는 프로세스를 설명합니다.

이 페이지의 모든 단계를 완료해야 합니다. 완료되면 다른 Cloud SQL 인스턴스와 동일한 방식으로 소스 표현 인스턴스를 관리하고 모니터링할 수 있습니다.

시작하기 전에

시작하기 전에 먼저 외부 서버를 구성하고, 소스 표현 인스턴스를 만들고, Cloud SQL 복제본을 설정해야 합니다.

복제 사용자의 권한 업데이트

외부 서버의 복제 사용자는 모든 호스트(%)의 연결을 수락하도록 구성되어 있습니다. 이 사용자 계정을 Cloud SQL 복제본에서만 사용할 수 있도록 업데이트해야 합니다. 외부 서버에서 터미널을 열고 다음 명령어를 입력합니다.

mysql 클라이언트

    UPDATE mysql.user
      SET Host='NEW_HOST'
      WHERE Host='OLD_HOST'
      AND User='USERNAME';
      GRANT REPLICATION SLAVE, EXECUTE
      ON *.* TO 'GCP_USERNAME'@'HOST';
    FLUSH PRIVILEGES;

예시

    UPDATE mysql.user
      SET Host='192.0.2.0'
      WHERE Host='%'
      AND User='replicationUser';
      GRANT REPLICATION SLAVE, EXECUTE
      ON *.* TO 'gcp_user'@'gmail.com';
    FLUSH PRIVILEGES;
속성 설명
NEW_HOST Cloud SQL 복제본의 발신 IP를 지정합니다.
OLD_HOST 변경하려는 Host에 지정된 현재 값입니다.
USERNAME 외부 서버의 복제 사용자 계정입니다.
GCP_USERNAME Google Cloud Platform(GCP) 사용자 계정의 사용자 이름입니다.
HOST Google Cloud Platform(GCP) 사용자 계정의 호스트 이름입니다.

복제 설정 확인

설정이 완료되면 Cloud SQL 복제본이 외부 서버에서 복제할 수 있는지 확인합니다.

먼저 외부 동기화 설정이 올바른지 확인합니다. 이를 위해 아래 명령어를 사용하여 확인합니다.

  • Cloud SQL 복제본과 외부 서버 간 연결
  • 사용자 권한 복제
  • 버전 호환성
  • Cloud SQL 복제본은 아직 복제하지 않습니다.
  • Binlog는 외부 서버에서 사용 설정되어 있습니다.
  • 전역 트랜잭션 식별자(GTID)가 사용 설정되었습니다.

터미널을 열고 다음 명령어를 입력하여 외부 동기화 설정이 올바른지 확인합니다.

curl

gcloud auth login
ACCESS_TOKEN="$(gcloud auth print-access-token)"
curl --header "Authorization: Bearer ${ACCESS_TOKEN}" \
     --header 'Content-Type: application/json' \
     --data '{
         "syncMode": "SYNC_MODE",
         "skipVerification": "SKIP_VERIFICATION"
       }' \
     -X POST \
     https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID/instances/REPLICA_INSTANCE/verifyExternalSyncSettings

예시

gcloud auth login
ACCESS_TOKEN="$(gcloud auth print-access-token)"
curl --header "Authorization: Bearer ${ACCESS_TOKEN}" \
     --header 'Content-Type: application/json' \
     --data '{
         "syncMode": "online",
       }' \
     -X POST \
     https://sqladmin.googleapis.com/sql/v1beta4/projects/myproject/instances/myreplica/verifyExternalSyncSettings
속성 설명
SYNC_MODE verifyExternalSyncSettings는 복제가 설정된 후 Cloud SQL 복제본과 외부 서버를 동기화 상태로 유지할 수 있는지 확인합니다. 동기화 모드에는 EXTERNAL_SYNC_MODE_UNSPECIFIED, ONLINE, OFFLINE이 있습니다.
SKIP_VERIFICATION 데이터를 동기화하기 전에 기본 제공 검증 단계를 건너뛸지 여부입니다. 이미 복제 설정을 확인한 경우에만 권장됩니다.
PROJECT_ID Google Cloud의 프로젝트 ID입니다.
REPLICA_INSTANCE Cloud SQL 복제본의 ID입니다.

데이터베이스를 Cloud Storage 버킷으로 내보냅니다.

Cloud SQL 복제본을 Cloud Storage 버킷에 있는 mysqldump 파일로 채울 수 있습니다. 다음과 같은 조건이 적용됩니다.

  • MySQL과 함께 제공되는 mysqldump 유틸리티를 사용해야 합니다.
  • mysqldump가 실행되는 동안에는 외부 서버에서 DDL 작업을 수행하지 마세요. 수행하면 내보내기 파일에서 불일치가 발생할 수 있습니다.

데이터베이스를 Cloud Storage 버킷으로 내보내려면 다음 단계를 수행합니다.

  1. Google Cloud에서 Cloud Storage 버킷을 만듭니다.
  2. 외부 데이터베이스 서버에 연결하는 클라이언트를 사용하여 터미널을 열고 다음 명령어를 실행합니다.

mysqldump

    mysqldump \
        --host=EXTERNAL_HOST \
        --port=EXTERNAL_PORT \
        --user=USERNAME\
        --password=PASSWORD \
        --databases=DATABASE_LIST  \
        --hex-blob \
        SOURCE_DATA  \
        --no-autocommit \
        --default-character-set=utf8mb4 \
        --single-transaction \
        --set-gtid-purged=on \
        ADD_DROP_TABLE \
        ROUTINES \
        COMPRESS \
        GZIP \
        | gcloud storage cp - gs://BUCKET/DUMP_FILENAME

예시

    mysqldump \
        --host=192.0.2.1 \
        --port=3306 \
        --user=replicationUser \
        --password \
        --databases guestbook journal \
        --hex-blob \
        --master-data=1 \
        --no-autocommit \
        --default-character-set=utf8mb4 \
        --single-transaction \
        --compress \
        | gzip \
        | gcloud storage cp - gs://replica-bucket/external-database.sql.gz
속성 설명
EXTERNAL_HOST 외부 서버의 IPv4 또는 DNS 주소입니다.
EXTERNAL_PORT 외부 서버의 포트입니다. 외부 서버가 Cloud SQL에서 호스팅되는 경우에는 3306입니다.
USERNAME 데이터베이스 읽기 권한이 있는 외부 서버의 복제 사용자 계정 또는 사용자 계정 이름입니다.
PASSWORD 복제 사용자 비밀번호입니다.
DATABASE_LIST 시스템 데이터베이스(sys, mysql, performance_schema, information_schema)를 제외한 외부 서버의 공백으로 구분된 모든 데이터베이스 목록입니다. 데이터베이스를 나열하려면 SHOW DATABASES MySQL 명령어를 사용합니다.
SOURCE_DATA 8.0.26 이전 버전의 MySQL을 사용하는 경우 이 매개변수의 값으로 --master-data를 사용합니다. 8.0.26 이상 버전의 MySQL에서는 이 매개변수의 값을 --source-data로 설정합니다.
ADD_DROP_TABLE CREATE TABLE 문 앞에 DROP TABLE 문을 추가하려면 --add-drop-table을 포함합니다.
ROUTINES 덤프된 데이터베이스의 출력에 프로시져 및 함수와 같은 저장된 루틴을 표시하려면 --routines를 포함합니다.
COMPRESS Cloud SQL 복제본과 외부 서버 간에 전송된 모든 정보를 압축하려면 --compress를 사용합니다.
GZIP 덤프 파일을 더 압축하려면 | gzip을 사용합니다. 데이터베이스에 잘 압축되지 않는 데이터(예: 바이너리 압축 불가 데이터 또는 JPG 이미지)가 포함된 경우에는 이를 사용하지 마세요.
BUCKET 덤프 파일을 포함하도록 1단계에서 생성한 버킷의 이름입니다.
DUMP_FILENAME 이 이름의 파일이 버킷에 생성됩니다. 이 파일에는 외부 서버의 데이터베이스 콘텐츠가 포함됩니다.

Cloud Storage 버킷의 파일 경로로 소스 표현 인스턴스 업데이트

소스 표현 인스턴스는 Cloud SQL 복제본에 소스 데이터베이스 서버를 표현하는 Cloud SQL 인스턴스입니다. Google Cloud 콘솔에 표시되며 정규 Cloud SQL 인스턴스와 동일하게 나타납니다. 하지만 데이터를 포함하지 않으며 구성 또는 유지보수가 필요하지 않고 결제에 영향을 미치지 않습니다.

source.json 파일에는 소스 표현 인스턴스에 관한 정보가 포함됩니다.

REST

{
  "name": "PRIMARY_INSTANCE_NAME",
  "region": "REGION_NAME",
  "databaseVersion": "DB_NAME_AND_VERSION",
  "onPremisesConfiguration": {
    "hostPort": "IP_ADDRESS_AND_PORT",
    "username": "USERNAME",
    "password": "PASSWORD"
  },
  "dumpFilePath" :"DUMP_FILE_PATH"
}

예시

{
  "name": "cloudsql-source-instance",
  "region": "us-central1",
  "databaseVersion": "MYSQL_5_7",
  "onPremisesConfiguration": {
    "hostPort": "192.0.2.0:3306",
    "username": "replicationUser",
    "password": "486#@%*@"
  },
  "dumpFilePath" :"gs://replica-bucket/source-database.sql.gz"
}
속성 설명
PRIMARY_INSTANCE_NAME 소스 표현 인스턴스와 연관된 Cloud SQL 인스턴스의 이름입니다.
REGION_NAME 소스 표현 인스턴스에 할당된 리전의 이름입니다.
DB_NAME_AND_VERSION 소스 표현 인스턴스와 연관된 데이터베이스의 이름과 버전 번호입니다.
IP_ADDRESS_AND_PORT 소스 표현 인스턴스에 예약된 IP 주소 및 포트 번호입니다.
USERNAME 소스 표현 인스턴스의 사용자 이름입니다.
PASSWORD 소스 표현 인스턴스의 비밀번호입니다.
DUMP_FILE_PATH 외부 서버의 데이터베이스 콘텐츠가 포함된 덤프 파일의 경로입니다.

Cloud SQL 복제본을 설정한 후에는 Cloud Storage 버킷의 파일 경로로 소스 표현 인스턴스를 업데이트해야 합니다.

REST

    gcloud auth login
    ACCESS_TOKEN="$(gcloud auth print-access-token)"
    curl --header "Authorization: Bearer ${ACCESS_TOKEN}" \
         --header 'Content-Type: application/json' \
         --data @JSON_PATH \
         -X PATCH \
         https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT-ID/instances/SOURCE_REPRESENTATION_INSTANCE

예시

    gcloud auth login
    ACCESS_TOKEN="$(gcloud auth print-access-token)"
    curl --header "Authorization: Bearer ${ACCESS_TOKEN}" \
         --header 'Content-Type: application/json' \
         --data @./source.json \
         -X PATCH \
         https://sqladmin.googleapis.com/sql/v1beta4/projects/MyProject/instances/cloudsql-source-instance
속성 설명
JSON_PATH Cloud Storage 버킷에 저장된 JSON 파일의 경로입니다. 이 파일에는 소스 표현 인스턴스에 관한 데이터가 포함됩니다.
PROJECT_ID Google Cloud의 프로젝트 ID입니다.
SOURCE_REPRESENTATION_INSTANCE 소스 표현 인스턴스의 이름입니다.

외부 서버에서 복제 시작

외부 서버에서 복제할 수 있음을 확인한 후에는 복제를 수행할 수 있습니다.

초기 가져오기 프로세스 중에는 외부 서버에서 DDL 작업을 수행하지 않습니다. 이렇게 하면 가져오는 동안 불일치가 발생할 수 있습니다. 가져오기 프로세스가 완료되면 복제본은 외부 서버에서 바이너리 로그를 사용하여 외부 서버의 현재 상태를 반영합니다.

터미널을 열고 gcloud를 사용하여 로그인한 다음 curl 명령어를 입력하여 외부 서버에서 복제합니다.

REST

  gcloud auth login
  ACCESS_TOKEN="$(gcloud auth print-access-token)"
  curl --header "Authorization: Bearer ${ACCESS_TOKEN}" \
       --header 'Content-Type: application/json' \
       --data '{
           "syncMode": "SYNC_MODE",
           "skipVerification": "SKIP_VERIFICATION"
         }' \
       -X POST \
       https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID/instances/REPLICA_INSTANCE/startExternalSync

예시

    gcloud auth login
    ACCESS_TOKEN="$(gcloud auth print-access-token)"
    curl --header "Authorization: Bearer ${ACCESS_TOKEN}" \
         --header 'Content-Type: application/json' \
         --data '{
             "syncMode": "online",
             "skipVerification": false
           }' \
         -X POST \
         https://sqladmin.googleapis.com/sql/v1beta4/projects/MyProject/instances/replica-instance/startExternalSync
속성 설명
SYNC_MODE 복제가 설정된 후 Cloud SQL 복제본과 외부 서버를 동기화 상태로 유지할 수 있는지 확인합니다.
SKIP_VERIFICATION 데이터를 동기화하기 전에 기본 제공 검증 단계를 건너뛸지 여부입니다. 이미 복제 설정을 확인한 경우에만 권장됩니다.
PROJECT_ID Google Cloud의 프로젝트 ID입니다.
REPLICA_INSTANCE Cloud SQL 복제본의 ID입니다.

스토리지 정리

버킷의 파일에서 복제한 경우 이 파일과 버킷을 삭제할 수 있습니다. 객체 삭제버킷 삭제에 대한 Cloud Storage 문서를 참조하세요.

복제 진행

외부 서버에서 복제를 시작하면 복제를 모니터링한 후 마이그레이션을 완료해야 합니다. 자세한 내용은 복제 모니터링을 참조하세요.

문제 해결

문제 문제 해결
Lost connection to MySQL server during query when dumping table. 소스를 사용할 수 없거나 덤프가 너무 큰 패킷을 포함하고 있을 수 있습니다.

외부 기본 프로젝트를 연결할 수 있는지 확인합니다. 소스 인스턴스에서 net_read_timeoutnet_write_timeout 플래그의 값을 수정하여 오류를 중지할 수도 있습니다. 이러한 플래그에 허용되는 값에 대한 자세한 내용은 데이터베이스 플래그 구성을 참조하세요.

관리형 가져오기 마이그레이션에 mysqldump 플래그를 사용하는 방법에 대한 자세한 내용은 허용되는 기본 초기 동기화 플래그를 참조하세요.

초기 데이터 마이그레이션이 성공했지만 복제 중인 데이터가 없습니다. 한 가지 가능한 근본 원인은 소스 데이터베이스에서 복제 플래그를 정의하여 일부 또는 전체 데이터베이스 변경사항이 복제되지 않기 때문일 수 있습니다.

binlog-do-db, binlog-ignore-db, replicate-do-db, replicate-ignore-db와 같은 복제 플래그가 충돌 방식으로 설정되어 있지 않은지 확인합니다.

기본 인스턴스에서 show master status 명령어를 실행하여 현재 설정을 확인합니다.

초기 데이터 마이그레이션에 성공했지만 얼마 후 데이터 복제가 더 이상 작동하지 않습니다. 해결 방법:

  • Google Cloud Console의 Cloud Monitoring 섹션에서 복제본 인스턴스의 복제 측정항목을 확인합니다.
  • MySQL IO 스레드 또는 SQL 스레드의 오류는 mysql.err log 파일의 Cloud Logging에서 확인할 수 있습니다.
  • 이 오류는 복제본 인스턴스에 연결할 때도 찾을 수 있습니다. SHOW SLAVE STATUS 명령어를 실행하고 출력에서 다음 필드를 확인합니다.
    • Slave_IO_Running
    • Slave_SQL_Running
    • Last_IO_Error
    • Last_SQL_Error
mysqld check failed: data disk is full. 복제본 인스턴스의 데이터 디스크가 가득 찼습니다.

복제본 인스턴스의 디스크 크기를 늘립니다. 수동으로 디스크 크기를 늘리거나 스토리지 자동 증가를 사용 설정할 수 있습니다.

복제 로그 검토

복제 설정을 확인하면 로그가 생성됩니다.

이러한 로그를 확인하려면 다음 단계를 따르세요.

  1. Google Cloud Console에서 로그 뷰어로 이동합니다.

    로그 뷰어로 이동

  2. 인스턴스 드롭다운에서 Cloud SQL 복제본을 선택합니다.
  3. replication-setup.log 로그 파일을 선택합니다.

Cloud SQL 복제본이 외부 서버에 연결될 수 없으면 다음을 확인합니다.

  • 외부 서버의 모든 방화벽이 Cloud SQL 복제본의 발신 IP 주소의 연결을 허용하도록 구성되어 있습니다.
  • SSL/TLS 구성이 올바릅니다.
  • 복제 사용자, 호스트, 비밀번호가 올바릅니다.

다음 단계