年中アイス

いろいろつらつら

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を再設定すると無事にレプリケーションが開始できました。

参考

*1:単純なRDS→auroraマイグレーションAWSぽちぽちでレプリケーションできるんですが、稼働中のauroraにレプリケーションするには自前でdumpしてレプリケーションする必要がありました。