MySQL で max_allowed_packet を超過した場合

MySQL で max_allowed_packet を超過した場合にどうなるんだっけ…と思って試してみた結果。

サーバーの max_allowed_packet をクエリが超過した場合

MySQL 5.6

サーバー起動

% docker run --name mysql56 -e MYSQL_ALLOW_EMPTY_PASSWORD=yes -d mysql:5.6 --max-allowed-packet=100000

クライアントは原因がわからないけど切断される

% ruby -e 'puts "set @a="+"1"*1000000' | docker exec -i mysql56 mysql
ERROR 2006 (HY000) at line 1: MySQL server has gone away

サーバー側はログ出力なし

% docker logs mysql56
...

MySQL 5.7

サーバー起動

% docker run --name mysql57 -e MYSQL_ALLOW_EMPTY_PASSWORD=yes -d mysql:5.7 --max-allowed-packet=100000

クライアントは原因がわからないけど切断される

% ruby -e 'puts "set @a="+"1"*1000000' | docker exec -i mysql57 mysql
ERROR 2006 (HY000) at line 1: MySQL server has gone away

サーバー側のログで max_allowed_packet を超えて接続を切断したことがわかる

% docker logs mysql56
...
2021-09-08T13:19:10.767604Z 2 [Note] Aborted connection 2 to db: 'unconnected' user: 'root' host: 'localhost' (Got a packet bigger than 'max_allowed_packet' bytes)

MySQL 8.0

サーバー起動

% docker run --name mysql80 -e MYSQL_ALLOW_EMPTY_PASSWORD=yes -d mysql:8.0 --max-allowed-packet=100000

クライアントで max_allowed_packet を超えたことがわかる

% ruby -e 'puts "set @a="+"1"*1000000' | docker exec -i mysql80 mysql
ERROR 1153 (08S01) at line 1: Got a packet bigger than 'max_allowed_packet' bytes

サーバー側はログ出力なし

% docker logs mysql80
...

クライアントの max_allowed_packet を結果が超過した場合

MySQL 5.6

クライアントがエラー

% ruby -e 'puts "select "+"1"*50000' | docker exec -i mysql56 mysql --max-allowed-packet=10000
ERROR 2020 (HY000) at line 1: Got packet bigger than 'max_allowed_packet' bytes

サーバー側はログ出力なし

% docker logs mysql56
...

MySQL 5.7

クライアントがエラー

% ruby -e 'puts "select "+"1"*50000' | docker exec -i mysql57 mysql --max-allowed-packet=10000
ERROR 2020 (HY000) at line 1: Got packet bigger than 'max_allowed_packet' bytes

サーバー側にもログが出る

% docker logs mysql57
...
2021-09-08T13:49:45.856283Z 4 [Note] Aborted connection 4 to db: 'unconnected' user: 'root' host: 'localhost' (Got an error reading communication packets)

MySQL 8.0

クライアントがエラー

% ruby -e 'puts "select "+"1"*50000' | docker exec -i mysql80 mysql --max-allowed-packet=10000
ERROR 2020 (HY000) at line 1: Got packet bigger than 'max_allowed_packet' bytes

サーバー側はログ出力なし

% docker logs mysql80
...