Skip to the content.

mysql shell dump

사전 준비

MySQL Shell 설치가 필요


동작 순서

  1. 바이너리 로그 포지션 기억
     FLUSHNO_WRITE_TO_BINLOG TABLES
     FLUSH TABLES WITHREAD LOCK
     SET SESSIONTRANSACTION ISOLATION LEVEL REPEATABLE READ
     START TRANSACTIONWITH CONSISTENT SNAPSHOT
    
     SELECT @@GLOBALGTID_EXECUTED
    
     SHOW MASTER STATUS
    
     LOCK INSTANCE FORBACKUP
     UNLOCK TABLES
    
  2. 오브젝트 DDL 생성
  3. 스레드 수 만큼 Dump 작업


덤프 파일 구조

|파일|설명| |-|-| |@.json|백업 시작 정보 (백업 대상, 사용한 옵션, 바이너리 로그 포지션 등)| |schema_name.json|헤당 스키마에 대한 오브젝트 정보| |schema_name@table_name.json|해당 테이블의 정보| |*.sql|해당 오브젝트의 DDL 정보| |schema_name@table_name.tsv.*|해당 테이블의 데이터 정보| |schema_name@table_name.tsv.*.idx|해당 테이블의 인덱스 정보| |@.done.json|백업 완료 정보 (백업 대상 크기, 테이블 chunk 개수, 크기 등)|


백업 기본 형식

# Shell 접속할 경우
# 인스턴스 단위
util.dumpInstance("/directory_name", {option_name1:value, option_name2:value, ... })

# 스키마 단위
util.dumpSchemas("schema_name", "/directory_name", {option_name1:value, option_name2:value, ... })

# 테이블 단위
util.dumpTables("schema_name", ["table_name1", "table_name2", ... ], "/directory_name", {option_name1:value, option_name2:value, ... })


# Shell 접속하지 않을 경우 -e 옵션으로 명령어 지정
mysqlsh root@localhost -e \
'util.dumpInstance("/directory_name", {option_name1:value, option_name2:value, ... })'


복원 기본 형식

# Shell 접속 후
util.loadDump("/directory_name", {option_name1:value, option_name2:value, ... })


속도 개선

  1. 복원 시에 skipBinlog, thread 옵션 지정

  2. redo_log를 비활성화해서 Load 속도를 개선할 수 있음 (단, 8.0.21 이상이여야 함)

     # 비활성화
     ALTER INSTANCE DISABLE INNODB REDO_LOG;
    
     # 확인
     SHOW GLOBAL STATUS LIKE 'innodb_redo_log_enabled';
     /*
     +-------------------------+-------+
     | Variable_name           | Value |
     +-------------------------+-------+
     | Innodb_redo_log_enabled | OFF   |
     +-------------------------+-------+
     */
    
     # 활성화
     ALTER INSTANCE ENABLE INNODB REDO_LOG;
    
     # 확인
     SHOW GLOBAL STATUS LIKE 'innodb_redo_log_enabled';
     /*
     +-------------------------+-------+
     | Variable_name           | Value |
     +-------------------------+-------+
     | Innodb_redo_log_enabled | ON    |
     +-------------------------+-------+
     */
    


주의점

  1. PK가 없다면 chunk 단위로 병렬 백업, 복원이 불가능함 (하나의 파일로 작업)
  2. 압축 시 CPU 사용율이 높으므로 Thread 지정이나 작업할 시간대를 확인해야 함
  3. 복원을 하기 위해선 local_infile 파라미터가 ON 으로 되어있어야 함
  4. mysqldump와는 상호 호환되지 않음


백업 옵션 설명

|OPTION|DESCRIPTION| |-|-| |threads|지정한 스레드 수 만큼 병렬로 작업| |compression|zstd : zstd 방식으로 압축 (기본 값)
gzip : gzip 방식으로 압축| |dryRun|true : 실행 전 호환성 체크를 함 (Dump가 실행되지는 않음)
false : 실행 전 호환성 체크를 하지 않음 (Dump가 실행되지는 않음) (기본 값)| |showProgress|true : Dump 실행 시 진행 정보 출력 (기본 값)
false : 진행 정보 출력 하지 않음| |maxRate |읽기 처리량에 대해 스레드 당 바이트 크기를 지정 (초단위)| |defaultCharacterSet|세션에서 사용할 문자 집합 (기본 값 : utf8mb4)| |consistent|true : 일관성 Dump를 수행함 (기본 값)
false : 일관성 Dump를 수행 하지 않음|


|AWS S3 관련 옵션|설명| |-|-| |s3BucketName|S3 버킷 지정| |s3CredentialsFile|S3 Credentials 파일 지정 (파일 디렉토리와 이름이 기본값이라면 불필요)| |s3ConfigFile|S3 Config 파일 지정 (파일 디렉토리와 이름이 기본값이라면 불필요)| |s3Profile|S3 Profile 지정| |s3Region|S3 Region 지정 (Config 파일에 설정되어 있다면 불필요)| |s3EndpointOverride||

AWS CLI를 설치, 설정해야 하고 해당 계정에 대해 S3 권한이 있어야 함

mysqlsh root@localhost -e 'util.dumpInstance("Folder Name",{s3bucketName: "Bucket Name"})'


복원 옵션 설명

|OPTION|DESCRIPTION| |-|-| |threads|지정한 스레드 수 만큼 병렬로 작업| |skipBinlog|true : Load할 때 바이너리 로그를 비활성화
false : Load할 때 바이너리 로그를 활성화| |ignoreExistingObjects|true : 테이블이 존재할 경우 무시하고 데이터를 Load
false : 테이블이 존재할 경우 에러 표시 (기본 값)| |ignoreVersion |true : Dump한 데이터베이스 버전과 Load할 데이터베이스 버전이 달라도 진행
false : 데이터베이스 버전이 다르다면 에러 표시| |resetProgress|true : 중단 후 다시 시작할 때 이어서 진행함
false : 중단 후 다시 시작할 때 처음부터 진행함|


참고