외부 서버에서 Cloud SQL(v1.1)로 복제

이 페이지에서는 외부 서버로부터 Cloud SQL 복제본으로 데이터를 복제하는 방법을 설명합니다. 관리형 덤프를 사용하거나 덤프 파일에서 업로드하여 데이터를 복제할 수 있습니다. IP 주소 또는 DNS 주소를 통해 연결할 수 있는 외부 서버를 사용하여 작업을 수행하는 방법을 설명합니다.

이 페이지에 설명된 절차 대신 소스 데이터베이스 서버에서 Cloud SQL로 지속적 복제 또는 일회성 데이터베이스 마이그레이션을 제공하는 Database Migration Service를 사용할 수 있습니다.

시작하기 전에

용어

  • 소스 데이터베이스 서버. 사용자가 관리하는 MySQL 서버. 외부 기본, 외부 서버, 소스 데이터베이스 서버, 외부 데이터베이스 서버라고도 합니다. Amazon Relational Database Service(RDS)를 사용하는 경우 여기에 소스 데이터베이스 서버가 포함됩니다.

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

  • Cloud SQL 복제본 소스 데이터베이스 서버로부터 복제하는 Cloud SQL 인스턴스. 외부 기본 읽기 복제본이라고도 합니다.

  • 복제 사용자 계정. 소스 데이터베이스 서버와 Google Cloud 서버 간 복제를 허용할 충분한 권한이 있는 소스 데이터베이스 서버의 MySQL 사용자 계정.

  • 관리형 덤프. 소스 데이터베이스 서버로부터 Cloud SQL 복제본으로 직접 데이터를 복사하는 프로세스. 이 경우 Cloud SQL은 복제 사용자 계정을 사용하여 소스 데이터베이스 서버에 연결하고 소스 데이터베이스 서버에서 mysqldump를 직접 실행하여 Cloud SQL 복제본으로 데이터를 가져옵니다.

소스 데이터베이스 서버 체크리스트

모두

  • MySQL 5.5, 5.6, 5.7, 8.0이 소스 데이터베이스 서버에 설치되어 있는지 확인합니다. MySQL Community Edition, Cloud SQL MySQL, Amazon RDS의 MySQL이 지원됩니다.

    • MySQL 8.0이 소스 데이터베이스 서버에 설치되어 있는 경우 Cloud SQL 복제본과 함께 Cloud SQL MySQL 8.0을 사용할 수 있습니다.
    • MySQL 5.5가 소스 데이터베이스 서버에 설치된 경우 GTID가 지원되지 않습니다.
  • 바이너리 로그가 사용 설정되어 있는지와 다음을 확인합니다.

  • 소스 데이터베이스 서버에 GTID가 사용 설정되었는지 확인합니다. 그러면 복제를 설정하는 데 필요한 단계가 영향을 받습니다.

  • 소스 데이터베이스 서버에 전역 읽기 잠금 권한이 있는지 확인합니다. 그러면 복제를 설정하는 데 필요한 단계가 영향을 받습니다.

  • Cloud SQL 복제본이 비공개 IP를 사용할 경우 Cloud SQL 복제본의 VPC에서 액세스할 수 있도록 소스 데이터베이스 서버를 구성해야 합니다. 이 가이드의 단계를 완료하기 전에 이 구성을 설정합니다.

  • 소스 데이터베이스에 DEFINER 절(뷰, 이벤트, 트리거 또는 저장 프로시저)이 포함된 경우 이러한 문이 실행되는 순서에 따라 복제가 실패할 수 있습니다. Cloud SQL의 DEFINER 사용 및 가능한 해결 방법에 대해 자세히 알아보세요.

Amazon RDS

  • Amazon RDS용 MySQL이 소스 데이터베이스 서버에 설치되어 있는지 확인합니다.

  • Amazon RDS를 사용하는 소스 데이터베이스 서버는 대부분의 경우 GTID를 지원하지 않지만 MySQL 5.7용 GTID는 지원합니다.

  • Amazon RDS를 사용하는 소스 데이터베이스 서버는 전역 읽기 잠금 권한을 지원하지 않습니다.

복제 설정

Cloud Storage 파일 또는 관리형 덤프에서 복제를 시작할 수 있습니다.

복제 설정을 할 때 초기 가져오기가 완료된 후 Cloud SQL 복제본이 소스 데이터베이스 서버와 동기화를 유지할지 결정할 수도 있습니다. 동기화 상태로 유지해야 하는 복제본은 온라인입니다. 한 번만 업데이트되는 복제본은 오프라인입니다.

온라인 + 파일

이 복제 유형을 설정하려면 소스 데이터베이스 서버에 GTID가 사용 설정되어 있거나 전역 읽기 잠금 권한이 있어야 합니다.

  1. Google Cloud에서 프로젝트를 설정합니다.
  2. 소스 데이터베이스 서버용 Google Cloud SDK를 설치합니다.
  3. 소스 데이터베이스 서버에 복제 사용자를 만듭니다.
  4. 소스 데이터베이스 서버에서 Google Cloud 버킷으로 데이터 내보내기.
  5. 소스 표현 인스턴스 설정.
  6. Cloud SQL 복제본 설정.
  7. 인스턴스가 Cloud SQL에 올바르게 추가되었는지 확인.
  8. Cloud SQL 복제본에 사용자를 추가합니다.
  9. 소스 데이터베이스 서버에서 복제 사용자의 권한을 업데이트합니다.
  10. 소스 데이터베이스 서버에서 들어오는 연결을 허용합니다.
  11. 복제 설정을 확인합니다.
  12. 복제 로그를 검토합니다(선택사항).
  13. 데이터를 복제합니다.
  14. 복제 상태를 확인합니다.
  15. 저장소를 정리합니다.

