바로 이동

MySQL용 Cloud SQL로 마이그레이션 권장사항

마이그레이션할 데이터베이스의 복잡성, 마이그레이션해야 하는 데이터 양, 허용할 수 있는 다운타임 수준 등 MySQL에서 MySQL용 Cloud SQL로의 데이터베이스 마이그레이션을 계획하고 실행할 때 고려해야 할 사항이 많습니다. 이러한 고려사항 중 하나는 MySQL 데이터베이스의 소스 인스턴스입니다. MySQL의 소스 인스턴스는 다음 중 한 가지 방법으로 호스팅할 수 있습니다.

  • AWS 또는 Azure와 같은 다른 클라우드 제공업체에서 호스팅되는 MySQL 인스턴스
  • 자체 데이터 센터 또는 사무실의 서버에서 호스팅되는 MySQL 인스턴스(온프레미스라고도 함)

이 도움말은 두 시나리오에 모두에 적용됩니다.

개요

데이터베이스 마이그레이션에는 두 가지 기본 유형이 있습니다. MySQL을 실행하는 소스 인스턴스 또는 프런트엔드와 같은 MySQL이 포함된 데이터베이스(예: MySQL용 AWS Aurora)에서 클라우드의 MySQL 또는 MySQL용 Cloud SQL로 마이그레이션하는 것은 동종 마이그레이션으로 간주됩니다. 소스 인스턴스가 PostgreSQL, SQL Server, Oracle 또는 대상이 아닌 기타 모든 데이터베이스와 같이 서로 다른 데이터베이스를 실행 중인 경우 이기종 마이그레이션이라고 합니다.

이 도움말에서는 일반적으로 MySQL용 Cloud SQL을 사용하는 경우인 동종 마이그레이션에 중점을 둡니다. 특히 이 도움말에서는 MySQL용 Cloud SQL로 마이그레이션하는 방법, 스토리지 엔진 고려사항, 사용자 권한, MySQL 플래그에 대해 설명합니다. 하지만 많은 도움말과 권장사항은 이기종 마이그레이션에도 적용될 수 있습니다.

MySQL용 Cloud SQL로 마이그레이션하는 방법

Cloud SQL에서 MySQL로 마이그레이션하는 방법에는 여러 가지가 있습니다. 특정 소스의 마이그레이션 전략은 데이터베이스 크기, 예상 다운타임, 마이그레이션을 수행하는 엔지니어의 경험 등 여러 요소에 따라 달라집니다. 가장 일반적인 마이그레이션 전략을 살펴보겠습니다.

Cloud Storage 가져오기

크기가 몇 기가바이트에 불과하거나 정적 데이터가 포함된 소규모 데이터베이스를 마이그레이션하는 경우 가장 쉬운 방법은 mysqldump 유틸리티를 통해 데이터베이스의 덤프를 가져오는 것입니다. SQL 덤프 파일을 사용하여 내보내기 및 가져오기 도움말의 안내에 따라 덤프 파일을 Cloud Storage에 업로드하고 Cloud SQL 인스턴스로 가져옵니다.

덤프 파일에는 논리적 SQL 문이 포함되므로 이 방법의 한 가지 이점은 덤프 파일을 Cloud Storage에 로드하기 전에 수정할 수 있다는 것입니다. 하지만 특정 Cloud SQL 제한사항에 따라 데이터 가져오기 및 내보내기 권장사항에 나열된 대로 가져오기를 중단할 수 있는 항목을 덤프 파일에 포함하지 않아야 합니다.

Database Migration Service(DMS)

많은 MySQL 인스턴스를 마이그레이션하거나 대규모 마이그레이션을 수행할 때는 Database Migration Service(DMS)를 사용하는 것이 더 낫습니다. 이는 MySQL로의 동종 및 이기종 마이그레이션 경로를 포함한 다양한 마이그레이션 경로를 제공하고 마이그레이션 대상으로 SQL Server와 PostgreSQL을 지원하는 서비스입니다.

