MySQLのレプリケーションがうまく動かない at tritonn 5.0.67-log

MySQLのレプリケーションがうまく動かない

ちゃんとレプリケーションの情報をセットしてスタートさせてるんだけどうまく動かない。

mysql> change master to master_host='db.l2tp.org', master_user='ossan', master_password='namidafukeyo', master_log_file='mysql-bin.002233', master_log_pos=406351699;
Query OK, 0 rows affected (0.01 sec)

mysql> start slave;
Query OK, 0 rows affected (0.00 sec)

mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State:
Master_Host: db.l2tp.org
Master_User: ossan
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.002233
Read_Master_Log_Pos: 406351699
Relay_Log_File: relay-bin.000002
Relay_Log_Pos: 243
Relay_Master_Log_File: mysql-bin.002233
Slave_IO_Running: No
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: 406351699
Relay_Log_Space: 243
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: NULL
1 row in set (0.00 sec)

上記の情報のなかでも、”Slave_IO_Running”の項目がNoになってしまっている。何度やり直してもダメ。何か原因があるのだろう。

クライアント側のエラーログを見てみる

エラーログを漁ってみると早速それっぽいログが出力されてた。

110808  8:15:58 [Note] Error reading relay log event: slave SQL thread was killed
110808  8:16:01 [Note] Slave SQL thread initialized, starting replication in log 'mysql-bin.002233' at position 406351699, relay log './relay-bin.000001' position: 4
110808  8:16:01 [Note] Slave I/O thread: connected to master '[email protected]:3306',  replication started in log 'mysql-bin.000233' at position 406351699
110808  8:16:01 [ERROR] Error reading packet from server: log event entry exceeded max_allowed_packet; Increase max_allowed_packet on master ( server_errno=1236)
110808  8:16:01 [ERROR] Got fatal error 1236: 'log event entry exceeded max_allowed_packet; Increase max_allowed_packet on master' from master when reading data from binary log
110808  8:16:01 [Note] Slave I/O thread exiting, read up to log 'mysql-bin.002233', position 406351699

どうやらmax_allowed_packetの値が小さいらしい。

max_allowed_packetの値を書き換え

さて

mysql> show variables like '%max_allowed%';
+--------------------+----------+
| Variable_name      | Value    |
+--------------------+----------+
| max_allowed_packet | 16777216 |
+--------------------+----------+
1 row in set (0.00 sec)

現在の値は16M。

これで小さいって言われるんなら160Mにしてやろう。

この値はmy.cnfに記述されているので、該当する項目を書き換えて再起動すればよい。でもそうすると無駄にrelay-logの値が進んでしまったりするので今回はset globalを利用して値を直接書き換えた。

この場合、サーバを再起動すると値が戻ってしまうので要注意。今回の件に限れば今まで問題がなかったので、レプリケーションの初期さえ乗り切ってしまえば問題がないと判断。

mysql> set global max_allowed_packet=20772160;
Query OK, 0 rows affected (0.00 sec)

mysql> show variables like '%max_allowed%';
+--------------------+----------+
| Variable_name      | Value    |
+--------------------+----------+
| max_allowed_packet | 16777216 |
+--------------------+----------+
1 row in set (0.00 sec)

と、設定をしたものの値が書き換わらない・・・。何度かやっていると書き換わるタイミングがあることに気づく。そしてこの書き換えるべき値はどうやらサーバ側の値らしい。

どうやらセション毎を切り直さないと値がセットされないらしい。試してみる。

 shell> mysql -h db -u ossan -p -e "set global max_allowed_packet=1025000000;"
 Enter password:
 shell> mysql -h db -u ossan -p -e "show variables like 'max_allowed_packet';"
 Enter password:
 +--------------------+------------+
 | Variable_name      | Value      |
 +--------------------+------------+
 | max_allowed_packet | 1024999424 |
 +--------------------+------------+
 shell> mysql -h db -u yousan -p -e "set global max_allowed_packet=3500000;"
 Enter password:
 shell> mysql -h db -u yousan -p -e "show variables like 'max_allowed_packet';"
 Enter password:
 +--------------------+---------+
 | Variable_name      | Value   |
 +--------------------+---------+
 | max_allowed_packet | 3499008 |
 +--------------------+---------+

どうやらうまくいったみたい。で、色々と値を試してみてたんだけど、どうやらこのmax_allowed_packetは1GBを超えるあたりが限界値らしい。2GBとか1.5GBとかを指定するとwarningが出ちゃう。

そして実験的にわかったことは、その上限値が1,073,741,824と言うこと。

shell> mysql -h db -u ossan -p -e "set global max_allowed_packet=1114000000;"
Enter password:

shell> mysql -h db -u ossan -p -e "show variables like 'max_allowed_packet';"
Enter password:
+--------------------+------------+
| Variable_name      | Value      |
+--------------------+------------+
| max_allowed_packet | 1073741824 |
+--------------------+------------+
shell> s -lat mysql-bin.000233
-rw-rw----  1 mysql  mysql  1073741906 Aug  1 17:20 mysql-bin.002233

で、これだと非常に困る。なぜならば今回転送できないログというのが1,073,741,906であり、先にわかった上限値の1,073,741,824を超えてしまっているからだ。

コメントを残す