온라인 + 관리형 덤프

  1. Google Cloud에서 프로젝트를 설정합니다.
  2. 소스 데이터베이스 서버용 Google Cloud SDK를 설치합니다.
  3. 소스 데이터베이스 서버에 복제 사용자를 만듭니다.
  4. 소스 표현 인스턴스 설정.
  5. Cloud SQL 복제본 설정.
  6. 인스턴스가 Cloud SQL에 올바르게 추가되었는지 확인.
  7. Cloud SQL 복제본에 사용자를 추가합니다.
  8. 소스 데이터베이스 서버에서 복제 사용자의 권한을 업데이트합니다.
  9. 소스 데이터베이스 서버에서 들어오는 연결을 허용합니다.
  10. 복제 설정을 확인합니다.
  11. 복제 로그를 검토합니다(선택사항).
  12. 데이터를 복제합니다.
  13. 복제 상태를 확인합니다.

오프라인 + 파일

  1. Google Cloud에서 프로젝트를 설정합니다.
  2. 소스 데이터베이스 서버용 Google Cloud SDK를 설치합니다.
  3. 소스 데이터베이스 서버에 복제 사용자를 만듭니다.
  4. 소스 데이터베이스 서버에서 Google Cloud 버킷으로 데이터 내보내기.
  5. 소스 표현 인스턴스 설정.
  6. Cloud SQL 복제본 설정.
  7. 인스턴스가 Cloud SQL에 올바르게 추가되었는지 확인.
  8. Cloud SQL 복제본에 사용자를 추가합니다.
  9. 소스 데이터베이스 서버에서 복제 사용자의 권한을 업데이트합니다.
  10. 소스 데이터베이스 서버에서 들어오는 연결을 허용합니다.
  11. 데이터를 복제합니다.
  12. 복제 상태를 확인합니다.
  13. 저장소를 정리합니다.

오프라인 + 관리형 덤프

  1. Google Cloud에서 프로젝트를 설정합니다.
  2. 소스 데이터베이스 서버용 Google Cloud SDK를 설치합니다.
  3. 소스 데이터베이스 서버에 복제 사용자를 만듭니다.
  4. 소스 표현 인스턴스 설정.
  5. Cloud SQL 복제본 설정.
  6. 인스턴스가 Cloud SQL에 올바르게 추가되었는지 확인.
  7. Cloud SQL 복제본에 사용자를 추가합니다.
  8. 소스 데이터베이스 서버에서 복제 사용자의 권한을 업데이트합니다.
  9. 소스 데이터베이스 서버에서 들어오는 연결을 허용합니다.
  10. 복제 설정을 확인합니다.
  11. 복제 로그를 검토합니다(선택사항).
  12. 데이터를 복제합니다.

구성 절차

선택한 복제에 따라 아래의 관련 단계를 따르세요.

Google Cloud 프로젝트 설정

  1. Google 계정으로 로그인합니다.

    아직 계정이 없으면 새 계정을 등록하세요.

  2. Google Cloud Console의 프로젝트 선택기 페이지에서 Google Cloud 프로젝트를 선택하거나 만듭니다.

    프로젝트 선택기 페이지로 이동

  3. Cloud 프로젝트에 결제가 사용 설정되어 있는지 확인합니다. 프로젝트에 결제가 사용 설정되어 있는지 확인하는 방법을 알아보세요.

  4. Cloud SQL Admin API를 사용 설정합니다.

    API 사용 설정

  5. 사용자 계정에 Cloud SQL 관리자, 스토리지 관리자, Compute 뷰어 역할이 있는지 확인합니다.

    IAM 페이지로 이동

  6. Cloud SQL Admin API를 사용 설정합니다.

    API 사용 설정

Google Cloud SDK 설치

복제를 구성하려면 소스 데이터베이스 서버에 Google Cloud SDK를 설치합니다. 이미 다른 곳에 설치되어 있지 않은 경우 소스 데이터베이스 서버에 이를 설치할 수 있습니다.

복제 사용자 계정 만들기

REPLICATION_SLAVE 권한이 있는 MySQL 사용자 계정은 소스 데이터베이스 서버에 있어야 합니다. 이 사용자 계정은 복제를 관리하는 데만 사용해야 합니다. 복제 사용자 계정을 추가하려면 소스 데이터베이스 서버에서 터미널을 열고 다음 MySQL 명령어를 입력합니다.

MySQL

// Online migration with Cloud Storage file:
CREATE USER '[USERNAME]'@'%' IDENTIFIED BY '[PASSWORD]';
GRANT REPLICATION SLAVE, EXECUTE ON *.* TO '[USERNAME]'@'[HOST]';
FLUSH PRIVILEGES;

