GA

2023/12/10

MySQL公式のDockerリポジトリがcontainer-registry.oracle.comに引っ越していた

この記事は MySQLのカレンダー | Advent Calendar 2023 の10日目の記事です。昨日は meijik さんの 最新のSQL標準(SQL:2023)とFirebird/MySQL/PostgreSQL | キムラデービーブログ でした。

TL;DR


Before

$ sudo docker pull mysql/mysql-server

After

$ sudo docker pull container-registry.oracle.com/mysql/community-server

これだけ。
イメージビルド用のDockerfileは変わっていないっぽいので、Oracle社ビルドのイメージを使っていたなら大した差はないはず(このDockerfileやentrypoint.shはDocker社ビルドのイメージとはそもそも盛大に違うので、もともとがDocker社ビルドのものだったりすると非互換がある)

ちなみにDocker社ビルドの方はこっち

Oracle社ビルド用のイメージとして俺はこんなエイリアスを用意していて(そもそもMySQLのDockerコンテナはバージョンごとのちょっとした動作確認をするのに便利、くらいにしか使わない)

dmysql ()
{
    sudo docker run -d -P -e MYSQL_ALLOW_EMPTY_PASSWORD=1 -e MYSQL_ROOT_PASSWORD="""" -e MYSQL_ROOT_HOST=""%"" --restart=on-failure mysql/mysql-server:$1
}

このお引越しを経てこうなりました (バージョン番号の判定にまさに 日々の覚書: 明日使えない地味なシェルスクリプト用ワンライナー集 のやつを使っている…)

dmysql ()
{
    version_str="$1";
    [[ -z $version_str ]] && version_str="latest";
    version_int=$(echo $version_str | awk -F"[.-]" '{printf("%d%02d%02d\n", $1, $2, $3)}');
    if [[ $version_str = "latest" || $version_int -ge 80022 ]]; then
        repo="container-registry.oracle.com/mysql/community-server";
    else
        repo="mysql/mysql-server";
    fi;
    docker run -d -P -e MYSQL_ALLOW_EMPTY_PASSWORD=1 -e MYSQL_ROOT_PASSWORD="""" -e MYSQL_ROOT_HOST=""%"" $repo:$1
}

直近の5.7(5.7.44とか)はサポートしてない (そもそも引越し前にも引越し先にもないのでそうならざるを得ない)けどまあ仕方なし…

明日は yyamasaki1 さんです!

2023/12/07

明日使えない地味なシェルスクリプト用ワンライナー集

この記事は MySQLのカレンダー | Advent Calendar 2023 の7日目の記事です。
6日目は けんつ さんの MySQL いい感じにコントリビュートする方法(非公式) - それが僕には楽しかったんです。 でした。


TL;DR

  • なんの変哲もないよく使うワンライナーです。SQLだけでできたり使ったりするものは入っていない気がする

バージョンxxx移行yyy未満、みたいなのをやりたい

  • MySQLは内部的にも メジャーバージョン番号 * 10000 + マイナーバージョン番号 * 100 + リリース番号 みたいな計算式をよく使っているのでそれに倣う
$ mysql -sse "SELECT @@version" | awk -F"[.-]" '{printf("%d%02d%02d\n", $1, $2, $3)}'
$ mysql -sse "SELECT sys.version_major() * 10000 + sys.version_minor() * 100 + sys.version_patch()"

バイナリログだけのサイズを合計したい

$ mysql -sse "SHOW BYNARY LOGS" | awk '{i += $2}END{print i}' | numfmt --to=iec

(番外)リレーログだけのサイズを合計したい

  • SHOW BINARY LOGS みたいなのが無いので、厳密にやろうとすると大変 ( relay_log_basename をたどったりとか)。おとなしく *relay* で引いちゃうのが良いんではないか。
