Mysql 5.7에서 새롭게 추가된 백업 명령어인 mysqlpump는 mysqldump에는 없는 몇 가지 특징을 가지고 있다.
둘은 철자도 아주 비슷하고 백업에 사용한다는 용도 면에서는 아주 비슷하다.
mysqlpump의 특징으로는 다음과 같은 것들이 언급된다.
1) 병렬덤프
2) 테이블, 뷰, 스토어드 프로그램을 개별로 필터링
3) 데이터의 복원과 인덱스 작성을 동시에 하지 않고, 테이터를 복원한 이후부터 실행
4) 사용자 계정의 정보를 권한 테이블에서가 아닌 CREATE USER와 GRANT 명령어로 출력
5) 출력의 압축
6) 백업의 진척 보고
--> 오라클의 imp/exp 가 impdb/expdb 처럼 병렬처리로 빠르게 import/export할 수 있는 mysql dump tool 이 나온 듯하다.
Mysql 5.7 배포당시의 mysqlpump에는 병렬백업 MVCC에 의한 데이터의 동기화가 되지 않는다는 치명적인 결점이 있었다. 그 때문에 병렬 덤프를 실행하려면 변경 작업을 멈춰야 했으므로 mysqldump의 대체품으로 사용할 수 없었다.
이런 제한은 Mysql 5.7.11에서 해제되어, 서버 변경 중에 병렬 덤프를 실행해도 정합성이 있는 백업을 할 수 있게 되었다. InnoDB를 일관되게 백업하려면 mysqldump와 마찬가지로 --single-transaction 옵션을 지정해야한다.
--single-transaction 옵션에서는 InnoDB 이외의 테이블 데이터는 일관성을 보증할 수 없다는 점도 마찬가지다.
mysqlpump는 옵션 등에 차이가 있긴 하지만, mysqldump와 같은 방식으로 사용할 수 있다. 아래표)는 전형적인 mysqlpump의 백업과 복원 명령어이다.
mysql CLI를 사용해 복원한다는 점도 동일하다. mysqlpump는 내부적으로 병렬덤프를 하지만 출력은 하나뿐이다. 기본적으로 표준 출력이 덤프의 출력처가 된다. 그 때문에 복원은 mysqldump와 마찬가니로 출력된 덤프파일을
mysql CLI를 사용해 실행하게 되어있다. 덧붙여서, --user는 사용자 계정을 백업하기 위한 옵션이다. 이 옵션을 설정하지 않으면 사용자 계정은 백업되지 않으므로 주의하기 바란다.
shell> mysqlpump --single-transaction --users > dump.sql
shell> mysql < dump.sql
mysqlpump는 기본적으로 전체의 데이터베이스를 백업한다. 명시적으로 --all-databases 옵션을 지정하는 것도 가능하지만 쓸 필요는 없다. 데이터베이스를 개별로 지정하려면 mysqldump와 마찬가지로 옵션이 아닌 인수로 데이터베이스
이름을 직접 지정하든가, --databases 옵션을 사용하든가, 또는 mysqlpump에서만 사용이 가능한 --include-databses, --exclude-databases 옵션을 사용하면 된다.
이들 두개의 옵션에서는 콤마를 구분하여 데이터베이스명을 지정하는 것 외에 와일드카드로 이용이 가능하다. 데이터베이스의 지정 방법을 표 9.5에 정리해 두었다.
단, --all-databases를 지정한 경우에는 정보 스키마, 성능스키마, sys스키마, ndbinfo와 mysql 데이터베이스에 있는 권한 테이블은 백업되지 않으므로 주의하기 바란다.
1) 전체데이터베이스를 백업 mysqlpump --all-databases
mysqlpump (옵션없음)
2) 백업 대상 데이터베이스를 직접지정 mysqlpump --databases=db1,db2,db3
3) 와일드카드로 백업할 데이터베이스명을 지정 mysqlpump --exclude-databases=test%
4) 어떤 데이터베이스 안의 특정 테이블만 백업 mysqlpump db1 table1 table2 table3
병렬 덤프에 대해서는 조금 자세한 설명이 필요하다. mysqlpump에는 Mysql 서버에서 데이터를 수집하기 위해 여러 개 스레드를 생성한다. 각각의 스레드가 Mysql 서버로 접속을 일으켜, 데이터를 하나로 합치기 위해 큐로 삽입된다.
큐는 기본적으로 하나뿐이다. 또한 큐별 기본스레드 수는 2이다.
큐를 증가시키려면 --parallel-schemas 옵션을 사용한다.이 옵션의 서식은 리스트 9.3과 같다. 이 옵션은 여러 번 지정하는 것이 가능해서, 옵션을 지정할 떄마다 큐가 하나씩 늘어난다. N은 큐에 소속하는 스레드 수로, 정수로 지정한다.
각각의 스레드는 대상 Mysql 서버에 개별로 접속한다. 스레드가 지나치게 많아지면 서버가 수용할 수 있는 접속 수를 소비해 버리므로 주의해야 한다. 스레드 수에 이어, 이 큐에 의해 처리해야 하는 데이터베이스를 지정한다. 데이터 베이스를 여러 개 지정하는 경우에는 콤마로 구분하여 지정한다. --parallel-schemas 옵션을 지정해도, 기본큐는 반드시 작성된다. --parallel-schemas 옵션으로 지정되지 않은 데이터베이스는 기본 큐로 처리된다.
--parallel-schemas=[N:]데이터베이스명,[, 데이터베이스명..]
아래는 --parallel-schemas로 큐를 2개 추가하는 예이다. 기본 큐와 합쳐 총 3개의 큐가 작성되었다. 기본 큐와 --parallel-schemas 옵션으로 스레드 수를 지정하지 않는 큐에는 --default-parallelism 옵션으로
지정된 수의 스레드가 작성된다. 이 옵션의 기본값은 2이다. 리스트 9.4의 예에서는 기본 큐와 첫번째의 큐에 각각 3개의 스레드가, 그리고 두번째의 큐에 5개의 스레드가 생성된다. 이 예에는 합계 11개의 스레드, 다시말해서 11개의 접속에 의해 백업이 처리된다.
shell> mysqlpump --default-parallelism=3 \
--parallel-schemas=db1,db2 \
--parallel-schemas=5:db3,db4,db5
--> default-parallelism : 기본적으로 할당할 스레드 개수
parallel-schemas : 큐할당 파라미터, 굳이 선언하지 않아도 기본으로 큐는 1개할당되고, 이 명령어를 사용시 추가로 큐를 열어 처리한다. default-parallelism이 3이니까 하나의 큐에 기본적으로 3개의 스레드는 할당하고 parallel-schemas=5로 쓰게되면 스레드를 5개까지 늘려처리한다.
다만 아래에서 보는 것처럼 여러스레드가 하나의 테이블을 백업하는 방식은 아니고 1 thread에 1 table 처리 방식이다.
보통 parallel 은 하나의 파일을 다중 processing 하는 것인데 이것은 그에 미치지 못한다. 예를 들어 1 table이 대용량이라도 1 thread에서만 백업처리되서 오라클의 imp가 impdp 로 개선되면서 10배이상의 성능향상을 보인것 만큼이나 그렇게 크게 효과가 있을 거 같진 않다.
병렬 덤프에는 한가지 큰 제약이 있다. 하나의 테이블을 여러 개의 스레드로 덤프할 수 없다는 것이다. 다시 말해 테이블 수가 스레드 수보다 적으면 스레드가 남아있어도 활용할 수가 없다. 리스트 9.4의 명령어에 의해 병렬 덤프를 나타낸 것이 아래 그림이다. db2와 db3에는 테이블이 2개밖에 없고, 그 외의 데이터베이스에는 4개 이상의 테이블이 있다고 판정한다.
이처럼 mysqlpump에서는 정의된 스레드가 모두 동시에 실행된다. 큐와 스레드의 수를 잘 정리하고 동시 실행 스레드 수가 너무 많아지지 않게 하자.
#Test
mysqlpump -uroot -p패스워드 --include-databases=TESTDB --include-tables=TB_TEST_CUST,TB_TEST_USER,TB_TEST_COM_MST,TB_TEST_COM_DTL \
--default-parallelism=4 > 12_TEST_TABLES.sql
mysqlpump: [Warning] Using a password on the command line interface can be insecure.
Dump progress: 0/4 tables, 250/319596 rows
Dump progress: 2/4 tables, 83233/319596 rows
Dump progress: 2/4 tables, 176483/319596 rows
Dump progress: 2/4 tables, 267983/319596 rows
Dump completed in 9889 milliseconds
// default-parallelism=4 -->큐 1개에 스레드 4개를 열고 병렬로 덤프를 뜨겠다.
// include-databases -- 테이블 스키마는 TESTDB
// include-tables -- 테이블은 4개, % 와일드카드 됨
mysql> show processlist;
+----+------+-----------+------+---------+------+----------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+------+-----------+------+---------+------+----------+------------------+
| 11 | root | localhost | NULL | Query | 0 | starting | show processlist |
| 12 | root | localhost | NULL | Sleep | 0 | | NULL |
| 13 | root | localhost | NULL | Sleep | 0 | | NULL |
| 14 | root | localhost | NULL | Sleep | 0 | | NULL |
| 15 | root | localhost | NULL | Sleep | 0 | | NULL |
+----+------+-----------+------+---------+------+----------+------------------+
5 rows in set (0.00 sec)
// 작업이 시작될 때 프로세스리스트를 보면 스레드가 4개 할당된 것으로 확인할 수 있다.
#mysqlpump referance
https://dev.mysql.com/doc/refman/5.7/en/mysqlpump.html
'쇠똥굴리기(BOOK) > MySQL 5.7 완벽 분석' 카테고리의 다른 글
서버 쪽에서 쿼리 타임아웃 지정(max_connection_time) (0) | 2020.06.04 |
---|---|
rewrite-db 옵션 (0) | 2020.05.25 |
ALTER로 복사하지 않는 VARCHAR 크기의 변경(ONLINE DDL 기능) (0) | 2020.05.19 |
UNION의 개선(5.6 -> 5.7) (0) | 2020.05.18 |
[mysql 5.7] 실행중인 쿼리의 Explain 신기능 (0) | 2020.05.06 |