// Online migration with managed dump and GTID enabled:
CREATE USER '[USERNAME]'@'%' IDENTIFIED BY '[PASSWORD]';
GRANT REPLICATION SLAVE, EXECUTE, SELECT, SHOW VIEW ON *.* TO '[USERNAME]'@'[HOST]';
FLUSH PRIVILEGES;

// Online migration with managed dump and GTID disabled:
CREATE USER '[USERNAME]'@'%' IDENTIFIED BY '[PASSWORD]';
GRANT REPLICATION SLAVE, EXECUTE, SELECT, SHOW VIEW, REPLICATION CLIENT,
RELOAD ON *.* TO '[USERNAME]'@'[HOST]';
FLUSH PRIVILEGES;

// Offline migration with managed dump:
CREATE USER '[USERNAME]'@'%' IDENTIFIED BY '[PASSWORD]';
GRANT SELECT, SHOW VIEW ON *.* TO '[USERNAME]'@'[HOST]';
FLUSH PRIVILEGES;

예시

CREATE USER 'bluewing'@'%' IDENTIFIED BY '8*&fwwd';
GRANT REPLICATION SLAVE ON *.* TO 'bluewing'@'%';
FLUSH PRIVILEGES;
속성
[USERNAME] 소스 데이터베이스 서버의 복제 사용자 계정입니다.
[PASSWORD] 복제 사용자 계정의 비밀번호입니다.
[HOST] 모든 호스트 연결을 허용하려면 %로 설정합니다. 이후 단계에서 Cloud SQL 복제본의 연결만 수락하도록 변경됩니다.

Google Cloud 버킷으로 데이터 내보내기

Cloud SQL 복제본을 Google Cloud 버킷의 데이터로 채울 수 있습니다. 다음과 같은 조건이 적용됩니다.

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

버킷에 데이터를 업로드하려면 다음 단계를 따르세요.

  1. Google Cloud에서 버킷을 만듭니다.
  2. 소스 데이터베이스 서버에서 터미널을 열고 아래 명령어를 실행합니다.

mysqldump

mysqldump \
    --host=[SOURCE_HOST] \
    --port=[SOURCE_PORT] \
    --user=[USERNAME]\
    --password \
    [DATABASE_LIST]  \
    --hex-blob \
    [SOURCE_DATA]  \
    --no-autocommit \
    --default-character-set=utf8mb4 \
    --single-transaction \
    [GTID_PURGED] \
    [ADD_DROP_TABLE] \
    [ROUTINES] \
    [COMPRESS] \
    [GZIP] \
    | gsutil 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 \
    | gsutil cp - gs://replica-bucket/source-database.sql.gz
속성
[SOURCE_HOST] 소스 데이터베이스 서버의 IPv4 또는 DNS 주소입니다.
[SOURCE_PORT] 소스 데이터베이스 서버의 포트입니다. 소스 데이터베이스 서버가 Cloud SQL에서 호스팅되는 경우 이는 3306입니다.
[USERNAME] 데이터베이스 읽기 권한이 있는 소스 데이터베이스 서버의 복제 사용자 계정 또는 사용자 계정 이름입니다.
[DATABASE_LIST] 시스템 데이터베이스(sys, mysql, performance_schema, information_schema)를 제외하고 소스 데이터베이스 서버의 모든 데이터베이스가 쉼표로 구분되어 나열된 목록입니다. 데이터베이스를 나열하려면 SHOW DATABASES MySQL 명령어를 사용합니다.
[SOURCE_DATA] 소스 데이터베이스 서버가 GTID를 지원하지 않고 사용자에게 전역 읽기 잠금에 액세스할 권한이 있는 경우 --master-data=1을 사용합니다. 그렇지 않은 경우에는 이 속성을 사용하지 마세요.
[GTID_PURGED] 소스 데이터베이스 서버가 GTID를 지원하는 경우 --set-gtid-purged=on을 사용합니다. 그렇지 않은 경우에는 이 속성을 사용하지 마세요.
[ADD_DROP_TABLE] CREATE TABLE 문 앞에 DROP TABLE 문을 추가하려면 --add-drop-table을 포함합니다.
[ROUTINES] 덤프된 데이터베이스의 출력에 프로시져 및 함수와 같은 저장된 루틴을 표시하려면 --routines를 포함합니다.
[COMPRESS] Cloud SQL 복제본과 소스 데이터베이스 서버 간에 전송된 모든 정보를 압축하려면 --compress를 사용합니다.
[GZIP] 덤프 파일을 더 압축하려면 | gzip을 사용합니다. 데이터베이스에 잘 압축되지 않는 데이터(예: 바이너리 압축 불가 데이터 또는 JPG 이미지)가 포함된 경우에는 이를 사용하지 마세요.
[BUCKET] 덤프 파일을 포함할 1단계에서 생성한 버킷의 이름입니다.
[DUMP_FILENAME] 이 이름의 파일이 버킷에 생성됩니다. 이 파일에는 소스 데이터베이스 서버에 있는 데이터베이스 콘텐츠가 포함됩니다.

소스 표현 인스턴스 설정

