MySQL Shell - Dump Utility - mysqlsh

Last Updated on 3월 11, 2021 by 태랑(정현호)



1. MySQL Shell

MySQL Shell은 MySQL 용 고급 클라이언트 및 코드 편집기입니다 mysql 클라이언트 와 유사한 SQL 기능 외에도 MySQL Shell은 JavaScript 및 Python에 대한 스크립팅 기능을 제공하고 MySQL 작업을 위한 API를 포함합니다
MySQL Shell의 여러 기능 중에 dump utility 에 대해서 확인 해보려고 합니다.

[참고] MySQL Shell은 MySQL Server 8.0,5.7 에서 사용이 가능 합니다.
MySQL Shell 8.0 is highly recommended for use with MySQL Server 8.0 and 5.7



2. dump utility

dump utility 가 mysqldump 와의 차이 몇가지를 확인 해 본다면

dump utility 는

• 멀티 스레드(multi-thread) 로 동작이 가능
• 기능 내 기본 기능으로 압축을 지원하며 기본값이 압축을 함(알고리즘 zstd)
• Oracle Cloud 내 이전을 고려한 Oracle Cloud의 object storage 와 연결하여 사용 가능
• Oracle MySQL Database Service(MDS) 로의 이관(이전) 을 대비한 MDS 호환성 기능 지원


이와 같은 차이(장점)이 있으며 대표적으로 멀티 스레드로 동작할 수 있기 때문에 기존의 mysqldump에 비해 빠르다는게 특징 입니다.


성능에 대해서는 4개의 도구(mysqldump, mysqlpump, mydumper, MySQL Shell)를  Benchmarks 한 자료를 참조해보시면 좋을것 같습니다

Ref. mysqlserverteam.com/mysql-shell-dump-load-part-2-benchmarks


[Data Dump]






[Data Load]





3. mysql shell 설치

설치는 각 배포판 별로 아래와 같이 설치를 진행하시면 됩니다.

• 우분투

user# wget https://dev.mysql.com/get/mysql-apt-config_0.8.16-1_all.deb

user# sudo dpkg -i mysql-apt-config_0.8.16-1_all.deb

user# sudo apt update
user# sudo apt -y install mysql-shell 


• RHEL/CentOS 7 기준

user# sudo yum install -y https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm

user# sudo yum install -y mysql-shell




4. dump


4-1 3가지 유형을 지원

dump 유틸리티는 3가지의 타입을 제공하고 있습니다.

- util.dumpInstance(outputUrl[, options])
- util.dumpSchemas(schemas, outputUrl[, options])
- util.dumpTables(schema, tables, outputUrl[, options])

util.dumpInstance 는 MySQL 데이터베이스 전체 단위로 data dump 를 수행하며, util.dumpSchemas 는 논리 스키마(database, schema) 단위로 data dump 를 수행하고 util.dumpTables는 테이블 별 data dump 를 하게 됩니다.


4-2 수행 방식
 
mysql shell 은 대부분의 명령어가 수행 할 수 있는 방법이 2가지를 지원 합니다.

1) OS의 쉘 형에서 바로 수행
[root]# mysqlsh root@localhost -e '명령어'

2) mysqlsh 내에서 수행
[root]# mysqlsh root@localhost
 JS > util.dumpInstance…



4-3 Dump 수행 

4-3-1 dumpInstance

먼저 3가지 명령어 모두 중간에 대문자가 포함되어 있으며 대소문자를 구분함으로 중간의 대문자는 대문자로 입력 해야 합니다.

dumpInstance / dumpSchemas  /  dumpTables

먼저 백업 받을 디렉토리를 생성 후 덤프를 진행 하도록 하겠습니다. 덤프를 받을 디렉토리에 다른 파일이 있다면 아래 처럼 에러가 발생 합니다.

Util.dumpInstance: Cannot proceed with the dump, the specified directory … already exists at the target location … and is not empty.


[중요] 아래에서 나오는 dump utility 는 한줄로 입력 해야 합니다. 가로 길이의 제약에 따라서 개행이 되어있으나 실제 입력시 한줄로 입력해야 합니다.


• OS 에서 바로 수행

[root]# rm -rf /root/backup/inst_dump
[root]# mkdir -p /root/backup/inst_dump

[root]# mysqlsh root@localhost -e 'util.dumpInstance("/root/backup/inst_dump",{ocimds: true,
 threads: 8, showProgress: true, compatibility: 
 ["force_innodb", "strip_definers","strip_restricted_grants", "strip_tablespaces"]})'

