MySQLのレプリケーションを開始しようとしたらGot fatal error 1236 from master when reading data from binary log: 'log event entry exceeded max_allowed_packet; Increase max_allowed_packet on master;
先日、稼働中のauroraにRDS MySQLからデータをレプリケーションして切り替える*1ことでデータベースを統合するタスクを進めていました。しかし、レプリケーションを開始すると、Slave_IO_Running: No
,Slave_SQL_Running: Yes
の状態で止まってしまい、レプリケーションが開始できませんでした。
Last_IO_Error(一部置換)
Got fatal error 1236 from master when reading data from binary log: 'log event entry exceeded max_allowed_packet; Increase max_allowed_packet on master; the first event '<binlogファイル名>' at <position>, the last event read from '/rdsdbdata/log/binlog/<binlogファイル名> at <position>, the last byte read from '/rdsdbdata/log/binlog/<binlogファイル名>' at <position>.'
何が原因だったか
結論から書くと、external masterをsetする時に指定したpositionが間違っていました。
当初、このページのように単純に大きめのトランザクションがあり、デフォルト(4MB)のままだったので引っ掛かったのかなと思い、ParameterGroupのmax_allowed_packet
を40MB→400MB→800MBまで変更してみましたが解消しません。RDS側でshow binary logs
を見ても多くとも10MBほどで、これは他の原因の結果このエラーに辿りついてるだけで、実際にmax_allowed_packet
が足りないわけじゃないのではと判断しました。
Perconaブログではbinlogの破損について書かれており、直接見るためにmysqlbinlogコマンドを入れて、レプリケーションが止まっている部分のbinlogをダウンロードして確認しました。結果、# at 123
のようにbinlog内にpositionがあるのですが、エラーに出ているexternal masterで設定したpositionが無い!つまりこれが間違ってるということ。後はbinlogの中を見ながら実際に開始するpositionを特定した上で、external masterを再設定すると無事にレプリケーションが開始できました。