2020년 12월 27일 일요일

Clone Plugin 에 대하여

MySQL 8.0.17 부터 추가된 Clone 플러그인에 대하여 알아보자.

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을 실행할 때 지정한 디렉토리가 존재하는 경우, 에러가 발생하여 데이터 습득에 실패하게 된다.
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

댓글 없음:

댓글 쓰기

결혼이민비자 신청방법(F-6-1 국민의 배우자)

 제가 일본인 여자친구와 결혼 후, 한국에 귀국하기 위해 신청한 결혼이민비자에 대하여 작성해보도록 하겠습니다. 필자는 일본에서 근무하고 있었으며, 한국에서의 소득은 없었습니다. 결혼이민비자를 신청한 날짜는 2021-04-21 이며, 사증이 발급된 날짜...