今回は、
そこで、
検証環境
第10回 yum, rpmインストールにおけるMySQL 5.
また今回はCentOS 7.
MySQLのソースコードをダウンロードする
今回はyumでインストールしたMySQLを利用する予定ですが、
今回はwgetを使って以下のようにダウンロードしました。
$ wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.22.tar.gz $ ls mysql-5.7.22.tar.gz
ダウンロードしたmysql-5.
ファイルをtarコマンドを使って展開します。
$ tar xzvf mysql-5.7.22.tar.gz $ ls mysql-5.7.22 mysql-5.7.22.tar.gz
mysql-5.
というディレクトリに展開されたことがわかります。
コンパイルをしてみる
それでは、mysql_
を利用します。
mysql_configを使う
mysql_mysql_
コマンドを何もオプションを付けずに実行をすると、
# mysql_config Usage: /usr/bin/mysql_config-64 [OPTIONS] Compiler: GNU 4.8.5 Options: --cflags [-I/usr/include/mysql -m64 ] --cxxflags [-I/usr/include/mysql -m64 ] --include [-I/usr/include/mysql] --libs [-L/usr/lib64/mysql -lmysqlclient -lpthread -lm -lrt -ldl] --libs_r [-L/usr/lib64/mysql -lmysqlclient -lpthread -lm -lrt -ldl] --plugindir [/usr/lib64/mysql/plugin] --socket [/var/lib/mysql/mysql.sock] --port [0] --version [5.7.22] --libmysqld-libs [-L/usr/lib64/mysql -lmysqld -lpthread -lm -lrt -lcrypt -ldl -laio -lnuma] --variable=VAR VAR is one of: pkgincludedir [/usr/include/mysql] pkglibdir [/usr/lib64/mysql] plugindir [/usr/lib64/mysql/plugin]
たとえば、--cflags
オプションを付けた場合、-I/
という文字列が出力されます。
$ mysql_config --cflags -I/usr/include/mysql -m64
直接文字列を打ち込むのではなく、
また、mysql_
が見つからないというエラーが出る場合がありますが、sudo yum install mysql-community-devel
を行ってMySQLの開発用のヘッダやツールをインストールしましょう。
UDFをコンパイルする
さて話を戻しまして、udf_
というソースコードがmysql-5.
ディレクトリに用意されています。こちらを前述のmysql_
と組み合わせて行います。とりあえず、
$ cd mysql-5.7.22/sql $ ls | grep udf locking_service_udf.cc sql_udf.cc sql_udf.h udf_example.cc udf_example.def
今回利用したいudf_
がいることが確認できます。続いてコンパイルを行います。
$ gcc -o udf_example.so udf_example.cc `mysql_config --cflags` -shared -fPIC
ここで利用している-shared
オプションと-fPIC
オプションは、udf_
が生成されていれば大丈夫です。
$ ls | grep udf_example.so udf_example.so
上記のようにlsとgrepを組み合わせて、
UDFを登録する
作成した.so
ファイルを/usr/
に配置します。
$ sudo cp udf_example.so /usr/lib64/mysql/plugin
その後に、
CREATE FUNCTION 関数名 RETURNS 戻り値の型名 SONAME 今回作ったudfのファイル名
といった構文になっております。今回コンパイルを行ったudf_
には7個の関数が同梱されており、
mysql> CREATE FUNCTION lookup RETURNS STRING SONAME 'udf_example.so'; Query OK, 0 rows affected (0.00 sec)
すると、
mysql> select lookup('localhost'); +---------------------+ | lookup('localhost') | +---------------------+ | 127.0.0.1 | +---------------------+ 1 row in set (0.00 sec)
このように、DROP FUNCTION
構文を利用します。
mysql> DROP FUNCTION lookup; Query OK, 0 rows affected (0.00 sec)
削除を実行した後で、
mysql> select lookup('localhost'); ERROR 1046 (3D000): No database selected
エラーになって関数がなくなっていることがわかりました。
今回コンパイルを行ったudf_
には、
まとめ
今回はUDFのコンパイルの方法、