이 페이지에서는 외부 서버에서 Cloud SQL로 복제할 때 데이터에 대해 관리형 가져오기를 설정하고 사용하는 방법을 설명합니다.
이 페이지의 모든 단계를 완료해야 합니다. 완료되면 다른 Cloud SQL 인스턴스와 동일한 방식으로 소스 표현 인스턴스를 관리하고 모니터링할 수 있습니다.
시작하기 전에
시작하기 전에 다음 단계를 완료합니다.
복제 사용자의 권한 업데이트
외부 서버의 복제 사용자는 모든 호스트(%)의 연결을 수락하도록 구성됩니다. Cloud SQL 복제본에서만 사용할 수 있도록 이 사용자 계정을 업데이트합니다.
필수 권한
마이그레이션과 덤프 조합 유형에는 네 가지가 있습니다.
- 유형 1: 지속적 마이그레이션 및 관리형 덤프
 - 유형 2: 지속적 마이그레이션 및 수동 덤프
 - 유형 3: 일회성 마이그레이션 및 관리형 덤프
 - 유형 4: 일회성 마이그레이션 및 수동 덤프
 
마이그레이션과 덤프 조합의 각 유형 권한은 아래에 나열되어 있습니다.
유형 1
사용자 계정에 다음 권한이 있어야 합니다.
- REPLICATION SLAVE
 - 실행
 - 선택
 - SHOW VIEW
 - REPLICATION CLIENT
 - 새로고침
 - 트리거
 - (Amazon RDS 및 Amazon Aurora에서만 마이그레이션) 테이블 잠금
 
MySQL 버전 8.0 이상에서는 최적의 성능을 위해 BACKUP ADMIN 권한을 건너뛰는 것이 좋습니다.
유형 2
사용자 계정에 다음 권한이 있어야 합니다.
유형 3
사용자 계정에 다음 권한이 있어야 합니다.
MySQL 버전 8.0 이상에서는 최적의 성능을 위해 BACKUP ADMIN 권한을 건너뛰는 것이 좋습니다.
유형 4
필요한 권한이 없습니다.
권한 업데이트
권한을 업데이트하려면 외부 서버에서 터미널을 열고 다음 명령어를 입력합니다.
mysql 클라이언트
GTID의 경우:
UPDATE mysql.user SET Host='NEW_HOST' WHERE Host='OLD_HOST' AND User='USERNAME'; GRANT REPLICATION SLAVE, EXECUTE, SELECT, SHOW VIEW, REPLICATION_CLIENT, RELOAD ON . TO 'USERNAME'@'HOST'; FLUSH PRIVILEGES;
바이너리 로그의 경우:
UPDATE mysql.user SET Host='NEW_HOST' WHERE Host='OLD_HOST' AND User='USERNAME'; GRANT REPLICATION SLAVE, EXECUTE, SELECT, SHOW VIEW, REPLICATION CLIENT, RELOAD 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, SELECT, SHOW VIEW, REPLICATION CLIENT,
RELOAD ON *.* TO 'username'@'host.com';
FLUSH PRIVILEGES;
| 속성 | 설명 | 
|---|---|
| NEW_HOST | Cloud SQL 복제본의 발신 IP를 지정합니다. | 
| OLD_HOST | 변경하려는 Host에 지정된 현재 값입니다. | 
| USERNAME | 외부 서버의 복제 사용자 계정입니다. | 
| GCP_USERNAME | 사용자 계정의 사용자 이름입니다. | 
| HOST | 사용자 계정의 호스트 이름입니다. | 
복제 설정 확인
설정이 완료되면 Cloud SQL 복제본이 외부 서버에서 복제할 수 있는지 확인합니다.
다음 외부 동기화 설정은 정확해야 합니다.
- Cloud SQL 복제본과 외부 서버 간 연결
 - 사용자 권한 복제
 - 버전 호환성
 - Cloud SQL 복제본은 아직 복제하지 않습니다.
 - Binlog가 외부 서버에서 사용 설정되어 있는지
 - RDS 외부 서버에서 외부 동기화를 시도하고 Google Cloud 버킷을 사용하는 경우 GTID가 사용 설정되어 있습니다.
 
이 설정을 확인하려면 Cloud Shell 터미널을 열고 다음 명령어를 입력합니다.
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",
         "syncParallelLevel": "SYNC_PARALLEL_LEVEL",
         "mysqlSyncConfig": {
           "initialSyncFlags": "SYNC_FLAGS"
         }
       }' \
     -X POST \
     https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID/instances/REPLICA_INSTANCE_ID/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",
         "syncParallelLevel": "optimal"
       }' \
     -X POST \
     https://sqladmin.googleapis.com/sql/v1beta4/projects/myproject/instances/myreplica/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",
         "syncParallelLevel": "optimal"
         "mysqlSyncConfig": {
             "initialSyncFlags": [{"name": "max-allowed-packet", "value": "1073741824"}, {"name": "hex-blob"}, {"name": "compress"}]
             }
       }' \
     -X POST \
     https://sqladmin.googleapis.com/sql/v1beta4/projects/MyProject/instances/replica-instance/verifyExternalSyncSettings