소스 표현 인스턴스는 소스 데이터베이스 서버를 참조합니다. 여기에는 소스 데이터베이스 서버의 요청 데이터만 포함됩니다. 이 단계에서는 요청 데이터를 만들고 Cloud SQL에서 소스 표현 인스턴스를 만드는 cURL 명령어에 사용합니다.

요청 데이터 만들기

요청 데이터에는 JSON 형식의 소스 데이터베이스 서버에 대한 기본 정보가 포함됩니다. 요청 데이터는 공개 또는 비공개 네트워크의 Cloud SQL 복제본에 대해 구성될 수 있으며 다음 정보를 포함해야 합니다.

source.json

{
  "name": "[SOURCE_NAME]",
  "region": "[REGION]",
  "databaseVersion": "[MYSQL_VERSION]",
  "onPremisesConfiguration": {
    "hostPort": "[SOURCE_HOST]",
    "username": "[USERNAME]",
    "password": "[PASSWORD]",
    "dumpFilePath": "gs://[BUCKET]/[DUMP_FILE]",
    "caCertificate": "[SOURCE_CERT]",
    "clientCertificate": "[CLIENT_CERT]",
    "clientKey": "[CLIENT_KEY]"
  }
}

관리형 덤프 예시

// example of source.json for source database server that
// - initiates replication from a Cloud SQL managed dump
// - does not use SSL/TSL

{
  "name": "cloudsql-source-instance",
  "region": "us-central1",
  "databaseVersion": "MYSQL_5_7",
  "onPremisesConfiguration": {
    "hostPort": "192.0.2.0:3306",
    "username": "replicationUser",
    "password": "486#@%*@"
  }
}

덤프 파일 예시

// example of source.json for source database server that
// - initiates replication from a file
// - uses SSL/TSL

{
  "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",
    "caCertificate": "content of your certificate",
    "clientCertificate": "content of your certificate",
    "clientKey": "content of your client key"
  }
}
선택 필드 참고
dumpFilePath Cloud SQL 버킷에 있는 덤프 파일로 복제를 설정하는 경우에만 포함합니다.
caCertificate 소스 데이터베이스 서버에서 SSL/TLS가 사용되는 경우에만 포함합니다.
clientCertificate 소스 데이터베이스 서버에서 SSL/TLS가 사용되는 경우에만 포함합니다.
clientKey 소스 데이터베이스 서버에서 SSL/TLS가 사용되는 경우에만 포함합니다.
속성
[SOURCE_NAME] 생성할 소스 표현 인스턴스의 이름입니다.
[REGION] 소스 표현 인스턴스를 배치할 리전입니다.
[MYSQL_VERSION] 소스 데이터베이스 서버에서 실행 중인 MySQL 버전입니다. MYSQL_5_5, MYSQL_5_6, MYSQL_5_7, MYSQL_8_0 중에 선택할 수 있습니다.
[SOURCE HOST] 소스 데이터베이스 서버의 IPv4 주소 및 포트 또는 소스 데이터베이스 서버의 DNS 주소입니다. DNS 주소를 사용하는 경우 최대 60자까지 포함할 수 있습니다. 소스 데이터베이스 서버가 Cloud SQL에서 호스팅되는 경우 포트는 3306입니다.
[USERNAME] 소스 데이터베이스 서버의 복제 사용자 계정입니다.
[PASSWORD] 복제 사용자 계정의 비밀번호입니다.
[BUCKET] 덤프 파일이 포함된 버킷의 이름입니다.
[DUMP_FILE] 소스 데이터베이스 서버의 데이터가 포함된 버킷의 파일입니다.
[CLIENT_CA_CERT] 소스 서버의 CA 인증서입니다.
[CLIENT_CERT] 소스 서버의 클라이언트 인증서. 서버-클라이언트 인증에만 필요합니다.
[CLIENT_KEY] 소스 데이터베이스 서버에 있는 클라이언트 인증서의 비공개 키 파일입니다. 서버-클라이언트 인증에만 필요합니다.

소스 표현 인스턴스를 만들기

이 단계를 완료하기 전에 소스 요청 데이터가 포함된 JSON 파일을 생성해야 합니다. 그런 다음 터미널을 열고 다음 명령어를 사용하여 Cloud SQL에서 소스 표현 인스턴스를 만듭니다.

cURL

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 POST \
     https://sqladmin.googleapis.com/sql/v1beta4/projects/[PROJECT-ID]/instances

예시

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 POST \
     https://sqladmin.googleapis.com/sql/v1beta4/projects/MyProject/instances
속성
[PROJECT_ID] Google Cloud의 프로젝트 ID입니다.
[JSON_PATH] 소스 데이터베이스 서버의 요청 데이터가 포함된 JSON 파일의 경로입니다.

Cloud SQL 복제본 설정

Cloud SQL 복제본에는 나중에 소스 데이터베이스 서버의 데이터가 포함됩니다. 이 단계에서는 요청 데이터를 만들고 Cloud SQL에서 Cloud SQL 복제본을 만드는 cURL 명령어에 사용합니다.

요청 데이터 만들기

요청 데이터에는 소스 데이터베이스 서버 및 Cloud SQL 복제본에 대한 기본 정보가 JOSN 형식으로 포함됩니다. 요청 데이터는 공개 또는 비공개 네트워크의 Cloud SQL 복제본에 대해 구성될 수 있으며 다음 정보를 포함해야 합니다.

