이 페이지에서는 외부 서버에서 Cloud SQL로 복제할 때 데이터에 대해 관리형 가져오기를 설정하고 사용하는 방법을 설명합니다.
이 페이지의 모든 단계를 완료해야 합니다. 완료되면 다른 Cloud SQL 인스턴스와 동일한 방식으로 소스 표현 인스턴스를 관리하고 모니터링할 수 있습니다.
시작하기 전에
시작하기 전에 다음 단계를 완료합니다.
복제 사용자의 권한 업데이트
외부 서버의 복제 사용자는 모든 호스트(%
)의 연결을 수락하도록 구성됩니다. Cloud SQL 복제본에서만 사용할 수 있도록 이 사용자 계정을 업데이트합니다.
필수 권한
마이그레이션과 덤프 조합 유형에는 네 가지가 있습니다.
- 유형 1: 지속적 마이그레이션 및 관리형 덤프
- 유형 2: 지속적 마이그레이션 및 수동 덤프
- 유형 3: 일회성 마이그레이션 및 관리형 덤프
- 유형 4: 일회성 마이그레이션 및 수동 덤프
마이그레이션과 덤프 조합의 각 유형 권한은 아래에 나열되어 있습니다.
유형 1
사용자 계정에 다음 권한이 있어야 합니다.
- REPLICATION SLAVE
- 실행
- SELECT
- 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 Console에서 로그 뷰어로 이동합니다.
- 인스턴스 드롭다운에서 Cloud SQL 복제본을 선택합니다.
replication-setup.log
로그 파일을 선택합니다.
Cloud SQL 복제본이 외부 서버에 연결될 수 없으면 다음을 확인합니다.
- 외부 서버의 모든 방화벽이 Cloud SQL 복제본의 발신 IP 주소의 연결을 허용하도록 구성되어 있습니다.
- SSL/TLS 구성이 올바릅니다.
- 복제 사용자, 호스트, 비밀번호가 올바릅니다.
다음 단계
- 인스턴스 업데이트 알아보기
- 복제본 관리 알아보기
- 인스턴스 모니터링 알아보기
- Cloud SQL 복제본 승격 알아보기