Building MySQL 8.0.23 on Ubuntu 20.04
Vagrant Box bento/ubuntu-20.04
で MySQL 8.0.23 をビルドした記録。
> cat /etc/lsb-release DISTRIB_ID=Ubuntu DISTRIB_RELEASE=20.04 DISTRIB_CODENAME=focal DISTRIB_DESCRIPTION="Ubuntu 20.04.1 LTS"
何はともあれソースコードを入手する。最初は GitHub から取ろうとしたのだが、MySQL の boost のバージョン指定が厳しく、面倒だったので boost 同梱版のソースを公式からダウンロードした。
wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-boost-8.0.23.tar.gz tar xfv mysql-boost-8.0.23.tar.gz cd mysql-8.0.23/
MySQL Internals Manual の 4.3 Quick How-to-Build Instructions に従って進めていく。yoku さんの ConoHaの上でひたすらMySQLをビルドする簡単なおしごと in 2019年 も参考にした。
何はともあれ cmake がないと始まらないので、それだけ入れてビルドしてみる。
sudo apt-get install cmake
mkdir bld && cd $_ cmake -DWITH_BOOST=../boost .. # cmake -DWITH_BOOST=../boost .. -DCMAKE_BUILD_TYPE=Debug
「XX がない」と言われるので、XX をインストールして再度 cmake -DWITH_BOOST=../boost ..
。cmake が通るまでこれを繰り返す。煩雑になるので過程は省略するが、最終的に↓を実行すれば通るようになる。
sudo apt-get install g++ pkg-config
cmake が通ったことを確認してビルドを実行。MySQL のビルドは時間がかかる。
make -j4
問題なくビルドできたはずだ。以下では、試行錯誤の最中に発見した些細なバグについて解説する。ビルドの方法だけ知りたい場合は読む必要はない。
正しくビルドできていることを確認する意味で、テストを実行してみる。
./mysql-test/mtr --parallel=4
最初はいい感じに動くのだが、テストが依存しているライブラリやコマンドが足りず、一部のテストが落ちる。それらをインストールしてから再実行。
sudo apt-get install libjson-perl unzip zip
./mysql-test/mtr --parallel=4
しかし、main.cast
がまだ通らない。次の diff で落ちているようだ。なお、テストの完全な出力は記事末尾に載せた。
SELECT CAST(TIME'08:09:10' AS YEAR); CAST(TIME'08:09:10' AS YEAR) -2020 +2021 SELECT CAST(TIME'00:00:00' AS YEAR); CAST(TIME'00:00:00' AS YEAR) -2020 +2021
公式ドキュメント によれば、
For a TIME value, return the current year.
とのことなので、SELECT CAST(TIME'08:09:10' AS YEAR);
が2021年現在において、2021
を返すのは正しい振る舞いと考えられる。よって、これはテストがおかしい。一応、それらしきバグレポも上がっている。
MySQL(のテスト)のバグで、すべてのテストを完走させることはできなかったが、ビルド自体は正しくできていると思ってよさそうだ。
vagrant@vagrant:~/mysql-8.0.23/bld > ./mysql-test/mtr main.cast --retry=0 Logging: /home/vagrant/mysql-8.0.23/mysql-test/mysql-test-run.pl main.cast --retry=0 MySQL Version 8.0.23 Checking supported features Using 'all' suites Collecting tests Checking leftover processes Removing old var directory Creating var directory '/home/vagrant/mysql-8.0.23/bld/mysql-test/var' Installing system database Using parallel: 1 ============================================================================== TEST NAME RESULT TIME (ms) COMMENT ------------------------------------------------------------------------------ [ 50%] main.cast [ fail ] Test ended at 2021-01-23 01:40:47 CURRENT_TEST: main.cast --- /home/vagrant/mysql-8.0.23/mysql-test/r/cast.result 2020-12-11 10:42:20.000000000 +0300 +++ /home/vagrant/mysql-8.0.23/bld/mysql-test/var/log/cast.reject 2021-01-23 04:40:47.304244731 +0300 @@ -1760,10 +1760,10 @@ 2010 SELECT CAST(TIME'08:09:10' AS YEAR); CAST(TIME'08:09:10' AS YEAR) -2020 +2021 SELECT CAST(TIME'00:00:00' AS YEAR); CAST(TIME'00:00:00' AS YEAR) -2020 +2021 SELECT CAST(ST_PointFromText('POINT(10 10)') AS YEAR); ERROR HY000: Incorrect arguments to cast_as_year CREATE TABLE t AS SELECT CAST("2010" AS YEAR); mysqltest: Result content mismatch The result from queries just before the failure was: TIMESTAMPADD(MINUTE, 1, CAST(1988 AS YEAR)) NULL Warnings: Warning 1292 Incorrect datetime value: '1988' SELECT CAST(CAST(1988 AS YEAR) AS SIGNED); CAST(CAST(1988 AS YEAR) AS SIGNED) 1988 SELECT CAST(CAST(1988 AS YEAR) AS UNSIGNED); CAST(CAST(1988 AS YEAR) AS UNSIGNED) 1988 SELECT CAST(TIMESTAMP'579-10-10 10:10:10' AS YEAR); CAST(TIMESTAMP'579-10-10 10:10:10' AS YEAR) NULL Warnings: Warning 1292 Truncated incorrect YEAR value: '579' SELECT CAST(STR_TO_DATE('nope','%d-%m-%Y') AS YEAR); CAST(STR_TO_DATE('nope','%d-%m-%Y') AS YEAR) NULL Warnings: Warning 1411 Incorrect datetime value: 'nope' for function str_to_date safe_process[1263073]: Child process: 1263074, exit: 1 - the logfile can be found in '/home/vagrant/mysql-8.0.23/bld/mysql-test/var/log/main.cast/cast.log' [100%] shutdown_report [ pass ] ------------------------------------------------------------------------------ The servers were restarted 0 times The servers were reinitialized 0 times Spent 0.000 of 5 seconds executing testcases Completed: Failed 1/2 tests, 50.00% were successful. Failing test(s): main.cast The log files in var/log may give you some hint of what went wrong. If you want to report this error, please read first the documentation at http://dev.mysql.com/doc/mysql/en/mysql-test-suite.html mysql-test-run: *** ERROR: there were failing test cases