今回は、MySQLを拡張するための仕組み「UDF(User Defined Function)」を作ってみたいと思います。UDFは、文字通りユーザが自由にMySQLに関数を追加するための仕組みになっています。
そこで、今回はMySQLのソースコードにバンドルされているコードを例に、CentOSでのコンパイルの方法やUDFの使い方を説明していきたいと思います。
検証環境
第10回 yum, rpmインストールにおけるMySQL 5.6とMySQL 5.7の違いで紹介された、yumリポジトリを使用したインストールを利用しています。また、MySQLのバージョンは5.7.22を使用しています。つい先日(2018年4月19日)にMySQL 8.0もGAになりましたが、今回は5.7を利用していきます。
また今回はCentOS 7.4上で確認を行っています。
MySQLのソースコードをダウンロードする
今回はyumでインストールしたMySQLを利用する予定ですが、コンパイルするUDFはMySQLのソースコードに入っているものを使います。そのため、まずはじめにMySQLのソースコードをダウンロードします。
今回はwgetを使って以下のようにダウンロードしました。
ダウンロードしたmysql-5.7.22.tar.gz
ファイルをtarコマンドを使って展開します。
mysql-5.7.22
というディレクトリに展開されたことがわかります。
コンパイルをしてみる
それでは、コンパイルをしてみましょう。今回はコンパイルをする際にmysql_config
を利用します。
mysql_configを使う
mysql_configはクライアントをコンパイルするためのコマンドです。今回は、作成するUDFを今あるクライアントの設定と揃えるために利用します。mysql_config
コマンドを何もオプションを付けずに実行をすると、オプションの一覧とそれに対応したオプションが表示されます。
たとえば、今回利用する--cflags
オプションを付けた場合、右の-I/usr/include/mysql -m64
という文字列が出力されます。
直接文字列を打ち込むのではなく、このコマンドを利用することによって、環境の違いなどを吸収することができるようになります。ただし、このコマンドはシェルスクリプトで実装されているため、シェルが実行できる環境に無いと利用できないことに注意してください。
また、mysql_config
が見つからないというエラーが出る場合がありますが、その場合はsudo yum install mysql-community-devel
を行ってMySQLの開発用のヘッダやツールをインストールしましょう。
UDFをコンパイルする
さて話を戻しまして、ダウンロードしたソースコードの中には、UDF用の例としてudf_example.cc
というソースコードがmysql-5.7.22/sql
ディレクトリに用意されています。こちらを前述のmysql_config
と組み合わせて行います。とりあえず、sqlディレクトリに移動をしてファイルを確認してみましょう。
今回利用したいudf_example.cc
がいることが確認できます。続いてコンパイルを行います。
ここで利用している-shared
オプションと-fPIC
オプションは、共有ライブラリを作る時に使うオプションです。コマンドを実行してみて、udf_example.so
が生成されていれば大丈夫です。
上記のようにlsとgrepを組み合わせて、出力されたものが正しく存在するか、確認してみましょう。
UDFを登録する
作成した.so
ファイルを/usr/lib64/mysql/plugin
に配置します。
その後に、UDFを使うために以下のようなコマンドをmysqlコマンドラインクライアントから実行します。
CREATE FUNCTION 関数名 RETURNS 戻り値の型名 SONAME 今回作ったudfのファイル名
といった構文になっております。今回コンパイルを行ったudf_example.cc
には7個の関数が同梱されており、その中で今回は例としてlookup関数を取り上げてみます。
すると、lookup関数が登録されて使用するできるようになります。localhostのIPを引いてみましょう。
このように、ホスト名からIPを引くような関数を追加することができました。ここまでで、関数を新たに追加できるようになりましたが、追加したlookup関数を削除する場合にはどうしたら良いか、気になると思います。関数の削除をしたい場合は、DROP FUNCTION
構文を利用します。
削除を実行した後で、もう一度lookup関数を利用しようとしてみます。
エラーになって関数がなくなっていることがわかりました。
今回コンパイルを行ったudf_example.cc
には、lookup関数以外にも、英単語の綴りから発音に近い文字列を出力するmetaphon関数、引数の平均値をとるmyfunc_double関数、引数の長さを測るmyfunc_int関数、シーケンス番号を発行することができるsequence関数、IPからドメインを引くためのreverse_lookup関数、集約関数のテスト用にavgcost関数が設定されており、それぞれ使うことができます。
まとめ
今回はUDFのコンパイルの方法、追加・実行・削除のそれぞれの方法について学びました。今回説明しきれなかったUDFのプログラムの構成や書き方などは、次に機会がある時に紹介していきたいと思っています。