replica.json

{
    "settings": {
        "tier": "[TIER]",
        "dataDiskSizeGb": "[DISK_SIZE]",
        "ipConfiguration": {
            "privateNetwork": "projects/[PROJECT_ID]/global/networks/[NETWORK_NAME]"
         }
    },
    "masterInstanceName": "[SOURCE_NAME]",
    "region": "[SOURCE_REGION]",
    "databaseVersion": "[MYSQL_VERSION]",
    "name": "[REPLICA_NAME]"
}

예시

{
    "settings": {
        "tier": "db-n1-standard-4",
        "dataDiskSizeGb": "100"
    },
    "masterInstanceName": "source-instance",
    "region": "us-central1",
    "databaseVersion": "MYSQL_5_7",
    "name": "replica-instance"
}
선택 필드 참고
ipConfiguration Cloud SQL 복제본이 비공개 네트워크에 있는 경우에만 이를 포함합니다.
속성
[TIER] 복제본 인스턴스를 호스팅할 머신 유형 사용할 머신 유형을 모르는 경우 db-n1-standard-2로 시작합니다. 필요한 경우 나중에 크기 및 기타 지원되는 값을 변경할 수 있습니다.
[DISK_SIZE] Cloud SQL 복제본의 스토리지 크기(GB)입니다.
[SOURCE_NAME] 소스 표현 인스턴스의 이름입니다.
[SOURCE_REGION] 소스 표현 인스턴스에 할당된 리전입니다.
[MYSQL_VERSION] Cloud SQL 복제본에서 사용할 MySQL 버전입니다. MYSQL_5_6, MYSQL_5_7, MYSQL_8_0 중에서 선택할 수 있습니다. 이는 소스 데이터베이스 서버에서 실행 중인 MySQL 버전과 일치할 수도 있고 최대 한 버전 높을 수도 있습니다. 예를 들어 소스 데이터베이스 서버에서 MySQL 5.5를 사용하는 경우 Cloud SQL 복제본과 MySQL 5.6을 사용할 수 있습니다.
[REPLICA_NAME] 만들 Cloud SQL 복제본의 이름입니다.
[PROJECT_ID] Google Cloud의 프로젝트 ID입니다.
[NETWORK_NAME] Cloud SQL 복제본에 사용할 비공개 네트워크의 이름입니다.

Cloud SQL 복제본 만들기

이 단계를 완료하기 전에 복제본 요청 데이터가 포함된 JSON 파일을 생성해야 합니다. 그런 다음 터미널을 열고 다음 명령어를 사용하여 Cloud SQL에서 Cloud SQL 복제본을 만듭니다.

cURL

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 POST \
     https://sqladmin.googleapis.com/sql/v1beta4/projects/[PROJECT-ID]/instances

예시

gcloud auth login
ACCESS_TOKEN="$(gcloud auth print-access-token)"
curl --header "Authorization: Bearer ${ACCESS_TOKEN}" \
     --header 'Content-Type: application/json' \
     --data @./replica.json \
     -X POST \
속성
[PROJECT_ID] Google Cloud의 프로젝트 ID입니다.
[JSON_PATH] Cloud SQL 복제본에 대한 요청 데이터가 포함된 JSON 파일의 경로입니다.

완료 시 유의사항

인스턴스가 올바르게 설정되었는지 확인하려면 Cloud SQL 인스턴스 페이지로 이동합니다. 소스 표현 인스턴스와 Cloud SQL 복제본이 표시됩니다. 다음과 같이 표시됩니다.

인스턴스 ID 유형 공개 IP
(-) source-representation-instance MySQL 외부 기본 10.68.48.3:3306
복제 인스턴스 MySQL 읽기 복제본 34.66.48.59

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

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

MySQL

UPDATE mysql.user
  SET Host='[NEW_HOST]' WHERE Host='[OLD_HOST]' AND User='[USERNAME]';
FLUSH PRIVILEGES;

예시

UPDATE mysql.user
  SET Host='192.0.2.0' WHERE Host='%' AND User='replicationUser';
FLUSH PRIVILEGES;
속성
[USERNAME] 소스 데이터베이스 서버의 복제 사용자 계정입니다.
[NEW_HOST] Cloud SQL 복제본의 발신 IP를 지정합니다.
[OLD_HOST] 변경하려는 Host에 지정된 현재 값입니다.

소스 데이터베이스 서버에서 들어오는 연결 허용

복제가 성공하려면 Cloud SQL 복제본이 소스 데이터베이스 서버에 연결되어야 합니다. 다음 사항이 모두 적용되는 경우 Cloud SQL 복제본의 발신 IP 주소에서 연결을 수락하도록 소스 데이터베이스 서버의 네트워크 방화벽을 구성해야 합니다.

  • 소스 데이터베이스 서버가 방화벽 뒤에 있거나 일부 다른 네트워크 제한이 적용됩니다.
  • Cloud SQL 복제본이 공개 IP를 사용합니다.

