kubo39's blog

ただの雑記です。

ここのところのmysql-d/mysql-nativeについてのはなし

mysql-d/mysql-nativeってMySQL8.0対応してないの?という話があったので。

ちょっと前まで開発停滞していたけど最近はmysql-native自体は結構活発にコミットが積まれていて、たとえばCIの整備とかCollationのデフォルト変更(これは俺がやった)とかが行われていた。

mysql-nativeのいいところとしては

  • ソケットをvibe-coreのものと標準ライブラリのものを選択できる
    • libmysqlclient(Cのライブラリ)を使っている場合はノンブロッキングなものに置き換えられないのでI/Oでブロックしてしまう。これはvibe.dと相性がよくない。
  • prepared statementをサポートしている
    • SQLインジェクション対策において有効
    • またクエリのパースを毎回行う必要がないのでパフォーマンス上も有用
  • 自前でコネクションプールを持っていて特に意識せずにコネクションハンドルを管理することができる
    • 再接続などもよしなにやってくれる
    • ただしプール内すべての接続にかんして同じ準備済みステートメントの登録/解除が行われるために注意が必要

一方で機能的な部分はまだまだ足りていないというのも事実で、例を上げると:

  • MySQL8.0からデフォルトの認証機構として使われているcaching_sha2_passwordに対応していない
  • 255バイトを超える認証レスポンスに対応していない
  • SSL/TLS接続に対応していない
  • パケットの圧縮に対応していない
    • 8.0で追加されたzstdだけでなくzlibにも非対応
  • LOAD DATA INFILE構文に対応していない
  • CLIENT_SESSION_TRACKに対応していない
    • つまりSERVER_SESSION_STATE_CHANGEDをとる方法がない

といったあたりが課題としてある。8.0というかそもそも機能のフルセットに対していろいろ足りていない。

このうち、しばしばcaching_sha2_passwordがMySQL8.0デフォルトの認証となっている点と合わせてmysql-nativeはMySQL8.0に対応していないと判断されてしまう場合があったりする。

この場合サーバ側で設定ファイルを編集できる環境であればdefault_authentication_pluginmysql_native_passwordなど8.0以前の認証方式を指定することで対応は可能である。ここで単に認証を切ってしまうことも当然考えられるが、mysql-nativeは認証がmysql_native_passwordにハードコードされてしまっているためこの方法を使用することはできない。