How to build MySQL 8.0.25 on WSL2 (and Debug with Visual Studio Code)
こんにちわ。せじまです。今回もゆるふわです。
はじめに
随分前の話になってしまいましたが、Windows 10 20H1 で WSL2 が正式リリースされ、しごとでLinux使ってる人たちにとって、 Windows はかなり使いやすい環境になってきたかなと思います。Visual Studio Code からWSL2にアクセスできるRemote - WSL extensionも提供されていますので、 Windows 上の Visual Studio Code から WSL2 上で gdb 起動して mysqld のデバッグするのも容易になりました。これはやるしかないでしょう。
やるしかないですから、備忘録的に書いておきます。
How to build MySQL 8.0.25 on WSL2
Linux なんで、 Windows や Mac と異なり、 MySQL をビルドするのは非常に容易です。なので、ビルド以外の部分のポイントについて重点的に書いておきます。
WSL2をインストールする
公式ドキュメントを参照するなどして、WSL2をインストールをしましょう。
以降、 Ubuntu 20.04 LTS on WSL2 を前提に記述していきます。
MySQL 8.0 GA のソースコードをダウンロード
https://dev.mysql.com/downloads/mysql/
からMySQL Community Server 8.0 GAの最新版の Generic Linux (Architecture Independent), Compressed TAR Archive
Includes Boost Headers をダウンロードします。現時点で最新は mysql-boost-8.0.25.tar.gz です。
1 2 3 4 5 |
$ mkdir -p ~/src/{boost,mysql} $ cd ~/src/mysql $ wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-boost-8.0.25.tar.gz $ tar xvf mysql-boost-8.0.25.tar.gz |
などとやっていただけば良いです。
ちなみに、公式ドキュメントの2.1.4.2 GnuPG を使用した署名確認でgpg --verifyするための手順等書いてありますので、ダウンロードした tar.gz は verify されてもよろしいかと思います。私はダウンロードするたびに verify してます。
CMake等のインストール
1 2 |
$ sudo apt install g++ cmake pkg-config libssl-dev libncurses5-dev gdb |
ひょっとしたらなにかパッケージ足りないかもしれませんが、少なくともこのあたりは必須です。
CMake
1 2 3 4 5 |
$ cd ~/src/mysql/mysql-8.0.25 $ mkdir bld $ cd bld $ cmake .. -DWITH_DEBUG=1 -DWITH_BOOST=../boost |
2021年5月現在、cmakeのDOWNLOAD_BOOSTオプションが機能しない問題があります。MySQL8.0.26で修正されるようです。
私は自分でMySQLビルドするときは Generic Linux (Architecture Independent), Compressed TAR Archiveを使って -DDOWNLOAD_BOOST=1 しており、 OpenGrokでindexingするときは、Generic Linux (Architecture Independent), Compressed TAR Archive
Includes Boost Headersをダウンロードするようにしてたんですが、8.0.26まではIncludes Boost Headersなtar ball を使おうと思っています。
8.0.26 以降では
1 2 |
$ cmake .. -DWITH_DEBUG=1 -DDOWNLOAD_BOOST=1 -DWITH_BOOST=~/src/boost |
で良いでしょう。
make
ここは注意したほうが良いポイントです。
1 2 |
$ make -j 4 |
cmake叩いたらあとは make -j すればいいんですが、 MySQL 8.0 から、ビルドにメモリをかなり食うようになりました。例えば、メモリ32GB積んだ私物のMacBook Pro 16inchで何も考えずに make -j すると、スワップ使うくらいメモリ食います。WSL2上でビルドする場合は、割り当てられるメモリがそこそこ限定されているでしょうから、 make -j 4 とか -j 2 くらいで様子見して、OOM Killer が発動しないか確認しつつビルドされるのがよろしいかなと思います。
mysqld --initialize
とりあえず gdb で動かせれば良いやということで、最小限の初期化だけやってしまいます。
1 2 3 4 5 6 |
$ cd ~/src/mysql/mysql-8.0.25/bld $ mkdir {etc,data} $ echo '[mysqld]' > etc/my.cnf $ echo "basedir=`pwd`" >> etc/my.cnf $ echo "datadir=`pwd`/data" >> etc/my.cnf $ bin/mysqld --defaults-file=etc/my.cnf --initialize |
rootのパスワードは、初期化時のログに出力されます。初期化が終わったら
1 2 |
$ ./bin/mysqld --defaults-file=etc/my.cnf & $ ./bin/mysql -u root -p |
でログインできることを確認し、SET PASSWORDで適当なパスワードに変更するなどして、SHUTDOWNしておきましょう。
余談ですが、以前は、デバッグビルドした mysql client を WSL2 上で起動すると segfault が起きていたのですが、さいきんはそういったこともなくなりました。もし、お手元の環境でビルドした mysql client が segfault するようなら、 Ubuntu付属の mysql client を
1 2 |
$ sudo apt install mysql-client |
して、そちらを使っていただくとよいかもです。
あるいは、さいきんの WSL2 は localhostForwardingで Windows から直接アクセスできるようになりましたから、 MySQL InstallerでWindows用のMySQL Clientインストールして、Windowsから叩くのも良いかもしれませんね(試してないですけど)
あとは
1 2 3 |
$ cd ~/src/mysql/mysql-8.0.25 $ code . |
で Visual Studio Code を起動してみましょう。
c_cpp_properties.json, launch.json
IntelliSense を活用するために、c_cpp_properties.json で includePath や defines の設定をしたり、 Visual Studio Code から gdb 経由で mysqld を起動するために、 launch.json の設定をする必要があります。例えば、私は最小限の設定として、以下のようにしています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
$ cat .vscode/c_cpp_properties.json { "configurations": [ { "name": "Linux", "includePath": [ "${workspaceFolder}/bld/include", "${workspaceFolder}/**" ], "defines": [ "MUTEX_EVENT=1", "MYSQL_SERVER=1", "ENABLED_DEBUG_SYNC=1" ], "compilerPath": "/usr/bin/gcc", "cStandard": "gnu17", "cppStandard": "gnu++14", "intelliSenseMode": "linux-gcc-x64" } ], "version": 4 } $ |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
$ cat .vscode/launch.json { // Use IntelliSense to learn about possible attributes. // Hover to view descriptions of existing attributes. // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 "version": "0.2.0", "configurations": [ { "name": "(gdb) Launch", "type": "cppdbg", "request": "launch", "program": "${workspaceFolder}/bld/bin/mysqld", "args": ["--defaults-file=${workspaceFolder}/bld/etc/my.cnf"], "stopAtEntry": false, "cwd": "${workspaceFolder}", "environment": [], "externalConsole": false, "MIMode": "gdb", "setupCommands": [ { "description": "Enable pretty-printing for gdb", "text": "-enable-pretty-printing", "ignoreFailures": true } ] } ] } $ |
defines の設定をするのが、 Visual Studio と比べてややめんどくさいかなぁと思うところです。
まぁこのへんは毎回コピペで良いかなと思いますので、次に MySQL 8.0.26 がリリースされたら
1 2 |
$ cp -a ~/src/mysql/mysql-8.0.25/.vscode ~/src/mysql/mysql-8.0.26/ |
という感じで使いまわしていくつもりです。
あとはメニューの Run -> Start Debugging で普通にデバッグできます。
おわりに
Windows上で Visual Studio Code から GUI で mysqld のデバッグできるようになったので、画期的に便利になったなぁと、個人的には感じています。
しごとしてると、たまに MySQL の挙動を確認したいことがありますよね。SQLのsyntax的なところは 公式の docker imageですぐに試せますが。
デバッガでちょろっと追いかけたいときは、以前は Macで Visual Studio Code からデバッガで動かしたりしてみたんですが、これからは、わりと WSL2 上でそういったこともできそうだなぁと思うなどしています。