이러한 호출에서 sql#externalSyncSettingErrorList 유형 목록을 반환합니다.
목록이 비어 있으면 오류가 없는 것입니다. 오류가 없는 응답은 다음과 같이 표시됩니다.
{ "kind": "sql#externalSyncSettingErrorList" }
| 속성 | 설명 | 
|---|---|
| SYNC_MODE | 복제가 설정된 후 Cloud SQL 복제본과 외부 서버를 동기화 상태로 유지할 수 있는지 확인합니다. 동기화 모드에는 EXTERNAL_SYNC_MODE_UNSPECIFIED, ONLINE, OFFLINE이 있습니다. | 
  
| SYNC_PARALLEL_LEVEL | 데이터베이스 테이블의 데이터가 전송되는 속도를 제어하는 설정을 확인합니다. 사용할 수 있는 값은 다음과 같습니다. 
 참고: 이 매개변수의 기본값은   | 
  
| SYNC_FLAGS | 확인할 초기 동기화 플래그 목록입니다. 소스에서 복제할 때 커스텀 동기화 플래그를 사용하려는 경우에만 권장됩니다. 허용되는 플래그 목록은 초기 동기화 플래그를 참조하세요. | 
| PROJECT_ID | Google Cloud 프로젝트의 ID | 
| REPLICA_INSTANCE_ID | Cloud SQL 복제본의 ID입니다. | 
전역 읽기 잠금 권한
Amazon RDS 및 Amazon Aurora와 같이 외부 서버의 전역 읽기 잠금에 액세스할 수 있는 권한이 없으면 다음 단계에 설명된 대로 서버에 쓰기를 일시중지합니다.
- 로그 탐색기로 이동하여 리소스 목록에서 Cloud SQL 복제본을 선택합니다. Cloud SQL 복제본의 최근 로그 목록이 표시됩니다. 지금은 무시하세요.
 - 터미널을 열고 외부 서버에서 복제 시작의 명령어를 입력하여 외부 서버에서 복제합니다.
 로그 탐색기로 돌아갑니다. 다음과 같은 로그가 표시되면 외부 서버의 데이터베이스에 쓰기를 중지합니다. 대부분의 경우 이는 몇 초 동안만 필요합니다.
DUMP_IMPORT(START): Start importing data, please pause any write to the external primary database.로그 탐색기에 다음 로그 항목이 표시되면 외부 서버의 데이터베이스에 쓰기를 다시 사용 설정합니다.
DUMP_IMPORT(SYNC): Consistent state on primary and replica. Writes to the external primary may resume.
외부 서버에서 복제 시작
외부 서버에서 복제할 수 있는지 확인한 후 복제를 시작합니다. 초기 가져오기 프로세스의 복제 수행 속도는 시간당 최대 500GB입니다. 그러나 이 속도는 머신 등급, 데이터 디스크 크기, 네트워크 처리량, 데이터베이스 특성에 따라 달라질 수 있습니다.
초기 가져오기 프로세스 중에는 외부 서버에서 DDL 작업을 수행하지 않습니다. 이렇게 하면 가져오는 동안 불일치가 발생할 수 있습니다. 가져오기 프로세스가 완료되면 복제본은 외부 서버에서 바이너리 로그를 사용하여 외부 서버의 현재 상태를 반영합니다.
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",
         "syncParallelLevel": "SYNC_PARALLEL_LEVEL",
         "mysqlSyncConfig": {
           "initialSyncFlags": "SYNC_FLAGS"
         }
       }' \
     -X POST \
     https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID/instances/REPLICA_INSTANCE_ID/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",
         "syncParallelLevel": "optimal"
       }' \
     -X POST \
     https://sqladmin.googleapis.com/sql/v1beta4/projects/MyProject/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",
         "syncParallelLevel": "optimal"
         "skipVerification": false,
         "mysqlSyncConfig": {
             "initialSyncFlags": [{"name": "max-allowed-packet", "value": "1073741824"}, {"name": "hex-blob"}, {"name": "compress"}]
             }
       }' \
     -X POST \
     https://sqladmin.googleapis.com/sql/v1beta4/projects/MyProject/instances/replica-instance/startExternalSync
