従来のMySQLのレプリケーションでは、
MySQL 5.
環境構築
第22回 特定のSQL文が原因で発生したレプリケーション遅延の調査方法で紹介した方法にて、MySQL5.
です。
構成は以下のようになっています。
IP | MySQL PORT | master/ |
---|---|---|
172. | 3306 | master |
172. | 3306 | slave |
GTIDを使用したレプリケーションの設定
MySQL5.
my.cnfの設定
まず、
- log-bin
(バイナリログの有効化) - server-id=NO. (マスターとスレーブで異なる値を記述すること)
そして、
- gtid-mode=ON
(GTIDの有効化) - enforce-gtid-consistency=true
(GTIDの一貫性を有効化) - log-slave-updates
(スレーブでもバイナリログを記述する設定)
# vim /etc/my.cnf log-bin server-id=1 log-slave-updates gtid-mode=ON enforce-gtid-consistency=true
gtid-mode=ON
の場合はenforce-gtid-consistency=false
だとMySQLが起動できません。また、log-slave-updates
が必須となり、
そして、
# /etc/init.d/mysqld start Starting mysqld: [ OK ]
マスターの設定
レプリケーション用のユーザと権限を設定します
mysql> CREATE USER 'repl'@'172.17.0.3' IDENTIFIED BY 'replication'; mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'172.17.0.3';
スレーブの設定
従来のレプリケーションであればCHANGE MASTER
構文に現在のマスターのバイナリログの情報を記述する必要がありましたが、MASTER_
と記述し実行します。
MASTER_
とすることで、
mysql> CHANGE MASTER TO MASTER_HOST = '172.17.0.1', MASTER_PORT = 3306, MASTER_USER = 'repl', MASTER_PASSWORD = 'replication', MASTER_AUTO_POSITION = 1;
そして、
mysql> start slave;
これでGTIDを使用したレプリケーション構成は完了です。
GTIDについて
GTIDはコミット済みのトランザクション単位に与えられる一意識別子です。
- server_
uuid …サーバを識別するUUIDとなります。 - transaction_
id …コミットされたトランザクション順のシーケンス番号です。
たとえば、321e231b-3ce3-11e6-9fe5-0242ac110001:2
のような表示になります。321e231b-3ce3-11e6-9fe5-0242ac110001
がサーバーを識別するUUIDを示し、2
が2番目に実行されたトランザクションとなります。
では、
mysql> show master status; +------------------+----------+--------------+------------------+------------------------------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +------------------+----------+--------------+------------------+------------------------------------------+ | mysql-bin.000001 | 678 | | | 321e231b-3ce3-11e6-9fe5-0242ac110001:1-7 | +------------------+----------+--------------+------------------+------------------------------------------+
この例ではExecuted_
に321e231b-3ce3-11e6-9fe5-0242ac110001:1-7
という値が入っています。321e231b-3ce3-11e6-9fe5-0242ac110001
はマスター自身のserver_1-7
という値になっています。これはtransaction_
続いて、
mysql> show slave status\G : : Slave_IO_Running: Yes Slave_SQL_Running: Yes : : Retrieved_Gtid_Set: 321e231b-3ce3-11e6-9fe5-0242ac110001:1-7 Executed_Gtid_Set: 321e231b-3ce3-11e6-9fe5-0242ac110001:1-7 Auto_Position: 1
Retrieved_
の内容はserver_1-7
は1番目から7番目までのトランザクションをマスターから受け取ったということです。Executed_
の内容はこちらも同じくserver_1-7
はスレーブで実行されたトランザクションの情報を指しています。よって、
GTIDを使用したレプリケーションの制限事項
GTIDを使用したレプリケーションでは制限事項があります。以下の3つの場合はレプリケーションができないためにマスターでエラーとなり実行できません。
- CREATE TABLE ... SELECT ステートメント
- トランザクション内のトランザクションおよび非トランザクションテーブルの両方を更新する
- トランザクション内の CREATE TEMPORARY TABLE ステートメント
それぞれ実行して試してみます。
CREATE TABLE ... SELECT ステートメント
CREATE TABLE ... SELECT
は以下のようなエラーが表示され実行できません。
mysql> CREATE TABLE tbl2 SELECT * FROM tbl1; ERROR 1786 (HY000): CREATE TABLE ... SELECT is forbidden when @@GLOBAL.ENFORCE_GTID_CONSISTENCY = 1.
対処方法としては、CREATE TABLE..
文でテーブルのコピーを作成または通常のCREATE TABLE
文でテーブルを作成しておき、INSERT INTO...
文でデータを投入することで対応可能です。
トランザクション内のトランザクションおよび非トランザクションテーブルの両方を更新する
たとえば、
以下のようなテーブルを作成して、
- innodb_
t …InnoDBストレージエンジンで作成したテーブル - myisam_
t …MyISAMストレージエンジンで作成したテーブル
mysql> set autocommit=0; Query OK, 0 rows affected (0.00 sec) mysql> insert into innodb_t ( id2 ) values (1); Query OK, 1 row affected (0.00 sec) mysql> insert into myisam_t ( id2 ) values (1); ERROR 1785 (HY000): When @@GLOBAL.ENFORCE_GTID_CONSISTENCY = 1, updates to non-transactional tables can only be done in either autocommitted st atements or single-statement transactions, and never in the same statement as updates to transactional tables. mysql> commit; mysql> select * from innodb_t; +----+------+ | id | id2 | +----+------+ | 1 | 1 | +----+------+ 1 row in set (0.00 sec) mysql> select * from myisam_t; Empty set (0.00 sec)
以上のようにMyISAMのテーブルを更新しようとすると、
mysql> set autocommit=1; Query OK, 0 rows affected (0.00 sec) mysql> insert into myisam_t ( id2 ) values (1); Query OK, 1 row affected (0.00 sec)
トランザクション内の CREATE TEMPORARY TABLE ステートメント
トランザクション内でCREATE TEMPORARY TABLE
を実行すると、
mysql> set autocommit=0; Query OK, 0 rows affected (0.00 sec) mysql> create temporary table tmp1(id int); ERROR 1787 (HY000): When @@GLOBAL.ENFORCE_GTID_CONSISTENCY = 1, the statements CREATE TEMPORARY TABLE and DROP TEMPORARY TABLE can be executed in a non-transactional context only, and require that AUTOCOMMIT = 1. These statements are also not allowed in a function or trigger because functions and triggers are also considered to be multi-statement transactions.
トランザクション内でない場合は作成できます。
mysql> set autocommit=1; Query OK, 0 rows affected (0.00 sec) mysql> create temporary table tmp1(id int); Query OK, 0 rows affected (0.01 sec)
まとめ
今回は、
次回は、