# 가로 길이에 따라서 개행을 하였지만, 실제 수행시 한줄로 입력 해야 합니다



•mysqlsh 내에서 실행

[root]# mysqlsh root@localhost
MySQL Shell 8.0.23

Copyright (c) 2016, 2021, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its affiliates.
Other names may be trademarks of their respective owners.

Type '\help' or '\?' for help; '\quit' to exit.
Creating a session to 'root@localhost'
Fetching schema names for autocompletion... Press ^C to stop.
Your MySQL connection id is 21 (X protocol)
Server version: 8.0.23 MySQL Community Server - GPL
No default schema selected; type \use <schema> to set one.

 JS > util.dumpInstance("/root/backup/inst_dump",{ocimds: true, threads: 8, 
 showProgress: true, compatibility: ["force_innodb", 
 "strip_definers", "strip_restricted_grants", "strip_tablespaces"]})
# 가로 길이에 따라서 개행을 하였지만, 실제 수행시 한줄로 입력 해야 합니다



4-3-2 dumpSchemas

• OS 에서 바로 수행

[root]# mkdir -p /root/backup/schema_dump/fedoralinux_wp

[root]# mysqlsh root@localhost -e 'util.dumpSchemas(["employee"],
"/root/backup/schema_dump/employee",{threads:8})'

# 가로 길이에 따라서 개행을 하였지만, 실제 수행시 한줄로 입력 해야 합니다


•mysqlsh 내에서 실행

 JS > util.dumpSchemas(["employee"],
"/root/backup/schema_dump/employee",{threads:8})

# 가로 길이에 따라서 개행을 하였지만, 실제 수행시 한줄로 입력 해야 합니다



4-3-3 dumpTables

• OS 에서 바로 수행

[root]# mkdir -p /root/backup/table_dump/employee_tables
[root]# mysqlsh root@localhost -e 'util.dumpTables("employee", [ "emp", "dept" ],
 "/root/backup/table_dump/employee_tables",{threads:8})'


•mysqlsh 내에서 실행

JS > util.dumpTables("employee", [ "emp", "dept" ],
"/root/backup/table_dump/employee_tables",{threads:8})





5. load

Dump 된 파일을 통해 load 는 명령어는 동일합니다. dump 을 받은 디렉토리를 지정하면 디렉토리내에 존재하는 파일을 모두 load 하게 됩니다.

load 하기전에 먼저 local_infile=ON 로 설정을 해야 합니다.

mysql> set global local_infile=ON;


# OS 에서 직접 실행
mysqlsh root@localhost -e 'util.loadDump("/root/backup/inst_dump", {threads: 8,ignoreExistingObjects:true,resetProgress:true})'

or

# mysqlsh 에서 실행
util.loadDump("/root/backup/inst_dump", {threads: 8,ignoreExistingObjects:true,resetProgress:true})


위와 같이 실행하면 되며

- ignoreExistingObjects:true 옵션은 테이블이 존재시 무시하고 데이터를 load 를 하라는 옵션 입니다. default 는 false 로 테이블이 존재시 에러가 발생하고 진행 되지 않습니다

- resetProgress:true 는 아래 와 같이 메세지가 보일 경우 다시 처음 부터 진행 하는 옵션 입니다.
NOTE: Load progress file detected. Load will be resumed from where it was left, assuming no external updates were made.
You may enable the 'resetProgress' option to discard progress for this MySQL instance and force it to be completely reloaded


MySQL Shell 은 다양한 기능을 제공을 하고 있고 이전 MySQL 8.0 업그레이드 포스팅에서는 util.checkForServerUpgrade 를 사용하여 업그레이드 사전체크를 수행 하였습니다.

dump utility 는 기존의 유틸리티에 비해 빠르며 압축이 기본 제공되는 장점을 가지고 있으며 Oracle  Cloud 로의 Migration 시 부가적인 기능 도 같이 지원 됨으로 앞으로 더 많이 사용 될 것 같습니다.


Ref link.
dev.mysql.com/doc/mysql-shell [Link]
dev.mysql.com/doc/mysql-shell/dump-instance-schema [Link]
dev.mysql.com/mysql-shell-utilities-load-dump [Link]
mysqlserverteam.com/mysql-shell-dump-part-1-demo [Link]
mysqlserverteam.com/mysql-shell-dump-part-2-benchmarks [Link]



관련된 다른 글

 

답글 남기기