| 속성 | 설명 | 
|---|---|
| SYNC_MODE | 복제가 설정된 후 Cloud SQL 복제본과 외부 서버를 동기화 상태로 유지할 수 있는지 확인합니다. | 
| SKIP_VERIFICATION | 데이터를 동기화하기 전에 기본 제공 확인 단계를 건너뛸지 여부입니다. 이 매개변수는 이미 복제 설정을 확인한 경우에만 권장됩니다. | 
| SYNC_PARALLEL_LEVEL | 데이터베이스 테이블의 데이터가 전송되는 속도를 제어하는 설정을 제공합니다. 사용할 수 있는 값은 다음과 같습니다. 
 참고: 이 매개변수의 기본값은   | 
  
| SYNC_FLAGS | 확인할 초기 동기화 플래그 목록입니다. 소스에서 복제할 때 커스텀 동기화 플래그를 사용하려는 경우에만 권장됩니다. 허용되는 플래그 목록은 초기 동기화 플래그를 참조하세요. | 
| PROJECT_ID | Google Cloud 프로젝트의 ID | 
| REPLICA_INSTANCE_ID | Cloud SQL 복제본의 ID입니다. | 
초기 동기화 플래그
커스텀 데이터베이스 플래그를 사용하여 마이그레이션하려면 다음 허용 플래그를 사용하면 됩니다.
- --add-drop-database
 - --add-drop-table
 - --add-drop-trigger
 - --add-locks
 - --allow-keywords
 - --all-tablespaces
 - --apply-slave-statements
 - --column-statistics
 - --comments
 - --compact
 - --compatible
 - --complete-insert
 - --compress
 - --compression-algorithms
 - --create-options
 - --default-character-set
 - --delayed-insert
 - --disable-keys
 - --dump-date
 - --events
 - --extended-insert
 - --fields-enclosed-by
 - --fields-escaped-by
 - --fields-optionally-enclosed-by
 - --fields-terminated-by
 - --flush-logs
 - --flush-privileges
 - --force
 - --get-server-public-key
 - --hex-blob
 - --ignore-error
 - --ignore-read-lock-error
 - --ignore-table
 - --insert-ignore
 - --lines-terminated-by
 - --lock-all-tables
 - --lock-tables
 - max_allowed_packet
 - --net-buffer-length
 - --network-timeout
 - --no-autocommit
 - --no-create-db
 - --no-create-info
 - --no-data
 - --no-defaults
 - --no-set-names
 - --no-tablespaces
 - --opt
 - --order-by-primary
 - --pipe
 - --quote-names
 - --quick
 - --replace
 - --routines
 - --secure-auth
 - --set-charset
 - --shared-memory-base-name
 - --show-create-skip-secondary-engine
 - --skip-opt
 - --ssl-cipher
 - --ssl-fips-mode
 - --ssl-verify-server-cert
 - --tls-ciphersuites
 - --tls-version
 - --triggers
 - --tz-utc
 - --verbose
 - --xml
 - --zstd-compression-level
 
허용되는 값은 MySQL 공개 문서를 참조하세요.
마이그레이션 모니터링
외부 서버에서 복제를 시작하면 복제를 모니터링해야 합니다. 자세한 내용은 복제 모니터링을 참조하세요. 그러면 마이그레이션을 완료할 수 있습니다.
문제 해결
다음 문제 해결 옵션을 고려하세요.
| 문제 | 문제 해결 | 
|---|---|
| 생성 시 읽기 복제본이 복제를 시작하지 않음 | 로그 파일에 더 구체적인 오류가 있을 수 있습니다. Cloud Logging의 로그를 검사하여 실제 오류를 찾으세요. | 
| 읽기 복제본을 만들 수 없음 - invalidFlagValue 오류 | 요청의 플래그 중 하나가 잘못되었습니다. 명시적으로 제공한 플래그 또는 기본값으로 설정된 플래그일 수 있습니다.
     먼저  
  | 
  
| 읽기 복제본을 만들 수 없음 - 알 수 없는 오류 | 로그 파일에 더 구체적인 오류가 있을 수 있습니다.
    Cloud Logging의 로그를 검사하여 실제 오류를 찾으세요.
     오류가   | 
  
| 디스크가 가득 참 | 복제본을 만드는 동안 기본 인스턴스 디스크 크기가 가득 찰 수 있습니다. 기본 인스턴스를 수정하여 더 큰 디스크 크기로 업그레이드합니다. | 
| 복제본 인스턴스가 너무 많은 메모리를 사용하고 있습니다. | 복제본은 임시 메모리를 사용하여 자주 요청되는 읽기 작업을 캐시하므로 기본 인스턴스보다 더 많은 메모리를 사용할 수 있습니다.
     복제본 인스턴스를 다시 시작하여 임시 메모리 공간을 회수합니다.  | 
  
| 복제가 중지되었습니다. | 최대 스토리지 한도에 도달했고 스토리지 자동 증가가 사용 설정되지 않았습니다.
     인스턴스를 수정하여   | 
  