대부분의 중간 규모 및 대규모 데이터베이스 마이그레이션에는 DMS를 사용하는 것으로 충분합니다. DMS가 적절하지 않을 수 있는 상황으로는 데이터베이스가 매우 큰 경우(예: 몇 TB)와 복제 노하우가 있는 MySQL 엔지니어가 기본 MySQL 복제를 사용하는 마이그레이션 프로세스를 보다 세밀하게 제어하는 것을 선호하는 경우가 있습니다.

외부 소스 복제

마이그레이션 중에 다운타임을 최소화하는 것이 우선 과제이고 팀에 숙련된 MySQL 엔지니어가 있는 경우 기본 바이너리 로그 기반 복제를 사용하여 외부 소스(ES)에서 복제할 수 있는 옵션이 있습니다. 이 방법에서는 Cloud Storage 가져오기와 같은 방법을 사용하여 데이터베이스의 기준 스냅샷을 가져옵니다.

그런 다음 Cloud SQL 인스턴스에서 이미 사용 가능한 미리 만든 저장 프로시저를 사용하여 소스 인스턴스에서 대상 Cloud SQL 인스턴스로 MySQL 복제를 구성합니다. 자세한 안내는 커스텀 가져오기를 사용하여 대규모 외부 데이터베이스에서 복제 설정 도움말에서 확인할 수 있습니다.

마이그레이션에 바이너리 로그 기반 복제를 사용할 때의 한 가지 주요 세부정보는 더 이상 대상 Cloud SQL 인스턴스에 필요하지 않을 때까지 소스 인스턴스의 바이너리 로그를 계속 사용할 수 있다는 것입니다. MySQL 온프레미스 또는 자체 관리형을 실행하는 경우 바이너리 로그 삭제를 제어하도록 expire_logs_days 같은 매개변수를 구성할 수 있습니다. 하지만 다른 클라우드 공급업체 관리형 서비스에는 바이너리 로그 보관에 대한 자체 제한사항이 있습니다.

예를 들어 Amazon Relational Database Service(RDS)를 사용하면 저장 프로시저 이름 mysql.rds_set_configuration을 통해 바이너리 로그 보관을 구성할 수 있습니다. 이렇게 하면 최대 7일 동안 보관할 수 있습니다. 대부분의 경우 RDS에서 Cloud SQL로의 중소 규모 마이그레이션에는 7일이면 충분합니다. 이러한 경우 사용자는 관리형 RDS 복제본을 만드는 과정이 잘 문서화된 프로세스를 활용할 수 있습니다. 그런 다음 복제본을 쓰기 가능하게 만들거나, 행을 삭제하거나, 바이너리 로그로 들어가서 복제를 중단시키는 일종의 '독약' 트랜잭션을 삽입하는 등 복제를 '중단'하기 위한 작업을 수행합니다. RDS 자동화에서는 복제본이 계속 필요한 경우 바이너리 로그를 삭제하지 않습니다(단, RDS가 손상된 복제 스트림을 '종료'하기 전 전체 한도는 30일인 것으로 보임).

또 다른 해결 방법은 mysqlbinlog 클라이언트를 사용하여 바이너리 로그를 다른 중개 MySQL 인스턴스에 다운로드하여 바이너리 로그가 조기에 삭제되지 않도록 하는 것입니다. 예를 들어 RDS에는 바이너리 로그가 다운로드할 수 있도록 충분히 호스트에 남아 있도록 보관 기간을 시간 단위로 설정할 수 있는 mysql.rds_set_configuration이라는 저장 프로시저가 있습니다. 이 경우 MySQL 인스턴스처럼 보이는 'Binlog Server'와 같은 서버가 바이너리 로그를 저장 및 전달되기 때문에 MySQL 인스턴스를 중개자로 구현하지 않아도 됩니다.

스토리지 엔진 고려사항