자세한 내용은 승인된 주소 또는 주소 범위 추가하기를 참조하세요. Cloud SQL 복제본에 연결하려면 복제본의 기본 IP 주소를 사용합니다. 이 IP 주소는 Cloud Console에 표시됩니다.

복제 설정 확인

설정이 완료되면 Cloud SQL 복제본이 소스 데이터베이스 서버에서 복제할 수 있는지 확인합니다.

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

  • Cloud SQL 복제본과 소스 데이터베이스 서버 간의 연결입니다.
  • 사용자 권한 복제.
  • 버전 호환성

온라인 동기화를 수행하는 경우 아래 명령어로 다음 항목도 확인합니다.

  • Cloud SQL 복제본은 아직 복제하지 않습니다.
  • Binlog는 소스 데이터베이스 서버에서 사용 설정되어 있습니다.
  • RDS 소스 데이터베이스 서버에서 외부 동기화를 시도하고 Google Cloud 버킷을 사용하는 경우 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",
         "skipVerification": false
       }' \
     -X POST \
     https://sqladmin.googleapis.com/sql/v1beta4/projects/MyProject/instances/replica-instance/verifyExternalSyncSettings
속성
[SYNC_MODE] 이 값은 online 또는 offline 중 하나입니다. online이 사용된 경우 verifyExternalSyncSettings는 복제가 설정된 후 Cloud SQL 복제본과 소스 데이터베이스 서버를 동기화 상태로 유지할 수 있는지 확인합니다.
[SKIP_VERIFICATION] 데이터를 동기화하기 전에 기본 제공 검증 단계를 건너뛸지 여부입니다. 이미 복제 설정을 확인한 경우에만 권장됩니다.
[PROJECT_ID] Google Cloud의 프로젝트 ID입니다.
[REPLICA_INSTANCE] Cloud SQL 복제본의 ID입니다.

복제 로그 검토

복제 설정을 확인하면 로그가 생성됩니다. 이러한 로그를 확인하려면 다음 단계를 따르세요.

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

    로그 뷰어로 이동

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

    Cloud SQL 복제본이 소스 데이터베이스 서버에 연결할 수 없는 경우 다음을 확인하세요.

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

소스 데이터베이스 서버 복제

소스 데이터베이스 서버에서 복제할 수 있음을 확인한 후에는 복제를 수행할 수 있습니다. 복제본이 시간당 25~50GB를 가져올 것으로 예상합니다.

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

소스 데이터베이스 서버에서 전역 읽기 잠금에 액세스할 수 있는 권한이 없고 GTID가 사용 중지된 경우 Amazon RDS라면 로그가 있는 단계를 참조하고 이외에는 단계를 참조하세요.

단계

터미널을 열고 아래 명령어를 입력하여 소스 데이터베이스 서버에서 복제합니다.

로그가 있는 단계

  1. 로그 뷰어로 이동하여 리소스 목록에서 Cloud SQL 복제본을 선택합니다. Cloud SQL 복제본의 최근 로그 목록이 표시됩니다. 지금은 무시하세요.
  2. 터미널을 열고 이 단계 아래의 명령어를 입력하여 소스 데이터베이스 서버에서 복제합니다.
  3. 로그 뷰어로 돌아갑니다. 아래 로그가 표시되면 소스 데이터베이스 서버에서 데이터베이스 쓰기를 중지합니다. 대부분의 경우 이는 몇 초 동안만 필요합니다.

    DUMP_IMPORT(START): Start importing data, please pause any write to the external primary database.
    
  4. 로그 뷰어에 아래와 같은 로그가 표시되면 소스 데이터베이스 서버의 데이터베이스에 쓰기를 다시 사용 설정합니다.

    DUMP_IMPORT(SYNC): Consistent state on primary and replica. Writes to the external primary may resume.
    

다음은 소스 데이터베이스 서버에서 복제하는 명령어입니다.

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]/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] 이 값은 online 또는 offline 중 하나입니다. online인 경우, 소스 데이터베이스 서버의 이후의 변경사항은 Cloud SQL 복제본에 반영됩니다. offline인 경우 이후 변경 사항은 Cloud SQL 복제본에 반영되지 않습니다.
[SKIP_VERIFICATION] 데이터를 동기화하기 전에 기본 제공 검증 단계를 건너뛸지 여부입니다. 이미 복제 설정을 확인한 경우에만 권장됩니다.
[PROJECT_ID] Google Cloud의 프로젝트 ID입니다.
[REPLICA_INSTANCE] Cloud SQL 복제본의 ID입니다.

복제 상태 확인

Cloud SQL 복제본이 복제를 마치면 소스 데이터베이스 서버에 연결하고 내보내기가 실행된 후 적용된 모든 업데이트를 적용합니다. 다음 단계에 따라 복제 상태를 확인합니다.

복제본을 독립 실행형 인스턴스로 승격하기 전에 복제 상태를 확인하는 것이 중요합니다. 복제 프로세스가 완료되지 않고 성공했으면 승격된 복제본에 소스 표현 인스턴스의 모든 변경사항이 있는 것이 아닙니다.

복제 지연이 0에 가깝지 않은 경우 이를 해결하기 위한 단계를 수행합니다.