| 긴 복제 지연 시간이 지속적으로 발생함 | 쓰기 부하가 너무 높아 복제본이 처리할 수 없습니다. 복제본의 SQL 스레드가 IO 스레드를 따라잡을 수 없는 경우 복제 지연이 발생합니다. 일부 쿼리 또는 워크로드로 인해 특정 스키마에서 일시적이거나 영구적인 복제 지연이 발생할 수 있습니다. 복제 지연이 발생하는 일반적인 원인은 다음과 같습니다.
 가능한 솔루션은 다음과 같습니다. 
  | 
  
| 복제 지연 시간이 갑자기 증가합니다. | 장기 실행 트랜잭션으로 인해 발생합니다. 트랜잭션(단일 문 또는 다중 문)이 소스 인스턴스에서 커밋되면 트랜잭션의 시작 시간이 바이너리 로그에 기록됩니다. 복제본에 이 바이너리 로그 이벤트가 수신되면 타임스탬프를 현재 타임스탬프와 비교해서 복제 지연 시간을 계산합니다. 따라서 소스에 장기 실행 트랜잭션이 있을 경우 복제본에서 즉각적인 큰 복제 지연을 일으킬 수 있습니다. 트랜잭션에서 행이 변경되는 정도가 크면 복제본에서도 이를 수행하기 위해 긴 시간이 소비됩니다. 이 기간 동안 복제 지연이 증가합니다. 복제본에서 이 트랜잭션이 완료된 다음의 캐치업 기간은 소스의 쓰기 워크로드 및 복제본의 처리 속도에 따라 달라집니다.
     트랜잭션이 길어지는 것을 방지하기 위해 몇 가지 가능한 해결 방법이 있습니다. 
  | 
  
| 병렬 복제 플래그를 변경하면 오류가 발생합니다. | 이러한 플래그 중 하나 이상에 잘못된 값이 설정되었습니다.
     오류 메시지를 표시하는 기본 인스턴스에서 다음과 같이 병렬 복제 플래그를 설정합니다. 
  | 
  
| 제한 시간으로 인해 복제본을 만들지 못했습니다. | 기본 인스턴스에서 커밋되지 않은 장기 실행 트랜잭션으로 인해 읽기 복제본을 만들지 못할 수 있습니다.
     실행 중인 모든 쿼리를 중지한 후 복제본을 다시 만듭니다.  | 
  
또한 MySQL의 경우 다음 옵션도 고려하세요.
| 문제 | 문제 해결 | 
|---|---|
Lost connection to MySQL server during query when dumping table. | 
    소스를 사용할 수 없거나 덤프가 너무 큰 패킷을 포함하고 있을 수 있습니다. 외부 기본 프로젝트를 연결할 수 있는지 확인합니다. 소스 인스턴스에서 net_read_timeout 및 net_write_timeout 플래그의 값을 수정하여 오류를 중지할 수도 있습니다. 이러한 플래그에 허용되는 값에 대한 자세한 내용은 데이터베이스 플래그 구성을 참조하세요. 관리형 가져오기 마이그레이션에   | 
  
| 초기 데이터 마이그레이션이 성공했지만 복제 중인 데이터가 없습니다. | 한 가지 가능한 근본 원인은 소스 데이터베이스에서 복제 플래그를 정의하여 일부 또는 전체 데이터베이스 변경사항이 복제되지 않기 때문일 수 있습니다.
     
 기본 인스턴스에서   | 
  
| 초기 데이터 마이그레이션에 성공했지만 얼마 후 데이터 복제가 더 이상 작동하지 않습니다. | 해결 방법:
     
 
  | 
  
mysqld check failed: data disk is full. | 
    복제본 인스턴스의 데이터 디스크가 가득 찼습니다.
     복제본 인스턴스의 디스크 크기를 늘립니다. 수동으로 디스크 크기를 늘리거나 스토리지 자동 증가를 사용 설정할 수 있습니다.  | 
  
복제 로그 검토
복제 설정을 확인하면 로그가 생성됩니다.
이러한 로그를 확인하려면 다음 단계를 따르세요.
Google Cloud 콘솔에서 로그 뷰어로 이동합니다.
- 인스턴스 드롭다운에서 Cloud SQL 복제본을 선택합니다.
 replication-setup.log로그 파일을 선택합니다.
Cloud SQL 복제본이 외부 서버에 연결될 수 없으면 다음을 확인합니다.
- 외부 서버의 모든 방화벽이 Cloud SQL 복제본의 발신 IP 주소의 연결을 허용하도록 구성되어 있습니다.
 - SSL/TLS 구성이 올바릅니다.
 - 복제 사용자, 호스트, 비밀번호가 올바릅니다.
 
다음 단계
- 인스턴스 업데이트 알아보기
 - 복제본 관리 알아보기
 - 인스턴스 모니터링 알아보기
 - Cloud SQL 복제본 승격 알아보기