이 튜토리얼에서는 Compute Engine에서 실행되는 MySQL 데이터베이스를 클론하는 두 가지 방법을 보여줍니다. 한 가지 방법은 영구 디스크 스냅샷을 사용하는 것이고, 다른 방법은 네이티브 MySQL 내보내기 및 가져오기를 사용하여 Cloud Storage를 통해 내보내기 파일을 전송하는 것입니다. Cloud Storage는 Google Cloud 객체 스토리지 서비스입니다. 간편하고 보안이 강화된 내구성과 가용성이 높은 파일 저장 방식을 제공합니다.
클론은 데이터베이스를 다른 서버로 복사하는 프로세스입니다. 복사는 소스 데이터베이스와 별개이며 특정 시점의 스냅샷으로 보존됩니다. 프로덕션 서버에 부하를 주거나 프로덕션 데이터의 무결성을 손상하지 않고 클론된 데이터베이스를 다양한 목적으로 사용할 수 있습니다. 이러한 목적 중 일부는 다음과 같습니다.
- 분석 쿼리 수행
- 앱 부하 테스트 또는 통합 테스트
- 데이터 웨어하우스를 채우기 위한 데이터 추출
- 데이터에 대한 실험 실행
이 튜토리얼에 설명된 각 클론 방식에는 장단점이 있습니다. 가장 적합한 방식은 사용자의 상황에 따라 다릅니다. 다음 표에서는 몇 가지 주요 문제를 보여줍니다.
문제 | 방식 1: 디스크 스냅샷 | 방식 2: Cloud Storage를 사용하여 내보내기 및 가져오기 |
---|---|---|
MySQL 인스턴스에 필요한 추가 디스크 공간 | 추가 디스크 공간 필요 없음 | 생성 및 복원 시 내보내기 파일 저장에 필요한 추가 공간 |
클론 시 소스 MySQL 인스턴스에 추가 부하 | 추가 부하 없음 | 내보내기 파일 생성 및 업로드 시 CPU 및 I/O에 추가 부하 |
클론 기간 | 대규모 데이터베이스의 경우 비교적 빠름 | 대규모 데이터베이스의 경우 비교적 느림 |
Google Cloud 외부의 MySQL 인스턴스에서 클론 가능 | 아니요 | 예 |
복잡성 | 클론된 디스크를 연결하기 위한 복잡한 명령어 시퀀스 | 비교적 간단한 클론 명령어 집합 |
기존 백업 시스템 활용 가능 | 예, 백업 시스템이 Google Cloud 디스크 스냅샷을 사용하는 경우 | 예, 백업 시스템에서 파일을 Cloud Storage로 내보내는 경우 |
클론의 세부사항 | 전체 디스크만 클론 가능 | 지정된 데이터베이스만 클론 가능 |
데이터 일관성 | 스냅샷 시점에서 일관적 | 내보내기 시점에서 일관적 |
Cloud SQL을 소스로 사용 가능 | 아니요 | 예, 동일한 버전을 사용하는 경우 |
Cloud SQL을 대상으로 사용 가능 | 아니요 | 예 |
이 가이드에서는 사용자가 Linux 명령줄 및 MySQL 데이터베이스 관리에 익숙하다고 가정합니다.
목표
- Google Cloud에서 MySQL 데이터베이스를 실행하는 방법을 알아봅니다.
- 보조 디스크에 데모 데이터베이스를 만드는 방법을 알아봅니다.
- Compute Engine 디스크 스냅샷을 사용하여 MySQL 데이터베이스를 클론하는 방법을 알아봅니다.
- Cloud Storage를 사용해 내보내기 파일을 전송하여 MySQL 데이터베이스를 클론하는 방법을 알아봅니다.
- Cloud Storage를 사용해 내보내기 파일을 전송하여 MySQL 데이터베이스를 Cloud SQL로 클론하는 방법을 알아봅니다.
비용
이 문서에서는 비용이 청구될 수 있는 다음과 같은 Google Cloud 구성요소를 사용합니다.
프로젝트 사용량을 기준으로 예상 비용을 산출하려면 가격 계산기를 사용하세요.
이 문서에 설명된 태스크를 완료했으면 만든 리소스를 삭제하여 청구가 계속되는 것을 방지할 수 있습니다. 자세한 내용은 삭제를 참조하세요.
시작하기 전에
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
- Compute Engine API를 사용 설정합니다. API 사용 설정
환경 설정
이 가이드를 완료하려면 다음을 사용하여 컴퓨팅 환경을 설정해야 합니다.
- 프로덕션 데이터베이스 서버를 나타내는 Compute Engine의 MySQL 인스턴스(
mysql-prod
) - 프로덕션 데이터베이스를 저장하기 위해 프로덕션 서버에 연결된 추가 디스크(
mysql-prod-data
) - 클론할 프로덕션 데이터베이스를 시뮬레이션하기 위해
mysql-prod
로 가져온Employees
데이터베이스의 사본 - 테스트 데이터베이스 서버를 나타내는 Compute Engine의 MySQL 인스턴스(
mysql-test
). 이 서버에 데이터베이스를 클론합니다.
이 아키텍처를 다이어그램으로 나타내면 다음과 같습니다.
프로덕션 VM 인스턴스 만들기
프로덕션 환경을 시뮬레이션하려면 Debian Linux에서 MySQL을 실행하는 Compute Engine VM 인스턴스를 설정합니다.
이 가이드의 VM 인스턴스는 두 개의 디스크, 즉 OS 및 사용자 계정용 50GB 디스크와 데이터베이스 스토리지용 100GB 디스크를 사용합니다.
Compute Engine에서 별도의 디스크를 사용해도 성능 이점이 없습니다. 디스크 성능은 인스턴스에 연결된 모든 디스크의 총 스토리지 용량과 VM 인스턴스의 총 vCPU 수에 따라 결정됩니다. 따라서 데이터베이스와 로그 파일은 동일한 디스크에 있을 수 있습니다.
Cloud Shell을 엽니다.
원하는 영역을 설정합니다.
ZONE=us-east1-b REGION=us-east1 gcloud config set compute/zone "${ZONE}"
Compute Engine 인스턴스를 만듭니다.
gcloud compute instances create mysql-prod \ --machine-type=n1-standard-2 \ --scopes=cloud-platform \ --boot-disk-size=50GB \ --boot-disk-device-name=mysql-prod \ --create-disk="mode=rw,size=100,type=pd-standard,name=mysql-prod-data,device-name=mysql-prod-data"
이 명령어는 인스턴스에 Google Cloud APIs에 대한 전체 액세스 권한을 부여하고, 100GB 보조 디스크를 만들고, 디스크를 인스턴스에 연결합니다. 이 튜토리얼에서는 고성능이 필요하지 않기 때문에 디스크 성능 경고는 무시합니다.
추가 디스크 설정
프로덕션 인스턴스에 연결된 두 번째 디스크는 프로덕션 데이터베이스를 저장하는 데 사용됩니다. 이 디스크는 비어 있으므로 디스크를 파티션으로 나누고 포맷하고 마운트해야 합니다.
Google Cloud 콘솔에서 VM 인스턴스 페이지로 이동합니다.
mysql-prod
인스턴스 이름 옆에 녹색 체크표시 check를 표시하여 인스턴스가 준비되었음을 나타냅니다.mysql-prod
인스턴스 옆의 SSH 버튼을 클릭합니다. 브라우저에서 해당 인스턴스로의 터미널 연결이 열립니다.터미널 창에서 인스턴스에 연결된 디스크 목록을 표시합니다.
lsblk
출력은 다음과 같습니다.
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 50G 0 disk └─sda1 8:1 0 50G 0 part / sdb 8:16 0 100G 0 disk
이름이
sdb
(100GB)인 디스크가 데이터 디스크입니다.sdb
디스크를 포맷하고 ext4 파일 시스템으로 단일 파티션을 만듭니다.sudo mkfs.ext4 -m 0 -F -E lazy_itable_init=0,lazy_journal_init=0,discard \ /dev/sdb
데이터 디스크의 마운트 지점 역할을 하는 MySQL 데이터 디렉터리를 만듭니다.
sudo mkdir -p /var/lib/mysql
생성된 마운트 지점에 디스크를 자동으로 마운트하려면
/etc/fstab
파일에 항목을 추가합니다.echo "UUID=`sudo blkid -s UUID -o value /dev/sdb` /var/lib/mysql ext4 discard,defaults,nofail 0 2" \ | sudo tee -a /etc/fstab
디스크를 마운트합니다.
sudo mount -av
MySQL에서 데이터 디렉터리로 사용할 수 있도록 데이터 디스크에서 모든 파일을 삭제합니다.
sudo rm -rf /var/lib/mysql/*
MySQL 서버 설치
MySQL Community Edition을 다운로드하고 설치해야 합니다. MySQL 데이터 디렉터리는 추가 디스크에 만들어집니다.
mysql-prod
에 연결된 SSH 세션에서 MySQL 구성 패키지를 다운로드하고 설치합니다.wget http://repo.mysql.com/mysql-apt-config_0.8.13-1_all.deb sudo dpkg -i mysql-apt-config_0.8.13-1_all.deb
메시지가 표시되면 MySQL 서버 및 클러스터 옵션을 선택한 후 mysql-5.7을 선택합니다.
목록에서 확인 옵션을 선택하여 패키지 구성을 완료합니다.
저장소 캐시를 새로고침하고 mysql-community 패키지를 설치합니다.
sudo apt-get update sudo apt-get install -y mysql-community-server mysql-community-client
데이터 디렉터리가 이미 있다는 경고가 표시되면 확인을 선택합니다.
루트 비밀번호를 입력하라는 메시지가 표시되면 비밀번호를 만들어 입력합니다. 비밀번호를 기록해 두거나 안전한 장소에 임시 보관합니다.
샘플 데이터베이스 다운로드 및 설치
mysql-prod
인스턴스에 연결된 SSH 세션에서 git을 설치합니다.sudo apt-get install -y git
Employees
데이터베이스 스크립트가 포함된 GitHub 저장소를 클론합니다.git clone https://github.com/datacharmer/test_db.git
디렉터리를
Employees
데이터베이스 스크립트의 디렉터리로 변경합니다.cd test_db
Employees
데이터베이스 생성 스크립트를 실행합니다.mysql -u root -p -q < employees.sql
메시지가 표시되면 앞에서 만든 루트 비밀번호를 입력합니다.
샘플 데이터베이스가 작동하는지 확인하려면
employees
테이블의 행 수를 계산하는 쿼리를 실행하면 됩니다.mysql -u root -p -e "select count(*) from employees.employees;"
메시지가 표시되면 앞에서 만든 루트 비밀번호를 입력합니다.
출력은 다음과 같습니다.
+----------+ | count(*) | +----------+ | 300024 | +----------+
테스트 VM 인스턴스 만들기
이 섹션에서는 클론된 데이터베이스의 대상으로 mysql-test
라는 MySQL VM 인스턴스를 만듭니다. 이 인스턴스의 구성은 프로덕션 인스턴스와 동일합니다. 그러나 두 번째 데이터 디스크는 만들지 않는 대신 이 튜토리얼의 뒷부분에서 데이터 디스크를 연결합니다.
Cloud Shell을 엽니다.
테스트 MySQL 인스턴스를 만듭니다.
gcloud compute instances create mysql-test \ --machine-type=n1-standard-2 \ --scopes=cloud-platform \ --boot-disk-size=50GB \ --boot-disk-device-name=mysql-test
이 가이드에서는 고성능이 필요하지 않기 때문에 디스크 성능 경고는 무시해도 됩니다.
테스트 VM 인스턴스에 MySQL 서버 설치
또한 MySQL Community Edition을 mysql-test
VM 인스턴스에 다운로드하고 설치해야 합니다.
mysql-test
에 연결된 SSH 세션에서 MySQL 구성 패키지를 다운로드하고 설치합니다.wget http://repo.mysql.com/mysql-apt-config_0.8.13-1_all.deb sudo dpkg -i mysql-apt-config_0.8.13-1_all.deb
메시지가 표시되면 MySQL 서버 및 클러스터 옵션을 선택한 후 mysql-5.7을 선택합니다.
목록에서 확인 옵션을 선택하여 패키지 구성을 완료합니다.
저장소 캐시를 새로고침하고 mysql-community 패키지를 설치합니다.
sudo apt-get update sudo apt-get install -y mysql-community-server mysql-community-client
루트 비밀번호를 입력하라는 메시지가 표시되면 비밀번호를 만들어 입력합니다. 비밀번호를 기록해 두거나 안전한 장소에 임시 보관합니다.
Compute Engine 디스크 스냅샷을 사용하여 데이터베이스 클론
Compute Engine에서 실행되는 MySQL 데이터베이스를 클론하는 한 가지 방법은 데이터베이스를 별도의 데이터 디스크에 저장하고 영구 디스크 스냅샷을 사용하여 해당 디스크의 클론을 만드는 것입니다.
영구 디스크 스냅샷을 사용하여 특정 시점의 디스크 데이터 사본을 얻을 수 있습니다. 디스크 스냅샷 예약은 데이터를 자동으로 백업하기 위한 한 가지 방법입니다.
튜토리얼의 이 섹션에서는 다음과 같은 작업을 수행하게 됩니다.
- 프로덕션 서버의 데이터 디스크 스냅샷을 만듭니다.
- 스냅샷에서 새 디스크를 만듭니다.
- 새 디스크를 테스트 서버에 마운트합니다.
- 서버가 새 디스크를 데이터 디스크로 사용하도록 테스트 인스턴스에서 MySQL 서버를 다시 시작합니다.
다음 다이어그램은 디스크 스냅샷을 사용하여 데이터베이스를 클론하는 방법을 보여줍니다.
디스크 스냅샷 만들기
Cloud Shell을 엽니다.
VM 인스턴스와 동일한 영역에 데이터 디스크의 스냅샷을 만듭니다.
gcloud compute disks snapshot mysql-prod-data \ --snapshot-names=mysql-prod-data-snapshot \ --zone="${ZONE}"
몇 분 후에 스냅샷이 생성됩니다.
디스크 스냅샷을 테스트 인스턴스에 연결
생성한 스냅샷에서 새 데이터 디스크를 만든 다음 mysql-test
인스턴스에 연결해야 합니다.
Cloud Shell을 엽니다.
프로덕션 디스크의 콘텐츠 스냅샷을 사용하여 새 영구 디스크를 만듭니다.
gcloud beta compute disks create mysql-test-data \ --size=100GB \ --source-snapshot=mysql-prod-data-snapshot \ --zone="${ZONE}"
새 디스크를 읽기-쓰기 권한이 있는
mysql-test
인스턴스에 연결합니다.gcloud compute instances attach-disk mysql-test \ --disk=mysql-test-data --mode=rw
Linux에서 새 데이터 디스크 마운트
클론된 데이터 디스크를 MySQL 데이터 디렉터리로 사용하려면 MySQL 인스턴스를 중지하고 디스크를 마운트해야 합니다.
mysql-test
에 연결된 SSH 세션에서 MySQL 서비스를 중지합니다.sudo service mysql stop
터미널 창에서 인스턴스에 연결된 디스크 목록을 표시합니다.
lsblk
출력은 다음과 같습니다.
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 50G 0 disk └─sda1 8:1 0 50G 0 part / sdb 8:16 0 100G 0 disk
이름이
sdb
(100GB)인 디스크가 데이터 디스크입니다.MySQL 데이터 디스크를 MySQL 데이터 디렉터리에 마운트합니다.
sudo mount -o discard,defaults /dev/sdb /var/lib/mysql
이 디스크를 마운트하면 MySQL 구성 파일과 테이블스페이스를 숨기고 디스크의 콘텐츠로 대체합니다.
이 명령어를 사용하면 디스크가 일시적으로 마운트되고 시스템 부팅 시 다시 마운트되지 않습니다. 시스템 부팅 시 디스크를 마운트하려면
fstab
항목을 만듭니다. 자세한 내용은 이 튜토리얼 앞부분의 추가 디스크 설정을 참조하세요.
테스트 인스턴스에서 MySQL 시작
mysql-test
에 연결된 SSH 세션에서 MySQL 서비스를 시작합니다.sudo service mysql start
클론된 데이터베이스가 작동하는지 확인하려면
employees
테이블의 행 수를 계산하는 쿼리를 실행하면 됩니다.mysql -u root -p -e "select count(*) from employees.employees;"
메시지가 표시되면
mysql-prod
데이터베이스 서버의 루트 비밀번호를 입력합니다. 전체 MySQL 데이터 디렉터리가mysql-prod
인스턴스의 데이터 디렉터리 클론이므로 프로덕션 인스턴스의 루트 비밀번호가 필요합니다. 그래야 모든 데이터베이스, 데이터베이스 사용자, 비밀번호가 복사됩니다.+----------+ | count(*) | +----------+ | 300024 | +----------+
행 수는
mysql-prod
인스턴스와 동일합니다.
이제 영구 디스크 스냅샷을 사용하여 데이터베이스를 클론하는 방법을 알아보았으므로 내보내기 및 가져오기를 사용하여 데이터베이스를 클론할 수 있습니다. 이 두 번째 접근 방식에 대한 튜토리얼을 완료하려면 클론된 디스크를 마운트 해제해야 합니다.
클론된 디스크 마운트 해제
디스크 스냅샷을 사용하여 만든 클론된 디스크를 마운트 해제하려면 다음 단계를 수행하세요.
mysql-test
인스턴스에 연결된 SSH 세션에서 MySQL 서비스를 중지합니다.sudo service mysql stop
MySQL 데이터 디렉터리에서 클론된 데이터 디스크를 마운트 해제합니다.
sudo umount /var/lib/mysql
MySQL 서비스를 다시 시작합니다.
sudo service mysql start
내보내기 및 가져오기를 사용한 클론
Compute Engine에서 실행되는 MySQL 데이터베이스를 클론하는 두 번째 방법은 네이티브 MySQL 내보내기(mysqldump
사용) 및 가져오기를 사용하는 것입니다. 이 접근 방식에서는 Cloud Storage를 사용하여 내보내기 파일을 전송합니다.
이 튜토리얼 섹션에서는 이 튜토리얼의 데이터베이스 클론 섹션에서 Compute Engine 디스크 스냅샷을 사용하여 만든 리소스를 사용합니다. 해당 섹션을 완료하지 않은 경우 계속하기 전에 해당 리소스를 만들어야 합니다.
튜토리얼의 이 섹션에서는 다음과 같은 작업을 수행하게 됩니다.
- Cloud Storage 버킷을 만듭니다.
- 프로덕션 인스턴스에서 데이터베이스를 내보내고 Cloud Storage에 씁니다.
- 내보내기 파일을 테스트 인스턴스로 가져와서 Cloud Storage에서 읽습니다.
다음 다이어그램은 Cloud Storage를 사용해 내보내기를 전송하여 데이터베이스를 클론하는 방법을 보여줍니다.
Google Cloud 외부 시스템에 Cloud Storage에 대한 액세스 권한을 부여할 수 있으므로 이 접근 방식을 통해 외부 MySQL 인스턴스에서 데이터베이스를 클론할 수 있습니다.
Cloud Storage 버킷 만들기
내보내기 파일을 mysql-prod
인스턴스에서 mysql-test
인스턴스로 전송 시 내보내기 파일을 저장하는 Cloud Storage 버킷을 만들어야 합니다.
Cloud Shell을 엽니다.
VM 인스턴스와 동일한 리전에 Cloud Storage 버킷을 만듭니다.
gcloud storage buckets create "gs://$(gcloud config get-value project)-bucket" --location="${REGION}"
데이터베이스 내보내기
사용자의 프로덕션 환경에서는 이미 mysqldump
내보내기 파일을 사용하여 백업을 만들 수 있습니다. 이 백업을 기반으로 데이터베이스를 클론할 수 있습니다.
이 튜토리얼에서는 mysqldump
를 사용해 내보내기 파일을 새로 만들어 기존의 전체 또는 증분 백업 일정에 영향을 주지 않도록 합니다.
mysql-prod
인스턴스에 연결된 SSH 세션에서Employees
데이터베이스를 내보내서 이전에 만든 버킷의 Cloud Storage 객체로 스트리밍합니다.mysqldump --user=root -p --default-character-set=utf8mb4 --add-drop-database --verbose --hex_blob \ --databases employees |\ gcloud storage cp - "gs://$(gcloud config get-value project)-bucket/employees-dump.sql"
메시지가 표시되면
mysql-prod
데이터베이스 서버의 루트 비밀번호를 입력합니다.내보내기에서
utf8mb4
문자 집합을 사용하여 문자 인코딩 문제를 방지할 수 있습니다.DROP DATABASE
및CREATE DATABASE
문이 내보내기에 포함되도록--add-drop-database
옵션을 사용합니다.
내보낸 파일 가져오기
mysql-test
인스턴스에 연결된 SSH 세션에서 내보낸 파일을 Cloud Storage 버킷에서mysql
명령줄 애플리케이션으로 스트리밍합니다.gcloud storage cat "gs://$(gcloud config get-value project)-bucket/employees-dump.sql" |\ mysql --user=root -p --default-character-set=utf8mb4
메시지가 표시되면
mysql-test
데이터베이스 서버의 루트 비밀번호를 입력합니다.가져오기에서
utf8mb4
문자 집합을 사용하여 문자 인코딩 문제를 방지할 수 있습니다.클론된 데이터베이스가 작동하는지 확인하려면
employees
테이블의 행 수를 계산하는 쿼리를 실행하면 됩니다.mysql -u root -p -e "select count(*) from employees.employees;"
메시지가 표시되면
mysql-test
데이터베이스 서버의 루트 비밀번호를 입력합니다.+----------+ | count(*) | +----------+ | 300024 | +----------+
행 수는
mysql-prod
인스턴스와 동일합니다.
Cloud SQL을 클론 대상으로 사용
대상 데이터베이스가 Cloud SQL에서 호스팅되고 원본 데이터베이스가 Compute Engine에 있는 경우 지원되는 클론 메커니즘은 데이터베이스를 Cloud Storage로 내보낸 다음 Cloud SQL로 가져오는 것입니다.
Cloud SQL 문서에 설명된 대로 Cloud SQL은 어떤 트리거, 저장 프로시져, 뷰 또는 함수도 포함되지 않은 내보낸 파일만 가져올 수 있습니다.
데이터베이스가 이러한 요소 중 하나라도 사용하는 경우 --skip-triggers
및 --ignore-table [VIEW_NAME]
명령줄 인수를 사용해 내보내기에서 해당 요소를 제외한 다음 가져오기 후에 이를 수동으로 다시 만들어야 합니다.
MySQL용 Cloud SQL 인스턴스 만들기
Cloud Shell을 엽니다.
mysql-prod
인스턴스와 동일한 데이터베이스 버전을 실행하는 MySQL용 Cloud SQL 인스턴스를 만듭니다.gcloud sql instances create mysql-cloudsql \ --tier=db-n1-standard-2 --region=${REGION} --database-version MYSQL_5_7
몇 분 후 Cloud SQL 데이터베이스가 생성됩니다.
루트 사용자 비밀번호를 알려진 값으로 재설정합니다.
gcloud sql users set-password root \ --host=% --instance=mysql-cloudsql --prompt-for-password
루트 비밀번호를 입력하라는 메시지가 표시되면 비밀번호를 만들어 입력합니다. 비밀번호를 기록해 두거나 안전한 장소에 임시 보관합니다.
데이터베이스 내보내기
Cloud SQL로 가져오기에 적합한 형식으로 데이터베이스를 내보내려면 데이터베이스에 어떤 뷰도 포함해서는 안 됩니다.
mysql-prod
인스턴스에 연결된 SSH 세션에서mysqldump
명령어에 사용할 명령줄 인수 집합이 포함된 환경 변수를 설정하여Employees
데이터베이스의 뷰를 무시합니다.DATABASE_NAME=employees IGNORE_TABLES_ARGS="`mysql -u root -p -s -s -e \" SELECT CONCAT('--ignore-table ${DATABASE_NAME}.',TABLE_NAME) FROM information_schema.TABLES WHERE TABLE_TYPE LIKE 'VIEW' AND TABLE_SCHEMA = '${DATABASE_NAME}'; \"`"
메시지가 표시되면
mysql-prod
데이터베이스 서버의 루트 비밀번호를 입력합니다.변수 콘텐츠가 올바르게 설정되었는지 확인합니다.
echo "${IGNORE_TABLES_ARGS}"
--ignore-table employees.current_dept_emp --ignore-table employees.dept_emp_latest_date
트리거와 뷰가 제외된
Employees
데이터베이스를 내보내 앞에서 만든 버킷의 Cloud Storage 객체로 직접 스트리밍합니다.mysqldump --user=root -p --default-character-set=utf8mb4 --add-drop-database --verbose \ --hex-blob --skip-triggers --set-gtid-purged=OFF \ $IGNORE_TABLES_ARGS \ --databases employees |\ gcloud storage cp - "gs://$(gcloud config get-value project)-bucket/employees-cloudsql-import.sql"
메시지가 표시되면
mysql-prod
데이터베이스 서버의 루트 비밀번호를 입력합니다.
객체 권한 업데이트
Cloud SQL 서비스 계정에서 읽을 수 있도록 Cloud Storage 버킷과 내보내기 객체 모두에 올바른 권한을 설정해야 합니다.
이러한 권한은 Google Cloud Console을 사용하여 객체를 가져올 때 자동으로 설정되거나 gcloud
명령어를 사용하여 설정할 수 있습니다.
Cloud Shell을 엽니다.
Cloud SQL 인스턴스의 서비스 계정 주소가 포함된 환경 변수를 설정합니다.
CLOUDSQL_SA="$(gcloud sql instances describe mysql-cloudsql --format='get(serviceAccountEmailAddress)')"
서비스 계정을 버킷 IAM 정책에 리더 및 작성자로 추가합니다.
gcloud storage buckets add-iam-policy-binding "gs://$(gcloud config get-value project)-bucket/" \ --member=user:"${CLOUDSQL_SA}" --role=roles/storage.objectUser
내보낸 데이터베이스 가져오기
Cloud Shell을 엽니다.
내보낸 파일을 Cloud SQL 인스턴스로 가져옵니다.
gcloud sql import sql mysql-cloudsql \ "gs://$(gcloud config get-value project)-bucket/employees-cloudsql-import.sql"
메시지가 표시되면
y
를 입력합니다.클론된 데이터베이스가 작동하는지 확인하려면
employees
테이블의 행 수를 계산하는 쿼리를 실행하면 됩니다.echo "select count(*) from employees.employees;" |\ gcloud sql connect mysql-cloudsql --user=root
메시지가 표시되면
mysql-cloudsql
데이터베이스 서버의 루트 비밀번호를 입력합니다.출력은 다음과 같습니다.
Connecting to database with SQL user [root].Enter password: count(*) 300024
행 수는
mysql-prod
인스턴스와 동일합니다.
프로덕션 시스템 관련 추가 정보
디스크 스냅샷 사용
디스크 스냅샷과 같은 물리적 백업의 경우 MySQL 문서에 따라 스냅샷을 생성하기 전에 데이터베이스에 대한 쓰기를 일시 중지하는 것이 좋습니다. 이때 FLUSH TABLES WITH READ LOCK
명령어를 사용하면 됩니다. 스냅샷이 생성된 후 UNLOCK TABLES
를 사용하여 쓰기를 다시 시작할 수 있습니다.
InnoDB 테이블을 사용하는 데이터베이스의 경우 FLUSH TABLES WITH READ LOCK
명령어를 실행하기 전에 먼저 스냅샷을 직접 생성하는 것이 좋습니다. 이렇게 하면 데이터베이스가 부정적인 영향을 거의 받지 않고 계속 실행되지만 스냅샷이 부적절한 상태가 될 수 있습니다. 그러나 이 경우 InnoDB 엔진은 클론이 시작될 때 테이블을 일관된 상태로 다시 빌드할 수 있습니다.
MyISAM 테이블을 사용하는 데이터베이스의 경우 FLUSH TABLES WITH READ LOCK
명령어를 실행하면 테이블에 대한 모든 쓰기가 차단되며 UNLOCK TABLES
명령어를 실행할 때까지 데이터베이스가 읽기 전용으로 설정됩니다.
테이블을 먼저 삭제하고 잠그지 않은 상태에서 스냅샷을 생성하면 새로 클론된 데이터베이스에 일관되지 않은 데이터가 포함되거나 손상될 수 있습니다.
따라서 MyISAM 테이블을 사용하여 데이터베이스에서 일관된 스냅샷을 가져오려면 기본(마스터) 데이터베이스의 성능에 영향을 주지 않도록 하기 위해 읽기 복제본에서 FLUSH TABLES WITH READ LOCK
을 실행하고 해당 복제본으로 스냅샷을 생성하는 것이 좋습니다.
mysqldump 명령어 사용
소스 데이터베이스와 일치하는 내보내기 파일을 만들려면 내보내기 작업 중에 mysqldump
명령어를 사용하여 모든 테이블을 잠가야 합니다. 즉, 데이터베이스를 내보내는 동안 데이터베이스에 대한 쓰기가 차단됩니다.
따라서 기본 데이터베이스가 차단되지 않도록 기본 데이터베이스의 읽기 복제본에 대해 mysqldump
명령어를 실행하는 것이 좋습니다.
삭제
이 튜토리얼에서 사용한 리소스 비용이 Google Cloud 계정에 청구되지 않도록 하려면 이 튜토리얼에서 만든 Google Cloud 프로젝트를 삭제하면 됩니다.
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
다음 단계
Cloud Monitoring에서 MySQL의 느린 쿼리를 모니터링하는 방법 알아보기
Google Cloud에 대한 참조 아키텍처, 다이어그램, 권장사항을 살펴보세요. Cloud 아키텍처 센터를 살펴보세요.