GTID가 중지되면 승격된 복제본에서 point-in-time recovery(PITR) 및 바이너리 로그가 중지됩니다. GTID를 사용 설정하려면 PITR을 사용 설정합니다. 인스턴스를 다시 시작해야 합니다.

스토리지 정리

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

추가 절차

이러한 절차는 복제 설정에 도움이 될 수 있습니다.

바이너리 로그 보관 구성

최소 24시간 동안 바이너리 로그를 유지하도록 소스 데이터베이스 서버를 구성해야 합니다.

MySQL 커뮤니티

소스 데이터베이스 서버가 MySQL Community Edition을 사용하는 경우 이러한 MySQL 명령어를 사용하여 바이너리 로그 보관 설정을 업데이트할 수 있습니다.

클라우드 MySQL

소스 데이터베이스 서버가 Cloud SQL MySQL을 사용하는 경우 바이너리 로그는 7일 동안 보관됩니다. 이 설정은 변경할 수 없습니다.

Amazon RDS

소스 데이터베이스 서버가 Amazon RDS 인스턴스인 경우 다음 명령어를 사용하여 바이너리 로그 보관 설정을 업데이트할 수 있습니다.

call mysql.rds_set_configuration('binlog retention hours', 24);

Cloud SQL 복제본에 사용자를 추가합니다.

소스 데이터베이스 서버에서 MySQL 사용자 계정을 가져올 수 없지만 Cloud SQL 복제본 인스턴스에서 만들 수 있습니다. 소스 데이터베이스 서버에서 복제하기 전에 이 작업을 수행합니다.

Cloud SQL 복제본의 발신 IP 주소 확인

Cloud SQL 복제본의 발신 IP 주소를 사용하여 소스 데이터베이스 서버와 Cloud SQL 복제본 간의 보안 연결을 만들 수 있습니다. 다음과 같은 몇 가지 방법으로 이 발신 IP 주소를 확인할 수 있습니다.

gcloud

gcloud sql instances describe [REPLICA_NAME] --format="default(ipAddresses)"

Cloud SQL

  1. Cloud SQL 인스턴스 페이지를 엽니다.
  2. Cloud SQL 복제본의 공개 IP 주소 옆에 있는 추가 정보 도구 도움말 위로 마우스를 가져가 발신 IP 주소를 검색합니다. 발신 IP 주소는 Cloud Console에서 복제본의 주요 목록에 표시되는 IP 주소가 아닙니다.

소스 표현 또는 Cloud SQL 복제본 업데이트

소스 표현 또는 Cloud SQL 복제본을 설정한 후 이 구성으로 업데이트할 수 있습니다. 예를 들어 다음과 같은 경우 구성을 업데이트해야 합니다.

  • 소스 데이터베이스 서버의 호스트, 포트 또는 IP가 변경됩니다.
  • 다른 MySQL 복제 사용자를 사용하려고 합니다.
  • MySQL 복제 사용자의 비밀번호가 변경됩니다.
  • 소스 데이터베이스 서버 변경사항에 안전하게 연결하는 데 사용되는 SSL 인증서입니다.

문제 해결

자세한 내용을 보려면 표의 링크를 클릭하세요.

문제 설명 문제 원인 해결 방법
Specified key was too long; max key length is 767 bytes. 외부 기본 인스턴스에는 innodb_large_prefix 변수가 설정되어 있을 수 있습니다. 복제본을 만들 때 ON으로 innodb_large_prefix 플래그를 설정하거나 기존 복제본을 플래그로 업데이트합니다.
Table definition has changed. 덤프 프로세스 중에 데이터 정의 언어(DDL)가 변경되었습니다. 덤프 프로세스 중에 DDL 변경을 방지합니다.
오류 메시지: Access denied; you need (at least one of) the SUPER privilege(s) for this operation. 소스 데이터베이스에 Cloud SQL에서 지원하지 않는 방식으로 DEFINER를 참조하는 뷰, 함수 또는 프로시져가 있을 수 있습니다. Cloud SQL의 DEFINER 사용에 대한 자세한 정보를 참조하세요.
오류 메시지: ERROR 1045 (28000) at line {line_number}: Access denied for user 'cloudsqlimport'@'localhost 소스 데이터베이스에 복제본에 없는 DEFINER가 있습니다. Cloud SQL의 DEFINER 사용에 대한 상세 정보를 참조하세요.
Lost connection to MySQL server during query when dumping table. 소스를 사용할 수 없거나 덤프가 너무 큰 패킷을 포함하고 있을 수 있습니다. 외부 기본 프로젝트를 연결할 수 있는지 확인하거나 max_allowed_packet 옵션으로 mysqldump를 사용합니다.
Got packet bigger than 'max_allowed_packet' bytes when dumping table할 수 있습니다. 패킷이 설정에서 허용하는 것보다 큽니다. max_allowed_packet 옵션으로 mysqldump를 사용합니다.
초기 데이터 마이그레이션이 성공했지만 복제 중인 데이터가 없습니다. 충돌하는 복제 플래그가 있을 수 있습니다. 이러한 플래그 설정을 확인하세요.
초기 데이터 마이그레이션에 성공했지만 얼마 후 데이터 복제가 더 이상 작동하지 않습니다. 여러 가지 원인이 있을 수 있습니다. 이러한 방법을 시도해 보세요.
mysqld check failed: data disk is full. 복제본 인스턴스의 데이터 디스크가 가득 찼습니다. 복제본 인스턴스의 디스크 크기를 늘립니다. 수동으로 디스크 크기를 늘리거나 스토리지 자동 증가를 사용 설정할 수 있습니다.

