mita2 database life

主にMySQLに関するメモです

MySQL Shell 8.0.34 を CentOS7 でビルドする

MySQL Shell のソースコードCentOS 7 でビルドするのはいろいろ面倒で、以前も記事を書きました。

いつのまにか依存関係が変わったようで、以前の手順ではビルドできなくなってました。 どんどん難易度が上がってく。。。

MySQL Server をビルドする

MySQL Shell をビルドするには、MySQL Server も事前にビルドしておく必要があります。

$ sudo yum install git wget openssl-devel ncurses-devel epel-release \
  http://mirror.centos.org/centos/7/extras/x86_64/Packages/centos-release-scl-2-3.el7.centos.noarch.rpm  \
http://mirror.centos.org/centos/7/extras/x86_64/Packages/centos-release-scl-rh-2-3.el7.centos.noarch.rpm

$ sudo yum install --enablerepo='epel' cmake3 
$ sudo yum install devtoolset-11-gcc*
$ wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.34.tar.gz
$ tar xvfz mysql-8.0.34.tar.gz

全部をビルドする必要はありません。Shell に必要なライブラリだけビルドしましょう。

$ scl enable devtoolset-11 bash

$ cd mysql-8.0.34
$ mkdir bld; cd bld
$ cmake3 -DDOWNLOAD_BOOST=1 -DWITH_BOOST=/tmp/boost -Dprotobuf_BUILD_SHARED_LIBS=OFF ..

$ cmake3 --build . --target mysqlclient
$ cmake3 --build . --target mysqlxclient

必要なライブラリをビルドする

libssh と antlr4 は必要なバージョンのRPMがどこからも提供されていないので、自分でソースからビルドする必要がありました。うはー。

$ sudo yum install libuuid libuuid-devel

$ git clone https://github.com/antlr/antlr4.git
$ git checkout -b v4.10.1 refs/tags/v4.10.1

$ cd runtime/Cpp/

$ mkdir bld; cd bld
$ cmake3 ..
$ make
Install the project...
-- Install configuration: "Release"
-- Up-to-date: /usr/local/include
-- Installing: /usr/local/include/gmock
-- Installing: /usr/local/include/gmock/gmock-actions.h
-- Installing: /usr/local/include/gmock/gmock-cardinalities.h
-- Installing: /usr/local/include/gmock/gmock-function-mocker.h
-- Installing: /usr/local/include/gmock/gmock-matchers.h
-- Installing: /usr/local/include/gmock/gmock-more-actions.h
-- Installing: /usr/local/include/gmock/gmock-more-matchers.h
-- Installing: /usr/local/include/gmock/gmock-nice-strict.h
-- Installing: /usr/local/include/gmock/gmock-spec-builders.h
-- Installing: /usr/local/include/gmock/gmock.h
-- Installing: /usr/local/include/gmock/internal
-- Installing: /usr/local/include/gmock/internal/custom
-- Installing: /usr/local/include/gmock/internal/custom/README.md
-- Installing: /usr/local/include/gmock/internal/custom/gmock-generated-actions.h
-- Installing: /usr/local/include/gmock/internal/custom/gmock-matchers.h
<snip>
$ wget https://git.libssh.org/projects/libssh.git/snapshot/libssh-0.9.2.tar.gz
$ tar xvfz libssh-0.9.2.tar.gz

$ cd libssh-0.9.2
$ mkdir bld; cd bld
$ cmake3 ..
$ make
$ sudo make install
Install the project...
-- Install configuration: ""
-- Installing: /usr/local/lib64/pkgconfig/libssh.pc
-- Installing: /usr/local/lib64/cmake/libssh/libssh-config-version.cmake
-- Installing: /usr/local/include/libssh/callbacks.h
-- Installing: /usr/local/include/libssh/libssh.h
-- Installing: /usr/local/include/libssh/ssh2.h
-- Installing: /usr/local/include/libssh/legacy.h
-- Installing: /usr/local/include/libssh/libsshpp.hpp
-- Installing: /usr/local/include/libssh/sftp.h
-- Installing: /usr/local/include/libssh/server.h
-- Installing: /usr/local/lib64/libssh.so.4.8.3
-- Installing: /usr/local/lib64/libssh.so.4
-- Installing: /usr/local/lib64/libssh.so
-- Installing: /usr/local/lib64/cmake/libssh/libssh-config.cmake
-- Installing: /usr/local/lib64/cmake/libssh/libssh-config-noconfig.cmake

Python 3.8 もビルドします。RH SCL に Python 3.8 のRPMが存在するのですが、それを使おうとすると余計ややこしかったです。

デフォルトの configure オプションだと、mysqlsh コマンドの内部で python module をロードする際に undefined symbol: PyFloat_Type エラーが出ます。--enable-shared して、共有ライブラリありでビルドすると回避できるようです。

$ sudo yum install libffi-devel

$ wget https://www.python.org/ftp/python/3.8.18/Python-3.8.18.tgz
$ tar xvfz Python-3.8.18.tgz
$ cd Python-3.8.18

$ ./configure --enable-shared
$ make
$ sudo make install

MySQL shell に必要な pip モジュールを入れます。

$ LD_LIBRARY_PATH=/usr/local/lib/ pip3.8 install certifi pyYAML

MySQL Shell をビルドする

$ sudo yum install  libcurl libcurl-devel patchelf

$ wget https://dev.mysql.com/get/Downloads/MySQL-Shell/mysql-shell-8.0.34-src.tar.gz
$ tar xvfz mysql-shell-8.0.34-src.tar.gz

cmake3 中 に patchelfPermission denied コケるので、パーミッションを変えて雑に回避しておく。

--   Executing: /usr/bin/patchelf  --remove-rpath;/usr/local/lib64/libantlr4-runtime.so.4.10.1
--   Executing: /usr/bin/patchelf  --set-rpath;$ORIGIN;/usr/local/lib64/libantlr4-runtime.so.4.10.1
patchelf: open: Permission denied

$ sudo chmod 666 /usr/local/lib64/libantlr4-runtime.so.4.10.1 /usr/local/lib64/libssh.so.4.8.3

MySQL Shell の python モードを使えるようにビルドします(HAVE_PYTHON=1)。

$ cd mysql-shell-8.0.34-src
$ mkdir bld; cd bld
$ cmake3  \
  -DMYSQL_BUILD_DIR=$HOME/mysql-8.0.34/bld/ \
  -DMYSQL_SOURCE_DIR=$HOME/mysql-8.0.34/  \
  -DProtobuf_INCLUDE_DIR=$HOME/mysql-8.0.34/extra/protobuf/protobuf-3.19.4/src/ \
  -DBUNDLED_ANTLR_DIR=/usr/local/ \
  -DBUNDLED_SSH_DIR=/usr/local/ \
  -DBUNDLED_PYTHON_DIR=/usr/local/ \
  -DHAVE_PYTHON=1 ..

$ make
$ sudo make install

めでたし、めでたし。

[vagrant@localhost bld]$ mysqlsh
MySQL Shell 8.0.34

Copyright (c) 2016, 2023, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its affiliates.
Other names may be trademarks of their respective owners.

Type '\help' or '\?' for help; '\quit' to exit.
 MySQL  Py >