can't work with MySQL 8.x
koron opened this issue · comments
MURAOKA Taro commented
DockerでMySQLを動かし、WSL2からtcpdumpしつつアクセスをしてみた。
mysql-client 8.0 が作るハンドシェイク応答パケットが全然解釈できない。
サーバーが5.7でも8.0でも同様(当然)。なんか根本的に形が違うっぽい。
Usernameに終端 \0
がない。
cmd/test-conn が作るパケットならば、サーバーがMySQL 8.0.35でも5.7.44でも問題なく解釈できた。
ハンドシェイクのcflagsの変更に対応できてない可能性がある。
MURAOKA Taro commented
調査結果
- Go製のテストプログラムとMySQL 8.0の通信は dbquerylog でログが取れた
- Go製のテストプログラムとMySQL 5.7の通信は dbquerylog でログが取れた
- MySQL 8.0の cli クライアントとの通信は dbquerylog でログが取れなかった
- クライアント側のハンドシェークパケットの Charset の解釈が間違ってた。誤:variable int 正:uint8
- クライアントはHandshakeではなく SSLRequest を送ってた
--ssl-mode disable
を付ければ dbquerylog でログが取れるようになった 参考情報
今後の課題
-
パケットダンプで全部見れている以上、がんばればSSL対応もできる。やるか?
-
JDBCドライバの更新に伴うものの可能性がある。要状況確認
-
状況再現用に発生する際のパケットキャプチャが欲しい
こんな感じで capture.pcap ファイルにデータが取れるはず。
$ sudo tcpdump -s 0 -l -w capture.pcap "tcp port 3306"