今回は、
そこで、
検証環境
第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のコンパイルの方法、