$ ls -l /path/to/datadir/*relay* | awk '{i += $5}END{print i}' | numfmt --to=iec

master_info_repositoryからCHANGE REPLICATION SOURCE TOステートメントを作る

  • 急に perl が出てくるのは awk だとシングルクォートが面倒だったから
$ mysql -sse "SELECT host, port, user_name, user_password, enabled_auto_position FROM mysql.slave_master_info WHERE channel_name = ''" |  perl -nlaE 'printf(qq{CHANGE REPLICATION SOURCE TO source_host = "%s", source_port = %d, source_user = "%s", source_password = "%s", source_auto_position = %d;\n}, @F)'

(番外) master.infoファイルからCHANGE REPLICATION SOURCE TOステートメントを作る

  • cat で取った内容を一度変数に詰めるとspace seperatedな1行に出来ることを利用している

    • ワンライナーじゃない(∩゚д゚)アーアーきこえなーい
  • master.info の並び順は一応ドキュメントに解説されているけれど、将来変わるかも知れないしそもそも master_info_repository=FILE 自体が非推奨になったので微妙。

$ line=$(cat master.info)
$ echo $line | while read dummy dummy dummy master_host master_user master_password master_port dummy ; do
  printf "CHANGE MASTER TO master_host = '%s', master_port = %d, master_user = '%s', master_password= '%s';\n" $master_host $master_port $master_user $master_password
done

ダメなクエリが延々流れてきてCPUが詰まっているのでとにかく来た順番にKILLしたい

  • grep次第で特定のクエリに絞ったり絞らなかったりができるあたりがよく使う所以か
$ mysql -sse "SHOW PROCESSLIST" | grep -v 'system user' | grep -v 'Binlog Dump' | awk -F"\t" -v timelimit=10 '$6 > timelimit && $5 != "Sleep"{print $1}' | while read id ; do
  mysql -e "KILL $id"
done

MySQL 8.0とそれ以降でも mysql_native_passwordのハッシュを知りたい

$ mysql -sse "SELECT CONCAT('*', UPPER(SHA1(UNHEX(SHA1('$raw_password')))));"

read用のVIPでちゃんと分散してるかどうか確かめる

  • forの外側で sort | uniq -cでちゃんと分散してるか数える
$ for n in {1..100}; do
  mysql -h $read_vip -sse "SELECT @@hostname"
done | sort | uniq -c

auto_incrementなカラムで梳きながらDELETEなりUPDATEなりする

$ for ((i=$min; i<=$max; i+=$limit)); do 
  mysql -ve "DELETE FROM t1 WHERE id BETWEEN $i AND $i+$limit AND $original_where_clause"
 sleep $sleep
done

圧縮しながらxtrabackupを取る

  • ファイルリダイレクトでなく ssh "cat - > .." とかにパイプすればリモートにも転送できる
$ xtrabackup -uroot --stream=xbstream --backup | pzstd -c > xtrabackup.xb.zst

圧縮済のxbstreamを展開する

  • ↑の逆パターン
    • カレントディレクトリに色々ぶちまけるのでワーキングディレクトリを作った方が良いと思う
$ pzstd -dc xtrabackup.xb.zst | xbstream -xv

トランザクションがなかなか途切れないテーブルにどうしてもALTER TABLEしたくて1秒までなら何とか我慢しながら成功するまでひたすらリトライする

  • 1秒までの他のクエリのブロッキングは許す(でないといつまでも終わらない)
  • オンラインALTER TABLEは「2回」メタデータロックを取るので、開始前と終了直前どちらでタイムアウトする可能性もある
    • 30分かかるALTER TABLEが終了処理のメタデータロックでタイムアウトしても泣かない
$ while true ; do
  mysql -sse "SET SESSION lock_wait_timeout= 1; ALTER TABLE t1 ADD KEY idx_something(some_column)" || break
  sleep 1
done

バックアップしたりリストアしたりKILLしたりALTER TABLE無限リトライなんてことをしょっちゅうやってるんですねわかります!()

明日は taka_yuki_04 さんです!

2023/12/05

ConoHaの上でひたすらMySQLをビルドする in 2023

この記事は ConoHaのカレンダー | Advent Calendar 2023 と MySQLのカレンダー | Advent Calendar 2023 の5日目の記事です。

去年は CentOS 9 Stream でビルドしたらしい。

今年は Rocky Linux 8, 9 が正式にMySQLのSupported PlatformになったのでRocky Linux 9でやってみる。

(cppを足しておけば Rocky Linux 9でもビルドできた可能性がある)



$ cat /etc/os-release

NAME="Rocky Linux"

VERSION="9.2 (Blue Onyx)"

ID="rocky"

ID_LIKE="rhel centos fedora"

VERSION_ID="9.2"

PLATFORM_ID="platform:el9"

PRETTY_NAME="Rocky Linux 9.2 (Blue Onyx)"

ANSI_COLOR="0;32"

LOGO="fedora-logo-icon"

CPE_NAME="cpe:/o:rocky:rocky:9::baseos"

HOME_URL="https://rockylinux.org/"

BUG_REPORT_URL="https://bugs.rockylinux.org/"

SUPPORT_END="2032-05-31"

ROCKY_SUPPORT_PRODUCT="Rocky-Linux-9"

ROCKY_SUPPORT_PRODUCT_VERSION="9.2"

REDHAT_SUPPORT_PRODUCT="Rocky Linux"

REDHAT_SUPPORT_PRODUCT_VERSION="9.2"

MySQLは折角だから8.2.0を選ぶぜ!

$ wget https://dev.mysql.com/get/Downloads/MySQL-8.2/mysql-boost-8.2.0.tar.gz
$ tar xf mysql-boost-8.2.0.tar.gz
$ mkdir build
$ cd build
$ cmake -DWITH_BOOST=../mysql-8.2.0/boost ../mysql-8.2.0
-bash: cmake: command not found

まずはcmake

$ sudo dnf install -y cmake
$ cmake -DWITH_BOOST=../mysql-8.2.0/boost ../mysql-8.2.0
..
CMake Warning at CMakeLists.txt:397 (MESSAGE):
  Could not find devtoolset compiler/linker in /opt/rh/gcc-toolset-12

CMake Warning at CMakeLists.txt:399 (MESSAGE):
  You need to install the required packages:

   yum install gcc-toolset-12-gcc gcc-toolset-12-gcc-c++ gcc-toolset-12-binutils gcc-toolset-12-annobin-annocheck gcc-toolset-12-annobin-plugin-gcc

CMake Error at CMakeLists.txt:401 (MESSAGE):
  Or you can set CMAKE_C_COMPILER and CMAKE_CXX_COMPILER explicitly.

-- Configuring incomplete, errors occurred!

メッセージの通りgcc, gcc-c++, binutilsとかを突っ込む

$ sudo dnf install -y gcc-toolset-12-gcc gcc-toolset-12-gcc-c++ gcc-toolset-12-binutils gcc-toolset-12-annobin-annocheck gcc-toolset-12-annobin-plugin-gcc

$ cmake -DWITH_BOOST=../mysql-8.2.0/boost ../mysql-8.2.0

..
-- Could NOT find OpenSSL, try to set the path to OpenSSL root folder in the system variable OPENSSL_ROOT_DIR (missing: OPENSSL_CRYPTO_LIBRARY OPENSSL_INCLUDE_DIR)
--
Could not find system OpenSSL
Make sure you have specified a supported SSL version.
Valid options are :
openssl[0-9]+ (use alternative system library)
yes (synonym for system)
</path/to/custom/openssl/installation>

CMake Error at cmake/ssl.cmake:84 (MESSAGE):
  Please install the appropriate openssl developer package.

Call Stack (most recent call first):
  cmake/ssl.cmake:346 (FATAL_SSL_NOT_FOUND_ERROR)
  cmake/ssl.cmake:518 (FIND_SYSTEM_OPENSSL)
  CMakeLists.txt:1831 (MYSQL_CHECK_SSL)

次はopenssl-devel

$ sudo dnf install -y openssl-devel
$ cmake -DWITH_BOOST=../mysql-8.2.0/boost ../mysql-8.2.0
..
CMake Error at cmake/readline.cmake:92 (MESSAGE):
  Curses library not found.  Please install appropriate package,

      remove CMakeCache.txt and rerun cmake.On Debian/Ubuntu, package name is libncurses5-dev, on Redhat and derivates it is ncurses-devel.
Call Stack (most recent call first):
  cmake/readline.cmake:126 (FIND_CURSES)
  cmake/readline.cmake:220 (MYSQL_USE_BUNDLED_EDITLINE)
  CMakeLists.txt:1934 (MYSQL_CHECK_EDITLINE)

ncurses-devel. これはCMaKeCache.txt消してあげないといけないやつ。

$ sudo dnf install -y ncurses-devel
$ rm CMakeCache.txt
$ cmake -DWITH_BOOST=../mysql-8.2.0/boost ../mysql-8.2.0
..
CMake Warning at cmake/rpc.cmake:40 (MESSAGE):
  Cannot find RPC development libraries.  You need to install the required
  packages:

    Debian/Ubuntu:              apt install libtirpc-dev
    RedHat/Fedora/Oracle Linux: yum install libtirpc-devel
    SuSE:                       zypper install glibc-devel

Call Stack (most recent call first):
  cmake/rpc.cmake:96 (WARN_MISSING_SYSTEM_TIRPC)
  plugin/group_replication/libmysqlgcs/cmake/configure.cmake:34 (MYSQL_CHECK_RPC)
  plugin/group_replication/libmysqlgcs/CMakeLists.txt:31 (INCLUDE)

CMake Error at cmake/rpc.cmake:97 (MESSAGE):
  Could not find rpc/rpc.h in /usr/include or /usr/include/tirpc
Call Stack (most recent call first):
  plugin/group_replication/libmysqlgcs/cmake/configure.cmake:34 (MYSQL_CHECK_RPC)
  plugin/group_replication/libmysqlgcs/CMakeLists.txt:31 (INCLUDE)

毎年引っかかるrpc.h

$ sudo dnf install -y libtirpc-devel
Last metadata expiration check: 0:10:10 ago on Mon Dec  4 15:11:45 2023.
No match for argument: libtirpc-devel
Error: Unable to find a match: libtirpc-devel

エラーメッセージの通りにやるとそんなものないと言われる… 去年の自分に助けられ て、crbなるリポジトリにあることが判明。

$ sudo dnf install -y --enablerepo=crb libtirpc-devel
$ cmake -DWITH_BOOST=../mysql-8.2.0/boost ../mysql-8.2.0

..
CMake Warning at cmake/rpc.cmake:29 (MESSAGE):
  Cannot find rpcgen executable.  You need to install the required packages:

    Debian/Ubuntu:              apt install rpcsvc-proto
    RedHat/Fedora/Oracle Linux: yum install rpcgen
    SuSE:                       zypper install glibc-devel

Call Stack (most recent call first):
  plugin/group_replication/libmysqlgcs/cmake/rpcgen.cmake:122 (WARN_MISSING_RPCGEN_EXECUTABLE)
  plugin/group_replication/libmysqlgcs/CMakeLists.txt:50 (INCLUDE)

CMake Error at plugin/group_replication/libmysqlgcs/cmake/rpcgen.cmake:123 (MESSAGE):
  Could not find rpcgen
Call Stack (most recent call first):
  plugin/group_replication/libmysqlgcs/CMakeLists.txt:50 (INCLUDE)

rpcgenと同じものなのかと思ったらrpcgenはrpcgenでいるらしい。

$ sudo dnf install -y --enablerepo=crb rpcgen
$ cmake -DWITH_BOOST=../mysql-8.2.0/boost ../mysql-8.2.0
..
-- Build files have been written to: /home/yoku0825/build

cmake完了。 今年は ~さっさと終わらせたくて~ 奮発して4コア4GBのインスタンスを使ってるので少しは快適か

$ time make -j$(nproc)
..
[ 52%] Building CXX object plugin/group_replication/libmysqlgcs/CMakeFiles/mysqlgcs.dir/src/bindings/xcom/xcom/pax_msg.cc.o
In file included from /home/yoku0825/mysql-8.2.0/plugin/group_replication/libmysqlgcs/src/bindings/xcom/xcom/pax_msg.cc:30:
/home/yoku0825/mysql-8.2.0/plugin/group_replication/libmysqlgcs/src/bindings/xcom/xcom/app_data.h:43:1: error: ‘app_data_ptr’ does not name a type
   43 | app_data_ptr clone_app_data(app_data_ptr a);
      | ^~~~~~~~~~~~
/home/yoku0825/mysql-8.2.0/plugin/group_replication/libmysqlgcs/src/bindings/xcom/xcom/app_data.h:44:1: error: ‘app_data_ptr’ does not name a type
   44 | app_data_ptr clone_app_data_single(app_data_ptr a);
      | ^~~~~~~~~~~~
/home/yoku0825/mysql-8.2.0/plugin/group_replication/libmysqlgcs/src/bindings/xcom/xcom/app_data.h:45:1: error: ‘app_data_ptr’ does not name a type
   45 | app_data_ptr new_app_data();
      | ^~~~~~~~~~~~

..
/home/yoku0825/mysql-8.2.0/plugin/group_replication/libmysqlgcs/src/bindings/xcom/xcom/site_def.h:67:22: warning: ‘node_no_exists’ defined but not used [-Wunused-variable]
   67 | static inline bool_t node_no_exists(node_no n, site_def const *site) {
      |                      ^~~~~~~~~~~~~~
/home/yoku0825/mysql-8.2.0/plugin/group_replication/libmysqlgcs/src/bindings/xcom/xcom/synode_no.h:44:19: warning: ‘group_mismatch’ defined but not used [-Wunused-variable]
   44 | static inline int group_mismatch(synode_no x, synode_no y) {
      |                   ^~~~~~~~~~~~~~
make[2]: *** [plugin/group_replication/libmysqlgcs/CMakeFiles/mysqlgcs.dir/build.make:99: plugin/group_replication/libmysqlgcs/CMakeFiles/mysqlgcs.dir/src/bindings/xcom/xcom/pax_msg.cc.o] Error 1
make[1]: *** [CMakeFiles/Makefile2:9709: plugin/group_replication/libmysqlgcs/CMakeFiles/mysqlgcs.dir/all] Error 2
make: *** [Makefile:166: all] Error 2

real    2m5.571s
user    7m22.443s
sys     0m50.147s

あれ、転けた。。

なんかどうもこれと同じような気がするけど解決方法が全く分からない…。

諦めてRocky Linux 8にすることにする!

改めて。

$ cat /etc/os-release
NAME="Rocky Linux"
VERSION="8.7 (Green Obsidian)"
ID="rocky"
ID_LIKE="rhel centos fedora"
VERSION_ID="8.7"
PLATFORM_ID="platform:el8"
PRETTY_NAME="Rocky Linux 8.7 (Green Obsidian)"
ANSI_COLOR="0;32"
LOGO="fedora-logo-icon"
CPE_NAME="cpe:/o:rocky:rocky:8:GA"
HOME_URL="https://rockylinux.org/"
BUG_REPORT_URL="https://bugs.rockylinux.org/"
ROCKY_SUPPORT_PRODUCT="Rocky-Linux-8"
ROCKY_SUPPORT_PRODUCT_VERSION="8.7"
REDHAT_SUPPORT_PRODUCT="Rocky Linux"
REDHAT_SUPPORT_PRODUCT_VERSION="8.7"

$ sudo dnf install -y cmake gcc-toolset-12-gcc gcc-toolset-12-gcc-c++ gcc-toolset-12-binutils gcc-toolset-12-annobin-annocheck gcc-toolset-12-annobin-plugin-gcc openssl-devel ncurses-devel --enablerepo=powertools libtirpc-devel rpcgen

$ wget https://dev.mysql.com/get/Downloads/MySQL-8.2/mysql-boost-8.2.0.tar.gz
$ tar xf mysql-boost-8.2.0.tar.gz
$ mkdir build
$ cd build

$ cmake -DWITH_BOOST=../mysql-8.2.0/boost ../mysql-8.2.0

$ time make -j$(nproc)

..
[ 13%] Generating xdr_gen/xcom_vp.h, xdr_gen/xcom_vp_xdr.c
cannot find C preprocessor: cpp
/usr/bin/rpcgen: C preprocessor failed with exit code 1
[ 13%] Building CXX object extra/icu/CMakeFiles/icuuc.dir/icu-release-73-1/source/common/ucnv_lmb.cpp.o
cannot find C preprocessor: cpp
/usr/bin/rpcgen: C preprocessor failed with exit code 1
cannot find C preprocessor: cpp
/usr/bin/rpcgen: C preprocessor failed with exit code 1
cannot find C preprocessor: cpp
/usr/bin/rpcgen: C preprocessor failed with exit code 1
cannot find C preprocessor: cpp
/usr/bin/rpcgen: C preprocessor failed with exit code 1
[ 13%] Building CXX object mysys/CMakeFiles/mysys_objlib.dir/my_kdf.cc.o
cannot find C preprocessor: cpp
/usr/bin/rpcgen: C preprocessor failed with exit code 1
cannot find C preprocessor: cpp
/usr/bin/rpcgen: C preprocessor failed with exit code 1
cannot find C preprocessor: cpp
/usr/bin/rpcgen: C preprocessor failed with exit code 1
cannot find C preprocessor: cpp
/usr/bin/rpcgen: C preprocessor failed with exit code 1
cannot find C preprocessor: cpp
/usr/bin/rpcgen: C preprocessor failed with exit code 1
[ 13%] Building CXX object extra/icu/CMakeFiles/icui18n.dir/icu-release-73-1/source/i18n/nortrans.cpp.o
cannot find C preprocessor: cpp
/usr/bin/rpcgen: C preprocessor failed with exit code 1
cannot find C preprocessor: cpp
/usr/bin/rpcgen: C preprocessor failed with exit code 1
[ 13%] Building CXX object plugin/group_replication/libmysqlgcs/CMakeFiles/mysqlgcs.dir/src/bindings/xcom/xcom/pax_msg.cc.o
In file included from /home/yoku0825/mysql-8.2.0/plugin/group_replication/libmysqlgcs/src/bindings/xcom/xcom/pax_msg.cc:30:
/home/yoku0825/mysql-8.2.0/plugin/group_replication/libmysqlgcs/src/bindings/xcom/xcom/app_data.h:43:1: error: 'app_data_ptr' does not name a type
   43 | app_data_ptr clone_app_data(app_data_ptr a);
      | ^~~~~~~~~~~~

..

もしかして cannot find C preprocessor: cpp を見落としてた?

$ sudo dnf install cpp
$ time make -j$(nproc)
..

違った。 なんかrpcgenをもう一度やってない気がしたのでビルドディレクトリを綺麗にしてもう一度makeしてみる。

$ rm -r *
$ cmake -DWITH_BOOST=../mysql-8.2.0/boost ../mysql-8.2.0
$ make -j$(nproc)
..
[100%] Building CXX object unittest/gunit/CMakeFiles/merge_large_tests-t.dir/__/__/storage/example/ha_example.cc.o
[100%] Linking CXX executable ../../runtime_output_directory/merge_large_tests-t
[100%] Built target merge_large_tests-t

上手くいったじゃん…。

ということはcppを足してからやり直せばRocky Linux 9でも上手くいくかも知れない。初回で見落として繰り返してしまったか…。

けど、それは来年にでもやるとして今年もお疲れさまでした。

2023/11/21

MySQL 8.0.35で旧McAfeeのmysql-auditをビルドしてみる

【2023/11/21 15:58】タイトルが8.0.32だったけど8.0.35でした…

TL;DR

  • ビルドしてみただけ。動作確認はしていない

  • MySQL 8.0.35はあらかじめビルドしてある


そのまま素直にビルドできなくなっているのでパッチを3つ用意した


$ git clone git@github.com:yoku0825/mysql-audit.git

$ cd mysql-audit/

$ git checkout support_8035

$ bash bootstrap.sh

bootstrap.sh: line 2: autoreconf: command not found

autoreconfがない…Oracle Linux 8では autoconf パッケージらしい(最後に明示的にインストールしたのはだいぶ前なのでパッケージ名がどうだったか覚えてない…)


$ cat /etc/os-release

NAME="Oracle Linux Server"

VERSION="8.8"

$ dnf provides */bin/autoreconf

