Clone plugin 이란
온라인으로 습득할 수 있는 풀 백업으로, 동일한 데이터의 MySQL 서버를 작성할 수 있다.
Clone plugin 도입
MySQL 서버 패키지에 들어 있고, 사용하기 위해서는 INSTALL PLUGIN 으로 설치해야 한다.
INSTALL PLUGIN 실행 후에 SHOW PLUGIN 으로 설치되어 있는 것을 확인할 수 있다.
mysql> INSTALL PLUGIN clone SONAME 'mysql_clone.so'; Query OK, 0 rows affected (0.49 sec) mysql> SHOW PLGUINS; ... | mysqlx | ACTIVE | DAEMON | NULL | GPL | | clone | ACTIVE | CLONE | mysql_clone.so | GPL | +---------------------------------+----------+--------------------+----------------+---------+ 45 rows in set (0.06 sec)
Clone으로 데이터 복사
Clone을 사용하여 데이터를 습득 하려면, CLONE LOCAL DATA DIRECTORY = <습득 하려고 하는 디렉토리 패스>를 지정해야 한다.
실행하기 위해서는 모든 스키마, 테이블(*.*)에 대하여 CLONE_ADMIN 권한이 필요하다(Local 환경에서 실행하는 경우는 BACKUP_ADMIN 권한으로 가능)
또한, Clone을 실행할 때 지정한 디렉토리가 존재하는 경우, 에러가 발생하여 데이터 습득에 실패하게 된다.
문제 없이 실행된 경우는, 아래와 같이 Query OK가 표시 된다.
지정한 디렉토리에 복사된 데이터를 확인해보자.
이를 이용하여, 다른 포트로 MySQL을 기동해보자. 필자의 환경에서는 /data 밑에 datadir를 배치하고 있으므로, 동일하게 /data 밑으로 이동시킨 후, my.cnf를 준비하여 기동시켜보자
GTID를 이용하고 있을 때는 GTID 관련 정보도 복사되기 때문에, MASTER_AUTO_POSITION=1 을 지정하여 CHANGE MASTER statement를 실행하면 슬레이브로 추가할 수 있다.
GTID를 이용하고 있지 않은 경우에도, performance_schema.clone_status 테이블에서 CLONE 실시 정보를 습득할 수 있으므로, 이 정보를 토대로 CHANGE MASTER statement를 실행하여 슬레이브를 추가할 수 있다.
리모트 서버에 대한 Clone은 아래와 같이 가능하다.
CLONE INSTANCE FROM 'clone 실행 유저'@'Donar IP':'Donar port' IDENTIFIED BY '비밀번호' (DATA DIRECTORY = '습득처')
DATA DIRECTIRY는 옵션이므로 괄호로 감싸져 있다. 만약 지정하지 않은 경우는 Recipient의 데이터가 Donar과 같은 데이터로 변경되고 서버가 재기동된다. DATA DIRECTIRY를 기술하지 않으면, 데이터가 옮겨져 Recipient에 존재하던 데이터가 사라지기 때문에 주의가 필요하다.
또한, 리모트 서버로 실행하는 경우, Donar 인스턴스 정보가 Recipient의 clone_valid_donor_list에 설정되어 있어야 한다.
주의점
Clone 플러그인을 이용할 때는 몇가지 주의점이 있다.
# Refer
https://dev.mysql.com/doc/refman/8.0/en/clone-plugin.html
Clone을 사용하여 데이터를 습득 하려면, CLONE LOCAL DATA DIRECTORY = <습득 하려고 하는 디렉토리 패스>를 지정해야 한다.
실행하기 위해서는 모든 스키마, 테이블(*.*)에 대하여 CLONE_ADMIN 권한이 필요하다(Local 환경에서 실행하는 경우는 BACKUP_ADMIN 권한으로 가능)
또한, Clone을 실행할 때 지정한 디렉토리가 존재하는 경우, 에러가 발생하여 데이터 습득에 실패하게 된다.
ERROR 1007 (HY000): Can't create database '/tmp/testdb'; database exists
문제 없이 실행된 경우는, 아래와 같이 Query OK가 표시 된다.
mysql> CLONE LOCAL DATA DIRECTORY = '/tmp/clone_testdb'; Query OK, 0 rows affected (2.30 sec)
지정한 디렉토리에 복사된 데이터를 확인해보자.
$ ll /tmp/clone_testdb total 682064 drwxr-x--- 2 mysql mysql 4096 Dec 22 03:12 #clone drwxr-x--- 2 mysql mysql 4096 Dec 22 03:12 d1 drwxr-x--- 2 mysql mysql 4096 Dec 22 03:12 d2 -rw-r----- 1 mysql mysql 24800 Dec 22 03:12 ib_buffer_pool -rw-r----- 1 mysql mysql 12582912 Dec 22 03:12 ibdata1 -rw-r----- 1 mysql mysql 268435456 Dec 22 03:12 ib_logfile0 -rw-r----- 1 mysql mysql 268435456 Dec 22 03:12 ib_logfile1 drwxr-x--- 2 mysql mysql 4096 Dec 22 03:12 mysql -rw-r----- 1 mysql mysql 79691776 Dec 22 03:12 mysql.ibd drwxr-x--- 2 mysql mysql 4096 Dec 22 03:12 sys drwxr-x--- 2 mysql mysql 4096 Dec 22 03:12 test drwxr-x--- 2 mysql mysql 4096 Dec 22 03:12 trxtest -rw-r----- 1 mysql mysql 14680064 Dec 22 03:12 undo_001 -rw-r----- 1 mysql mysql 26214400 Dec 22 03:12 undo_002 -rw-r----- 1 mysql mysql 28311552 Dec 22 03:12 undo_table_space.ibu drwxr-x--- 2 mysql mysql 4096 Dec 22 03:12 world
이를 이용하여, 다른 포트로 MySQL을 기동해보자. 필자의 환경에서는 /data 밑에 datadir를 배치하고 있으므로, 동일하게 /data 밑으로 이동시킨 후, my.cnf를 준비하여 기동시켜보자
$ mv /tmp/clone_testdb /data/clone_testdb $ cp /data/testdb/my.cnf /data/clone_testdb/my.cnf $ vi /data/clone_testdb/my.cnf <-port, server-id, datadir 등 변경 $ /usr/bin/mysqld_safe --defaults-file=/data/clone_testdb/my.cnf & $ /usr/bin/mysql --defaults-file=/data/clone_testdb/my.cnf -uroot -p mysql> SELECT @@port; +--------+ | @@port | +--------+ | 3310 | +--------+ 1 row in set (0.00 sec) mysql> SHOW DATABASES; +--------------------+ | Database | +--------------------+ | d1 | | d2 | | information_schema | | mysql | | nyumon | | performance_schema | | sys | | test | | trxtest | | world | +--------------------+ 10 rows in set (0.18 sec)
GTID를 이용하고 있을 때는 GTID 관련 정보도 복사되기 때문에, MASTER_AUTO_POSITION=1 을 지정하여 CHANGE MASTER statement를 실행하면 슬레이브로 추가할 수 있다.
GTID를 이용하고 있지 않은 경우에도, performance_schema.clone_status 테이블에서 CLONE 실시 정보를 습득할 수 있으므로, 이 정보를 토대로 CHANGE MASTER statement를 실행하여 슬레이브를 추가할 수 있다.
mysql> SELECT * FROM performance_schema.clone_status\G *************************** 1. row *************************** ID: 1 PID: 12 STATE: Completed BEGIN_TIME: 2020-12-22 03:12:13.358 END_TIME: 2020-12-22 03:12:14.556 SOURCE: LOCAL INSTANCE DESTINATION: /tmp/clone_testdb/ ERROR_NO: 0 ERROR_MESSAGE: BINLOG_FILE: BINLOG_POSITION: 0 GTID_EXECUTED: 1 row in set (0.15 sec)
리모트 서버에 대한 Clone은 아래와 같이 가능하다.
CLONE INSTANCE FROM 'clone 실행 유저'@'Donar IP':'Donar port' IDENTIFIED BY '비밀번호' (DATA DIRECTORY = '습득처')
DATA DIRECTIRY는 옵션이므로 괄호로 감싸져 있다. 만약 지정하지 않은 경우는 Recipient의 데이터가 Donar과 같은 데이터로 변경되고 서버가 재기동된다. DATA DIRECTIRY를 기술하지 않으면, 데이터가 옮겨져 Recipient에 존재하던 데이터가 사라지기 때문에 주의가 필요하다.
mysql> CLONE INSTANCE FROM 'root'@'127.0.0.1':3306 IDENTIFIED BY 'xxxxxx' DATA DIRECTORY = '/tmp/remote_testdb'; Query OK, 0 rows affected (2.17 sec)
또한, 리모트 서버로 실행하는 경우, Donar 인스턴스 정보가 Recipient의 clone_valid_donor_list에 설정되어 있어야 한다.
mysql> SET GLOBAL clone_valid_donor_list = '127.0.0.1:3306'; Query OK, 0 rows affected (0.06 sec) mysql> SHOW VARIABLES LIKE 'clone_valid_donor_list'; +------------------------+----------------+ | Variable_name | Value | +------------------------+----------------+ | clone_valid_donor_list | 127.0.0.1:3306 | +------------------------+----------------+ 1 row in set (0.07 sec)
주의점
Clone 플러그인을 이용할 때는 몇가지 주의점이 있다.
- Donar측에 병렬 DDL은 허용하지 않는다. 만약, 빈번히 DDL이 실행되는 환경이라면, 참조 없고 지연되도 상관없는 슬레이브 서버 등에서 실행하는 걸 추천
- Donar 과 Recipient 버전이 다른 경우, 클론 불가능
- Clone 대상이 되는 데이터는 InnoDB 스토리지 엔진이다. 실행 전에 InnoDB 이외의 테이블이 없는 지 확인 필요
# Refer
https://dev.mysql.com/doc/refman/8.0/en/clone-plugin.html
댓글 없음:
댓글 쓰기