Windows環境でMySQLのレプリケーションを設定する

# 環境

Windows7 pro
MySQL5.6


# MySQLで複数インスタンスを起動できるように設定する

* 2つ目のサービスを作成

すでに動いているインスタンスのmy.iniをコピーして下記の箇所を変更する。
※デフォルトでは下記ディレクトリ
C:\ProgramData\MySQL\MySQL Server 5.6

```lang:my2.ini
[mysqld]
port=3308
datadir="C:/ProgramData/MySQL/MySQL Server 5.6/Data2/"
# Server Id.
server-id=2
```

コマンドプロンプトを管理者権限で実行し、下記のコマンドでサービス登録する

```lang:command
mysqld --install MySQL2 --defaults-file="C:\ProgramData\MySQL\MySQL Server 5.6\my2.ini"
```

* 起動に必要なテーブルをコピーする

すでに動いているインスタンスのdataフォルダから下記2つのフォルダをコピーする。
　　mysql
　　performance_schema

* サービスを起動

管理画面からサービスを起動し、正常に起動することを確認する。


# レプリケーション設定

* my.iniに設定を追加する

サービスが動いている場合は、一度停止する。
下記の設定をそれぞれ、追加。

マスター側

```lang:my.ini
[mysqld]
#レプリケーション
gtid-mode=ON
log-slave-updates
log-bin=mysql-bin
binlog-do-db=test
enforce-gtid-consistency
```

スレーブ側

```lang:my2.ini
[mysqld]
#レプリケーション
gtid-mode=ON
log-slave-updates
log-bin=mysql-bin
binlog-do-db=test
enforce-gtid-consistency
skip-slave-start
```
スレーブ側には追加でskip-slave-startを追加で設定

マスター、スレーブのサービスを起動する。

#マスター、スレーブのテーブルを同期する
マスター側にすでにデータが存在する場合は、下記の手順を実行しデータの状態を一致させる。

* マスター側データベースのダンプを取得する

はじめに、マスター側をロックする

```lang:mysql
mysql> flush tables with read lock;
```

次に、masterの現在位置を確認

```lang:mysql
mysql> show master status;
+------------------+----------+--------------+------------------+--------------------------------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set                          |
+------------------+----------+--------------+------------------+--------------------------------------------+
| mysql-bin.000038 |      191 | test         |                  | 71fdb639-209d-11e5-a233-b888e3335e2f:1-599 |
+------------------+----------+--------------+------------------+--------------------------------------------+
1 row in set (0.00 sec)
```

別窓でmysqldumpコマンドを実行

```lang:command
>mysqldump -u root -p --set-gtid-purged=OFF test > test.dump
```

ロックを解除

```lang:mysql
mysql> unlock tables;
```

* スレーブ側へデータを入れる

testデータベースを作成

```lang:mysql
mysql>CREATE DATABASE test;
```

```lang:command
>mysql -u root -P 3308 -p test< test.dump
```


#スレーブ側の設定を実行する

* マスターからデータを移した場合、
スレーブ側のMySQLで下記のクエリを実行する。

```lnag:mysql
mysql> CHANGE MASTER TO 
          MASTER_HOST = '127.0.0.1',
          MASTER_PORT = 3306,
          MASTER_USER = 'root',
          MASTER_PASSWORD = 'root',
          MASTER_AUTO_POSITION = 0,
          MASTER_LOG_POS = 191,
          MASTER_LOG_FILE = 'mysql-bin.000038';
```

MSTER_LOG_POS と　MASTER_LOG_FILE は事前に確認しておいたマスターの現在位置を使用する。


* マスターが空の場合

```lang:mysql
mysql> CHANGE MASTER TO 
          MASTER_HOST = '127.0.0.1',
          MASTER_PORT = 3306,
          MASTER_USER = 'root',
          MASTER_PASSWORD = 'root',
          MASTER_AUTO_POSITION = 1;
```

スレーブのインスタンスに、マスターの情報を設定する。
設定実行後、スレーブとして動作をさせる。

```lang:msyql
mysql> START SLAVE;
```

OS再起動した場合は、起動後に上記のコマンドを再度実行する。
自動でスタートさせるには、my2.iniの`skip-slave-start`を削除してください。

# レプリケーションのステータス表示

```lang:command
# マスターステータスの確認
mysql> SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+------------------------------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set                        |
+------------------+----------+--------------+------------------+------------------------------------------+
| mysql-bin.000005 |      191 | test         |                  | 71fdb639-209d-11e5-a233-b888e3335e2f:1-3 |
+------------------+----------+--------------+------------------+------------------------------------------+

# スレーブステータスの確認
mysql> show slave status;
+----------------------------------+-------------+-------------+-------------+---------------+----------------
| Slave_IO_State                   | Master_Host | Master_User | Master_Port | Connect_Retry | Master_Log_File  | 
+----------------------------------+-------------+-------------+-------------+---------------+----------------　以下省略
| Waiting for master to send event | 127.0.0.1   | root        |        3306 |            60 | mysql-bin.00000                 
+----------------------------------+-------------+-------------+-------------+---------------+----------------