지정된 키가 너무 깁니다. 최대 키 길이는 767바이트입니다.

Specified key was too long; max key length is 767 bytes. 오류가 표시됩니다.

문제 원인

외부 기본 인스턴스에는 innodb_large_prefix 변수가 설정되어 있을 수 있습니다. 이렇게 하면 767바이트보다 긴 색인 키 프리픽스가 허용됩니다. MySQL 5.6의 기본값은 OFF입니다.

해결 방법

복제본을 만들 때 innodb_large_prefix 플래그를 ON으로 설정하거나 기존 복제본을 플래그로 업데이트합니다.


테이블 정의가 변경됨

Table definition has changed 오류가 표시됩니다.

문제 원인

덤프 프로세스 중에 DDL이 변경되었습니다.

해결 방법

덤프 프로세스 중에 테이블을 수정하거나 다른 DDL 변경을 수행하지 마세요.


액세스 거부됨. 이 작업에 대한 SUPER 권한(하나 이상)이 필요합니다.

Access denied; you need (at least one of) the SUPER privilege(s) for this operation 오류가 표시됩니다.

문제 원인

근본 원인은 고객이 super user@localhost(예: root@localhost)를 사용하는 DEFINER와 함께 VIEW/FUNCTION/PROCEDURE를 가지고 있기 때문일 수 있습니다. 이는 Cloud SQL에서는 지원되지 않습니다.

해결 방법

해결 방법은 외부 데이터베이스에서 Definer를 업데이트하는 것입니다. 예를 들어 root@localhost에서 root@% 또는 비 수퍼유저가 있습니다. 자세한 내용은 저장된 객체 액세스 제어를 참조하세요.


라인 xxx의 오류 1045 (28000): 사용자 'cloudsqlimport'@'localhost에 대한 액세스가 거부됨

ERROR 1045 (28000) at line xxx: Access denied for user 'cloudsqlimport'@'localhost 오류가 표시됩니다.

문제 원인

DEFINER 절이 있는 소스 데이터베이스의 사용자는 복제본 데이터베이스에 존재하지 않는데 해당 사용자가 소스 데이터베이스의 객체 정의에서 상호 참조됩니다.

해결 방법

사용자를 데이터와 함께 마이그레이션하지 않습니다. 복제를 시작하기 전에 복제본 데이터베이스에 소스 데이터베이스 사용자를 만드세요.


테이블을 덤프할 때 쿼리 중에 MySQL 서버와의 연결이 끊어졌습니다.

Lost connection to MySQL server during query when dumping table 오류가 표시됩니다.

문제 원인

  • 소스가 복제본에서 연결할 수 없게 되었을 수 있습니다.

  • 소스 데이터베이스에는 소스 데이터베이스에서 max_allowed_packet을 더 큰 수로 설정해야 하는 큰 blob 또는 긴 문자열이 있는 테이블이 있을 수 있습니다.

해결 방법

  • 다시 시작하고 외부 기본을 연결할 수 있는지 확인합니다.

  • mysqldump를 max_allowed_packet 옵션과 함께 사용하여 데이터를 덤프하고 덤프 파일로 마이그레이션합니다.


테이블을 덤프할 때 'max_allowed_packets' 바이트보다 큰 패킷이 있습니다.

Got packet bigger than 'max_allowed_packet' bytes when dumping table 오류가 표시됩니다.

문제 원인

패킷이 설정에서 허용하는 것보다 큽니다.

해결 방법

mysqldump를 max_allowed_packet 옵션과 함께 사용하여 데이터를 덤프하고 덤프 파일로 마이그레이션합니다.


복제되는 데이터가 없습니다.

초기 데이터 마이그레이션이 성공했지만 복제 중인 데이터가 없습니다.

문제 원인

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

해결 방법

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

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


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

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

문제 원인

이 문제의 근본 원인은 여러 가지가 있을 수 있습니다.

해결 방법

  • Cloud Monitoring UI에서 복제본 인스턴스의 복제 측정항목을 확인합니다.

  • MySQL IO 스레드 또는 SQL 스레드의 오류는 mysql.err 로그 파일의 Cloud Logging에서 확인할 수 있습니다.

  • 이 오류는 복제본 인스턴스에 연결할 때도 찾을 수 있습니다. SHOW SLAVE STATUS 명령어를 실행하고 출력에서 다음 필드를 확인합니다.

    • Slave_IO_Running
    • Slave_SQL_Running
    • Last_IO_Error
    • Last_SQL_Error

mysqld 확인 실패: 데이터 디스크가 가득 찼습니다.

mysqld check failed: data disk is full 오류가 표시됩니다.

문제 원인

DRAIN 작업 중에 이 오류가 발생하면 복제본 인스턴스의 데이터 디스크가 가득 찬 것입니다.

해결 방법

복제본 인스턴스의 디스크 크기를 늘립니다.

다음 단계