MySQL은 여러 플러그인 가능한 스토리지 엔진을 지원한다는 점에서 가장 많이 사용되는 관계형 데이터베이스 시스템 중에서 고유합니다. 원래 MySQL은 MyISAM이라는 단일 스토리지 엔진을 지원했으며 MySQL 8.0까지는 대부분의 시스템 테이블에서 이 스토리지 엔진을 사용했습니다. 하지만 MyISAM은 트랜잭션을 지원하지 않았으며 갑작스러운 시스템 종료나 데이터베이스 비정상 종료 발생 시 비정상 종료로부터 안전하지 않았습니다.

그 이후로 InnoDB는 비정상 종료로부터 안전한 아키텍처와 트랜잭션 지원 기능으로 인해 사실상 대부분의 MySQL 사용자 테이블의 스토리지 엔진이 되었습니다. 여전히 MySQL 커뮤니티에는 온프레미스와 기타 클라우드 제공업체 모두에서 일반적으로 볼 수 있는 다른 스토리지 엔진이 있으며 다음과 같습니다.

  • ARCHIVE - 보관 목적으로 고도로 압축된 형식으로 데이터를 저장합니다.
  • CSV - 쉼표로 구분된 형식(CSV)으로 데이터를 저장하고 일반 및 느린 쿼리 로그의 테이블 로깅에 사용됩니다.
  • MEMORY - 메모리에 테이블을 저장합니다.

Cloud SQL의 경우 복제 및 PITR(point-in-time recovery)과 같은 부가 가치 기능을 지원하기 위해 비정상 종료로부터 안전한 트랜잭션 스토리지 엔진이 필요합니다. 따라서 Cloud SQL로 마이그레이션하는 모든 사용자 테이블은 InnoDB 스토리지 엔진을 사용하거나 마이그레이션 프로세스 중에 InnoDB로 전환해야 합니다.

이는 외부 소스에서 Cloud SQL로의 기본 MySQL 복제를 수행하는 경우에 특히 중요합니다. Cloud SQL에서는 사용자가 CREATE TABLE과 같은 데이터 정의 언어(DDL) 명령어를 통해 Cloud SQL 인스턴스에서 직접 MyISAM 테이블을 만들 수 없지만 현재 MyISAM 테이블은 외부 소스에서 Cloud SQL로 복제할 수 있습니다.

하지만 Cloud SQL에서 이러한 가져온 MyISAM 테이블은 나중에 복제, PITR(point-in-time recovery), 장애 조치와 같은 작업 중에 안정성 및 신뢰성 문제로 이어질 수 있습니다. 이러한 이유로 마이그레이션을 수행하기 전에 모든 MyISAM 사용자 테이블을 InnoDB로 전환하는 것이 좋습니다. 

다음 쿼리는 시스템 이외의 모든 MyISAM 테이블을 나열합니다.

시스템 이외의 모든 MyISAM 테이블을 쿼리하는 쿼리

사용자 권한

관리형 서비스인 Cloud SQL용 MySQL은 사용자 계정에 SUPER 권한을 허용하지 않습니다. 이는 이러한 권한을 가진 루트 사용자에 허용되는 대부분의 MySQL 온프레미스 설치와 다릅니다. 마찬가지로 다른 대부분의 클라우드 제공업체는 관리형 MySQL 환경에서 이 SUPER 권한을 제공하지 않습니다.

어떤 경우든 Cloud SQL 사용자는 FILESHUTDOWN과 함께 앞서 언급한 SUPER와 같이 Google에서 서비스를 관리하는 기능에 영향을 미치는 권한을 제외하고 MySQL에서 제공하는 대부분의 권한을 부여하는 ‘root’@’%’라는 기본 MySQL 사용자를 수신합니다. Cloud SQL에서 제공하는 사용 권한에 대한 자세한 내용은 MySQL 사용자에 관한 문서를 참조하세요.

마이그레이션을 준비할 때 소스 인스턴스의 모든 사용자 계정을 검토합니다. 예를 들어 각 사용자에 대해 SHOW GRANTS 명령어를 실행하여 현재 권한 집합을 검토하고 Cloud SQL에서 제한된 권한이 있는지 확인합니다. 마찬가지로 Percona의 pt-show-grants 도구도 권한을 나열할 수 있습니다.

