이 페이지에서는 외부 서버에서 Cloud SQL로 복제할 때 데이터에 대해 관리형 가져오기를 설정하고 사용하는 방법을 설명합니다.
이 페이지의 모든 단계를 완료해야 합니다. 완료되면 다른 Cloud SQL 인스턴스와 동일한 방식으로 소스 표현 인스턴스를 관리하고 모니터링할 수 있습니다.
시작하기 전에
시작하기 전에 다음 단계를 완료합니다.
복제 사용자의 권한 업데이트
외부 서버의 복제 사용자는 모든 호스트(%
)의 연결을 수락하도록 구성됩니다. Cloud SQL 복제본에서만 사용할 수 있도록 이 사용자 계정을 업데이트합니다.
필수 권한
마이그레이션과 덤프 조합 유형에는 네 가지가 있습니다.
- 유형 1: 지속적 마이그레이션 및 관리형 덤프
- 유형 2: 지속적 마이그레이션 및 수동 덤프
- 유형 3: 일회성 마이그레이션 및 관리형 덤프
- 유형 4: 일회성 마이그레이션 및 수동 덤프
마이그레이션과 덤프 조합의 각 유형 권한은 아래에 나열되어 있습니다.
사용자 계정에 다음 권한이 있어야 합니다.
- REPLICATION SLAVE
- 실행
- SELECT
- SHOW VIEW
- REPLICATION CLIENT
- 새로고침
- 트리거
- (Amazon RDS 및 Amazon Aurora에서만 마이그레이션) 테이블 잠금
MySQL 버전 8.0 이상에서는 최적의 성능을 위해 BACKUP ADMIN
권한을 건너뛰는 것이 좋습니다.
사용자 계정에 다음 권한이 있어야 합니다.
사용자 계정에 다음 권한이 있어야 합니다.
MySQL 버전 8.0 이상에서는 최적의 성능을 위해 BACKUP ADMIN
권한을 건너뛰는 것이 좋습니다.
필요한 권한이 없습니다.
권한 업데이트
권한을 업데이트하려면 외부 서버에서 터미널을 열고 다음 명령어를 입력합니다.
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 터미널을 열고 다음 명령어를 입력합니다.
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 작업을 수행하지 않습니다. 이렇게 하면 가져오는 동안 불일치가 발생할 수 있습니다. 가져오기 프로세스가 완료되면 복제본은 외부 서버에서 바이너리 로그를 사용하여 외부 서버의 현재 상태를 반영합니다.
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 복제본 승격 알아보기