GTID ( 2 )

August 07, 2018

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 が記載されていることがわかる。


 © 2023, Dealing with Ambiguity