Cloud SQL에서 사용자 권한에 대한 제한사항은 DEFINER 속성이 있는 데이터베이스 객체를 마이그레이션할 때 마이그레이션에 영향을 미칠 수 있습니다. 이는 저장 프로시저, 트리거, 사용자 정의 함수, 뷰에서 자주 발생합니다. 소스 인스턴스의 데이터베이스 객체에 대한 정의자가 Cloud SQL에서 지원되지 않는 권한을 가진 사용자인 경우 마이그레이션 도중 또는 마이그레이션 후에 문제가 발생할 수 있습니다.

예를 들어 저장 프로시저에는 Cloud SQL에서 허용되지 않는 전역 변수를 변경하는 등 SQL 명령어를 실행하기 위한 최고 권한이 있는 정의자가 있을 수 있습니다. 이러한 경우 저장 프로시저 코드를 다시 작성하거나 저장 프로시저와 같은 테이블이 아닌 객체를 별도의 마이그레이션 단계로 마이그레이션해야 할 수 있습니다.

이 문서에는 데이터베이스 객체의 정의자 절과 관련된 다른 문제에 대해 자세히 설명하는 DEFINER 절이 있는 메타데이터가 포함된 MySQL 가져오기 및 마이그레이션 작업 섹션이 있습니다.

플래그

앞서 언급한 사용자 권한 제한사항으로 인해 사용자는 기본적으로 SET GLOBAL 명령어를 호출하여 데이터베이스 매개변수를 변경할 수 없습니다. 대신 Cloud SQL은 UI 콘솔, GCloud CLI, REST API를 통해 수정할 수 있는 사전 정의된 '플래그' 집합을 제공하여 매개변수를 수정합니다.

지원되는 MySQL용 Cloud SQL 플래그의 전체 목록은 지원되는 플래그 섹션의 공개 문서에서 확인할 수 있습니다. Cloud SQL로 마이그레이션하기 전에 지원되는 플래그 목록과 현재 원본 환경에서 사용되는 플래그를 비교하여 검토합니다. 예를 들어 한 가지 권장사항은 소스 인스턴스와 유사한 CPU 및 메모리 설정으로 테스트 Cloud SQL 인스턴스를 만들고 소스 인스턴스와 Cloud SQL 인스턴스 모두에서 SHOW GLOBAL VARIABLES를 실행하여 차이점을 비교하는 것입니다.

온프레미스 또는 클라우드 제공업체에서 MySQL용 Cloud SQL과 다른 설정을 사용할 수 있는 일반적인 플래그는 다음과 같습니다.

  • 문자 집합 및 콜레이션 설정(예: character_set_servercollation_server). 기본값은 설치마다 다를 수 있으며 스토리지 및 성능 차이로 이어질 수 있습니다. 예를 들어 latin1과 utf8을 비교할 수 있습니다.
  • 바이너리 로그 설정(예: binlog_format). Cloud SQL은 현재 바이너리 로그에서 행 기반 로깅만 지원합니다.
  • 고급 복제 설정. 예를 들어 Cloud SQL은 복제 필터 매개변수(예: replicate-do-tablereplicate-do-db)를 지원하지 않습니다.
  • 고급 InnoDB 설정. Cloud SQL을 사용하면 innodb_buffer_pool_size를 변경하여 InnoDB 버퍼 풀 크기 조정과 같은 대부분의 InnoDB 관련 매개변수를 수정할 수 있습니다. 그러나 Cloud SQL에서 수정할 수 없거나 온프레미스 또는 다른 클라우드 제공업체와 기본값이 다른 세분화된 InnoDB 설정이 있을 수 있습니다.

Google Cloud는 온프레미스 데이터 센터 사용 중지부터 SaaS 애플리케이션 실행, 핵심 비즈니스 시스템 마이그레이션에 이르기까지 비즈니스 니즈에 맞게 설계된 관리형 MySQL 데이터베이스를 제공합니다.