GTID を有効化
MySQL 5.6 において GTID を有効化するには以下の手順を踏む必要がある。
1. マスターの更新を停止し、スレーブが追いつくのを待つ
マスター側で SHOW MASTER STATUS する。
mysql> SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 | 1232 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
次にスレーブ側で SHOW SLAVE STATUS して、ログポジションを確認する。
mysql> SHOW SLAVE STATUS\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 10.1.11.212
Master_User: repl
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 1232
Relay_Log_File: mysqld-relay-bin.000002
Relay_Log_Pos: 956
Relay_Master_Log_File: mysql-bin.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 1232
Relay_Log_Space: 1130
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 212
Master_UUID: f341ed2f-997e-11e8-8672-060b24b2563c
Master_Info_File: /var/lib/mysql/master.info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it
Master_Retry_Count: 86400
Master_Bind:
Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp:
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set:
Executed_Gtid_Set:
Auto_Position: 0
1 row in set (0.00 sec)
両方 1232 なので、更新は追いついていると判断。
2. マスターとスレーブを停止する
[ マスター側 ]
$ sudo service mysqld stop
Stopping mysqld: [ OK ]
[ スレーブ側 ]
$ sudo service mysqld stop
Stopping mysqld: [ OK ]
3. GTID 関係のオプションをマスターとスレーブ両方で有効にする
マスターとスレーブ両方において、gtidmode 、enforcegtidconsistency 、logbin 及び logslaveupdates オプションを設定する。
スレーブ側で logbin オプションが必要なのは、適用済みの GTID の情報がバイナリログに格納されるためである。また、enforcegtid_consistency は、マスター上で実行される SQL 文が GTID 互換であることを保証するためのもの。例えばテーブルの作成と行の挿入を同時に行う CREATE TABLE … SELECT という SQL はこのオプションにより排除される。
$ cat /etc/my.cnf | grep -v ^#
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
symbolic-links=0
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
server_id=212
gtid_mode=ON
enforce_gtid_consistency
log_bin=mysql-bin
expire_logs_days = 7
log_slave_updates
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
なお、スレーブ側には起動時に自動でレプリケーションを開始しないように skip-slave-start も追記しておく。
4. マスターとスレーブを起動する
/etc/my.cnf の設定が終了したら両 MySQL サーバーを起動する。
$ sudo service mysqld start
Starting mysqld: [ OK ]
マスター側でスレーブからの接続がないことを確認する。
mysql> SHOW processlist;
+----+------+-----------+------+---------+------+-------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+------+-----------+------+---------+------+-------+------------------+
| 2 | root | localhost | NULL | Query | 0 | init | SHOW processlist |
+----+------+-----------+------+---------+------+-------+------------------+
1 row in set (0.00 sec)
5. スレーブ側で CHANGE MASTER コマンドを実行する
CHANGE MASTER コマンド実行時は MASTERAUTOPOSITION = 1 を指定する。これによりバイナリログの情報が不要となる。
GTID を利用した場合、スレーブがマスターへ送信するコマンドは COMBINLOGDUMP ではなく、COMBINLOGDUMP_GTID となり、マスター側で GTID に基づいて適切なバイナリログの検索が行われることになる。
mysql> CHANGE MASTER TO
-> MASTER_HOST='10.1.11.212',
-> MASTER_PORT=3306,
-> MASTER_USER='repl',
-> MASTER_PASSWORD='password',
-> MASTER_AUTO_POSITION = 1,
-> MASTER_HEARTBEAT_PERIOD=60;
Query OK, 0 rows affected, 2 warnings (0.01 sec)
6. スレーブ側でレプリケーションを開始する
mysql> START SLAVE;
Query OK, 0 rows affected (0.00 sec)
GTID によるレプリケーションが有効かを確認する
mysql> SHOW SLAVE STATUS \G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 10.1.11.212
Master_User: repl
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000002
Read_Master_Log_Pos: 703
Relay_Log_File: mysqld-relay-bin.000002
Relay_Log_Pos: 913
Relay_Master_Log_File: mysql-bin.000002
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 703
Relay_Log_Space: 1118
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 212
Master_UUID: f341ed2f-997e-11e8-8672-060b24b2563c
Master_Info_File: /var/lib/mysql/master.info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it
Master_Retry_Count: 86400
Master_Bind:
Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp:
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set: f341ed2f-997e-11e8-8672-060b24b2563c:1-2
Executed_Gtid_Set: f341ed2f-997e-11e8-8672-060b24b2563c:1-2
Auto_Position: 1
1 row in set (0.00 sec)
GTID が記載されていることがわかる。