問題と原因
Lost connection to MySQL server at 'reading initial communication packet', system error: 0
のようなエラーが出るとき、原因は様々だ。
今回の原因は、UbuntuのVMがネットに接続されていなかったというかHyper-Vのネットワークスイッチがおかしくなっていたことであった。
$ ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
From 172.18.11.59 icmp_seq=1 Destination Host Unreachable
From 172.18.11.59 icmp_seq=2 Destination Host Unreachable
From 172.18.11.59 icmp_seq=3 Destination Host Unreachable
From 172.18.11.59 icmp_seq=4 Destination Host Unreachable
From 172.18.11.59 icmp_seq=5 Destination Host Unreachable
From 172.18.11.59 icmp_seq=6 Destination Host Unreachable
^C
--- 8.8.8.8 ping statistics ---
7 packets transmitted, 0 received, +6 errors, 100% packet loss, time 6137ms
pipe 4
トラブルシューティングの過程
発見経緯
Railsの開発をしていて、rspecを回そうとしたところ当該エラーが出た
前提
前夜までは何事もなく動いていた。
試行
-
手元の変更を
git stash
で退避させてrspecをまわす→同じエラー -
docker ps
でmysqlのdocker imageが起動していることを確認→起動している -
docker kill <image hash>
して殺してsudo docker-compose -f docker-compose-web.yml up -d db
してrspecを回す→同じエラー -
docker-compose -f docker-compose-web.yml build
してみて同様に試す→同じエラー -
Windows10からheide sqlでいつも通り接続を試みる→同じエラー
-
rspecを回すときにmysqlの動いているシェルの実行ログを監視する(VSCodeで簡単に見れる)→なにも出力されない
-
mysqlのdocker containerにattach shellして(VSCodeで簡単にできる)
mysql -u root -p
して手動ログインを試みる→成功 -
bundle exec rails console
を試す→同じエラー -
3306 portへの疎通確認→成功
$ nc -vz localhost 3306 Connection to localhost 3306 port [tcp/mysql] succeeded!
-
UbuntuのVM再起動→変化なし
ここまで試して、試しにaptの更新かけてみたら?今日dockerの更新降ってきてたよと言われてsudo apt update
したところ、全部のサーバーに疎通してない。
もしかしてと思って冒頭のpingを打ったところ疎通してないことを確認したのである。
このため再度Windows10を再起動して解決に至った
解決を難しくした原因
少し前にWindows10を再起動していたためHost側は関係ないと思っていたがそうではなかった。
再起動直後くらいに、Wi-Fiへの接続が切れたため、トラブルシューティングツールからネットワークアダプターのリセットを行っていた。このときにHyper-VのDefault Switchがおかしくなったと考えられる。