MySQL 8.
今回はCLONEプラグインの導入から実施までと、
また、
CLONEプラグインの導入
CLONEプラグインは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 = <取得したいディレクトリパス>
を指定します。実行権限として、
また、
ERROR 1007 (HY000): Can't create database '/tmp/testdb'; database exists
エラーなく実行できた場合は、
mysql> CLONE LOCAL DATA DIRECTORY = '/tmp/clone_testdb'; Query OK, 0 rows affected (2.30 sec)
実行が完了すると、
$ ll /tmp/testdb total 682064 drwxr-x--- 2 mysql mysql 4096 Jul 29 03:12 #clone drwxr-x--- 2 mysql mysql 4096 Jul 29 03:12 d1 drwxr-x--- 2 mysql mysql 4096 Jul 29 03:12 d2 -rw-r----- 1 mysql mysql 24800 Jul 29 03:12 ib_buffer_pool -rw-r----- 1 mysql mysql 12582912 Jul 29 03:12 ibdata1 -rw-r----- 1 mysql mysql 268435456 Jul 29 03:12 ib_logfile0 -rw-r----- 1 mysql mysql 268435456 Jul 29 03:12 ib_logfile1 drwxr-x--- 2 mysql mysql 4096 Jul 29 03:12 mysql -rw-r----- 1 mysql mysql 79691776 Jul 29 03:12 mysql.ibd drwxr-x--- 2 mysql mysql 4096 Jul 29 03:12 sys drwxr-x--- 2 mysql mysql 4096 Jul 29 03:12 test drwxr-x--- 2 mysql mysql 4096 Jul 29 03:12 trxtest -rw-r----- 1 mysql mysql 14680064 Jul 29 03:12 undo_001 -rw-r----- 1 mysql mysql 26214400 Jul 29 03:12 undo_002 -rw-r----- 1 mysql mysql 28311552 Jul 29 03:12 undo_table_space.ibu drwxr-x--- 2 mysql mysql 4096 Jul 29 03:12 world
これを利用して、/data
配下にdatadirを配置しているため、/data
配下に移動させて、
$ mv /tmp/testdb /data/clone_testdb $ cp /data/testdb/my.cnf /data/clone_testdb/my.cnf $ vim /data/clone_testdb/my.cnf <-port番号やserver-id,datadirなどを変更 $ /usr/local/mysql8021/bin/mysqld_safe --defaults-file=/data/clone_testdb/my.cnf --ledir=/usr/local/mysql8021/bin "$@" & $ /usr/local/mysql8021/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)
簡単にMySQLを複製することができました。
このインスタンスをレプリケーションスレーブとして追加する場合、MASTER_
を指定してCHANGE MASTER
ステートメントを実行することで追加できます。GTIDを利用していない場合でも、performance_
テーブルを確認することでCLONE実施の情報を取得できるので、CHANGE MASTER
ステートメントを実行して追加することが可能です。
mysql> SELECT * FROM performance_schema.clone_status\G *************************** 1. row *************************** ID: 1 PID: 12 STATE: Completed BEGIN_TIME: 2020-07-29 03:12:13.358 END_TIME: 2020-07-29 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 INSTANCE FROM '<cloneを実行するユーザー>'@'<DonarのIP>':<Donarのport> IDENTIFIED BY '<パスワード>' (DATA DIRECTORY = '<取得先>')
とすることで、
DATA DIRECTORYがカッコ()書きになっているのは、
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)
また、ERROR 3869 (HY000): Clone system configuration: 127.
といったエラーが出力されるので、
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 (TRUNCATEも含む) が実行される環境であれば、 参照のない遅延しても良いスレーブサーバーなどで実行することをおすすめします。 - DonarとRecipient間で異なるバージョンからクローンすることはできません。利用するときはDonarとRecipientのバージョンを揃えて実行するようにしましょう。
- CLONEの対象となるデータはInnoDBストレージエンジンとなります。実行前に各テーブルのストレージエンジンを確認し、
InnoDB以外のものがないか確認をしてください。
その他にもいくつか制限がありますので、
まとめ
今回は、