..

autoconf-2.69-27.el8.noarch : A GNU tool for automatically configuring source code
Repo        : ol8_appstream
Matched from:
Filename    : /usr/bin/autoreconf

autoconf-2.69-29.el8.noarch : A GNU tool for automatically configuring source code
Repo        : ol8_appstream
Matched from:
Filename    : /usr/bin/autoreconf

$ sudo dnf install autoconf

今度は aclocal がないって怒られた。

$ bash bootstrap.sh
autoreconf: Entering directory `.'
autoreconf: configure.ac: not using Gettext
autoreconf: running: aclocal  --output=aclocal.m4t
Can't exec "aclocal": No such file or directory at /usr/share/autoconf/Autom4te/FileUtils.pm line 326.
autoreconf: failed to run aclocal: No such file or directory

$ dnf provides */bin/aclocal
..
automake-1.16.1-6.el8.noarch : A GNU tool for automatically creating Makefiles
Repo        : ol8_appstream
Matched from:
Filename    : /usr/bin/aclocal

automake-1.16.1-7.el8.noarch : A GNU tool for automatically creating Makefiles
Repo        : ol8_appstream
Matched from:
Filename    : /usr/bin/aclocal

$ sudo dnf install automake

その次はlibtoolが無い。

$ bash bootstrap.sh
..
configure.ac:83: error: possibly undefined macro: AC_PROG_LIBTOOL
      If this token and others are legitimate, please use m4_pattern_allow.
      See the Autoconf documentation.
autoreconf: /usr/bin/autoconf failed with exit status: 1

$ sudo dnf install libtool

取り敢えずbootstrapまで終わった。

$ bash bootstrap.sh
autoreconf: Entering directory `.'
autoreconf: configure.ac: not using Gettext
autoreconf: running: aclocal --force
autoreconf: configure.ac: tracing
autoreconf: running: libtoolize --copy --force
libtoolize: putting auxiliary files in AC_CONFIG_AUX_DIR, 'config-aux'.
libtoolize: copying file 'config-aux/ltmain.sh'
libtoolize: Consider adding 'AC_CONFIG_MACRO_DIRS([m4])' to configure.ac,
libtoolize: and rerunning libtoolize and aclocal.
libtoolize: Consider adding '-I m4' to ACLOCAL_AMFLAGS in Makefile.am.
autoreconf: running: /usr/bin/autoconf --force
autoreconf: running: /usr/bin/autoheader --force
autoreconf: running: automake --add-missing --copy --force-missing
configure.ac:82: installing 'config-aux/compile'
configure.ac:7: installing 'config-aux/config.guess'
configure.ac:7: installing 'config-aux/config.sub'
configure.ac:41: installing 'config-aux/install-sh'
configure.ac:41: installing 'config-aux/missing'
src/Makefile.am: installing 'config-aux/depcomp'
autoreconf: Leaving directory `.'

configure スクリプトの中身はいつも --help で見る派。よくあるパターンでソースコードの場所を指定する。

$ ./configure --help

..

$ mkdir /home/yoku0825/audit_plugin
$ ./configure --with-mysql=/home/yoku0825/mysql/src/mysql-8.0.35 --with-mysql-plugindir=/home/yoku0825/audit_plugin
..
checking for mysql source code... configure: error: Failed to find required header file include/mysql_version.h in /usr/mysql/src/mysql-8.0.35, check the path and make sure you've run './configure ..<options>.. && cd include && make' in MySQL 5.1 sources dir or 'cmake . && make' in MySQL 5.5 sources dir.

ソースコードのディレクトリじゃなくてビルドしたディレクトリが必要だったらしい。 (8.0からインソースビルドするにはMySQLのcmakeに -DFORCE_INSOURCE_BUILD=ON が必要)

$ ./configure --with-mysql=/home/yoku0825/mysql/src/build_8.0.35  --with-mysql-plugindir=/home/yoku0825/audit_plugin
..
checking for mysql source code... configure: error: Failed to find required header file include/my_dir.h in /usr/mysql/src/build_8.0.35, check the path and make sure you've run './configure ..<options>.. && cd include && make' in MySQL 5.1 sources dir or 'cmake . && make' in MySQL 5.5 sources dir.

また違うファイルがつかめずに転けた。これインソースビルドしないとダメなんだろうか…。ということでインソースビルドしたディレクトリを用意。

$ ./configure --with-mysql=/home/yoku0825/mysql/src/insource_build_8.0.35/ --with-mysql-plugindir=/home/yoku0825/audit_plugin
..
Version: 1.0.0-99999 Symbol version: 1_0_0_99999
no

checking that generated files are newer than configure... done
configure: creating ./config.status
config.status: creating Makefile
config.status: creating src/Makefile
config.status: creating yajl/Makefile
config.status: creating yajl/src/Makefile
config.status: creating udis86/Makefile
config.status: creating udis86/libudis86/Makefile
config.status: creating include/_config.h
config.status: executing depfiles commands
config.status: executing libtool commands

/usr/bin/rm: cannot remove 'libtoolT': No such file or directory
configure: CPPFLAGS:  -g -O2 -DDBUG_OFF -DNDEBUG -Werror -Wall -DMYSQL_AUDIT_PLUGIN_VERSION='"1.0.0"' -DMYSQL_AUDIT_PLUGIN_REVISION='"99999"' '-DMYSQL_AUDIT_PLUGIN_SYMBOL_VERSION()=extern const char audit_plugin_version_1_0_0_99999'

configureは成功した。

$ make
..
Making all in udis86
make[1]: Entering directory '/home/yoku0825/git/mysql-audit/udis86'
Making all in libudis86
make[2]: Entering directory '/home/yoku0825/git/mysql-audit/udis86/libudis86'
python ./opgen.py
  File "./opgen.py", line 259
    print "error: no mnemonic given in <instruction>."
                                                     ^
SyntaxError: Missing parentheses in call to 'print'. Did you mean print("error: no mnemonic given in <instruction>.")?
make[2]: *** [Makefile:662: itab.c] Error 1
make[2]: Leaving directory '/home/yoku0825/git/mysql-audit/udis86/libudis86'
make[1]: *** [Makefile:371: all-recursive] Error 1
make[1]: Leaving directory '/home/yoku0825/git/mysql-audit/udis86'
make: *** [Makefile:426: all-recursive] Error 1

print ".." が print("..") でなければならないのはPython3のアレだとして、切り分けのためにPython 2.7に取り替えてみた。

$ python
Python 3.6.8 (default, Jun 14 2023, 10:42:30)

$ sudo dnf install python2
$ sudo alternatives --config python

There are 4 programs which provide 'python'.

  Selection    Command
-----------------------------------------------
*  1           /usr/libexec/no-python
   2           /usr/bin/python3.9
 + 3           /usr/bin/python3
   4           /usr/bin/python2

Enter to keep the current selection[+], or type selection number: 4

$ python --version
Python 2.7.18

$ make
..
/usr/mysql/src/insource_build_8.0.35/sql/query_term.h:630:12: error: 'if constexpr' only available with -std=c++17 or -std=gnu++17 [-Werror]
         if constexpr (visit_leaves == VL_VISIT_LEAVES)                                                                                                                                                                     ^~~~~~~~~                                                                                                   

cc1plus: all warnings being treated as errors
make[1]: *** [Makefile:480: hot_patch.lo] Error 1
make[1]: Leaving directory '/home/yoku0825/git/mysql-audit/src'
make: *** [Makefile:426: all-recursive] Error 1

エラーが変わったのでどうやらこの opgen.py はこれで良い(?)らしい。新しいのは -std=c++17 で対処できそうなのでconfigureしなおし。

$ CPPFLAGS="-std=c++17" ./configure --with-mysql=/home/yoku0825/mysql/src/insource_build_8.0.35/ --with-mysql-plugindir=/home/yoku0825/audit_plugin
$ make
..
/home/yoku0825/git/mysql-audit/pcre/missing: line 81: aclocal-1.15: command not found
WARNING: 'aclocal-1.15' is missing on your system.
         You should only need it if you modified 'acinclude.m4' or
         'configure.ac' or m4 files included by 'configure.ac'.
         The 'aclocal' program is part of the GNU Automake package:
         <http://www.gnu.org/software/automake>
         It also requires GNU Autoconf, GNU m4 and Perl in order to run:
         <http://www.gnu.org/software/autoconf>
         <http://www.gnu.org/software/m4/>
         <http://www.perl.org/>
make[2]: *** [Makefile:1357: aclocal.m4] Error 127
make[2]: Leaving directory '/home/yoku0825/git/mysql-audit/pcre'
make[1]: *** [Makefile:715: ../pcre/libpcre.la] Error 2
make[1]: Leaving directory '/home/yoku0825/git/mysql-audit/src'
make: *** [Makefile:426: all-recursive] Error 1

今更aclocal-1.15を欲しがられる。boostrap.shの時点で言ってくれてもいいのよ…。

$ /usr/bin/aclocal --version
aclocal (GNU automake) 1.16.1
Copyright (C) 2018 Free Software Foundation, Inc.
License GPLv2+: GNU GPL version 2 or later <https://gnu.org/licenses/gpl-2.0.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Tom Tromey <tromey@redhat.com>
       and Alexandre Duret-Lutz <adl@gnu.org>.

ちなみにこれCentOS7だとaclocal-1.13なのでやっぱり嫌がられる。

$ sudo ln -s /usr/bin/aclocal-1.16 /usr/bin/aclocal-1.15
$ sudo ln -s /usr/bin/automake-1.16 /usr/bin/automake-1.15

1.13 -> 1.15へのリンクは憚られたけど、1.16 -> 1.15なら互換性あるかなと軽く思い込んでシンボリックリンクで済ませてしまう()

$ make
..
libtool: link: rm -fr .libs/libaudit_plugin.lax
libtool: link: ( cd ".libs" && rm -f "libaudit_plugin.la" && ln -s "../libaudit_plugin.la" "libaudit_plugin.la" )
make[1]: Leaving directory '/home/yoku0825/git/mysql-audit/src'
make[1]: Entering directory '/home/yoku0825/git/mysql-audit'
make[1]: Nothing to be done for 'all-am'.
make[1]: Leaving directory '/home/yoku0825/git/mysql-audit'

$ make install
..

$ ll /home/yoku0825/audit_plugin/
total 17040
-rw-r--r--. 1 yoku0825 yoku0825 12445670 Nov 21 04:57 libaudit_plugin.a
-rwxr-xr-x. 1 yoku0825 yoku0825      996 Nov 21 04:57 libaudit_plugin.la
lrwxrwxrwx. 1 yoku0825 yoku0825       24 Nov 21 04:57 libaudit_plugin.so -> libaudit_plugin.so.0.0.0
lrwxrwxrwx. 1 yoku0825 yoku0825       24 Nov 21 04:57 libaudit_plugin.so.0 -> libaudit_plugin.so.0.0.0
-rwxr-xr-x. 1 yoku0825 yoku0825  4994296 Nov 21 04:57 libaudit_plugin.so.0.0.0

出来上がった。

$ bash ./offset-extract/offset-extract.sh /usr/mysql/8.0.35/bin/mysqld
//offsets for: /usr/mysql/8.0.35/bin/mysqld (8.0.35)
{"8.0.35","d9bdda3fe1822230d5b5d265b9359ffc", 9496, 9536, 4952, 6436, 1288, 0, 0, 32, 64, 160, 1376, 9636, 6056, 4248, 4256, 4260, 7720, 1576, 32, 8680, 8720, 8704, 12880, 140, 664, 320},

あとはこれで.soファイルをコピーしてmy.cnfを編集してINSTALL PLUGINしたりすれば一応動きそう