読者です 読者をやめる 読者になる 読者になる

愛と勇気と缶ビール

ふしぎとぼくらはなにをしたらよいか

MySQL::Sandboxで作った環境にpluginをぶち込む

最近になってようやくMySQL::SandboxでlocalにMySQLのsandbox環境を作って、「マジ便利だなぁ、Perl使ってない人も使うべしなツールだなぁ」という気分になっております。

で、今回はせっかくなのでMySQL::Sandboxで作った環境でより色々なことを試せるようにQ4MやHandlerSocketを入れてやるぜ、という記事です。

http://search.cpan.org/~gmax/MySQL-Sandbox-3.0.25/lib/MySQL/Sandbox.pm#sbtool_-o_plugin

この辺ちょっと読めば「sbtool -o plugin を使うんやな」ということは誰にでもわかるのですが、実際にやってみないと「じゃあlibqueue_engine.soはどこに置いてたらいいの!」というような細かい部分がわからないので、その辺のメモです。

ちなみにこの作業メモは、「MySQL 5.1.58をhomebrew経由でソースこみで持ってきて、そこから敢えて自前ビルドしてQ4MとHandlerSocket入れて、自前ビルドした場所のpathを指定して make_sandbox_from_source でsandboxを作った」というちょっと特殊な環境下におけるものなので、そのままやっても同じ結果が得られるとは限りません。ただ、だいたいのノリは分かると思うので、これを応用すれば異なる環境でもいけると思います。


上記cpan.orgのページにも「sbtool -o pluginには--source_dirと--pluginの2つの引数がいるよ」と書いてあるので、実際のコマンドは次のような感じになります。

sbtool -o plugin --source_dir ~/sandboxes/rsandbox_mysql-5_1_58 --plugin q4m
sbtool -o plugin --source_dir ~/sandboxes/rsandbox_mysql-5_1_58 --plugin handlersocket

さらに、このコマンドがちゃんと成功するためには以下の条件を満たす必要があります

  • ~/sandboxes/plugin.conf に、--plugin {plugin_name} で指定する {plugin_name} に対応したエントリが必要
  • MySQL::Sandboxが、「pluginの.soはここにあるはず」と思っているpathに然るべき.soが置いてある

plugin.confの書き方

1つ目の設定ファイルは、パッと見オレオレ書式に見えますが実際はPerl scriptとしてパースできる何かです。
何か色々できるようなのですが、Q4MとHandlerSocketに関してはsql_commandsだけでいけそうなので他は飛ばしました。
また、minimum_versionとかも適当です。とりあえず入ればいい、という判断です。

デフォで色々入っているところに、以下のようなエントリを追加します

q4m =>    {
    minimum_version => '5.1.45',
    all_servers =>
        {
        operation_sequence => [qw(stop options_file start sql_commands )],
        options_file =>
            [
            ],
        sql_commands => 
            [
                'INSTALL PLUGIN queue SONAME "libqueue_engine.so";',
                'CREATE FUNCTION queue_wait RETURNS INT SONAME "libqueue_engine.so";',
                'CREATE FUNCTION queue_end RETURNS INT SONAME "libqueue_engine.so";',
                'CREATE FUNCTION queue_abort RETURNS INT SONAME "libqueue_engine.so";',
                'CREATE FUNCTION queue_rowid RETURNS INT SONAME "libqueue_engine.so";',
                'CREATE FUNCTION queue_set_srcid RETURNS INT SONAME "libqueue_engine.so";',
                'CREATE FUNCTION queue_compact RETURNS INT SONAME "libqueue_engine.so";',
            ],
        }
    },
handlersocket =>    {
    minimum_version => '5.1.45',
    all_servers =>
        {
        operation_sequence => [qw(stop options_file start sql_commands )],
        options_file =>
            [
            ],
        sql_commands => 
            [
                'INSTALL PLUGIN handlersocket SONAME "handlersocket.so";',
            ],
        }
    },

.soの置き場所

上記設定だけを書いてsbtool -o plugin を実行すると、僕の環境だと「~/work/mysql/mysql-5.1.58/5.1.58/lib/mysql/plugin/ 以下にお前の言ってる.soがねぇよ」と怒られました。このpathはMySQL::Sandboxでsandboxを作った時の条件にある程度依存すると思うので、どこに置いたらいいのかは各自の環境で調べてください。また、環境の作り方によっては既に.soが然るべきpathに置いてある状態になっている可能性もあります。

僕の場合は、どうやらQ4M, HandlerSocketをローカルのMySQLに入れた時の関係で .so たちが /usr/local/Cellar/mysql51/5.1.58/lib/mysql/plugin にインストールされていたので、MySQL::Sandboxちゃんが言っているpathにそれらをコピーして対応しました。

install

上記2つの条件を満たした上で、

sbtool -o plugin --source_dir ~/sandboxes/rsandbox_mysql-5_1_58  --plugin q4m
sbtool -o plugin --source_dir ~/sandboxes/rsandbox_mysql-5_1_58  --plugin handlersocket

を実行すると、指定したSQLが ~/sandboxes/rsandbox_mysql-5_1_58 下にある全てのnodeで発行されて、うまいことpluginがinstallできます。


ここまで書いて気づいたんですが、別にMySQL::Sandboxの指定する方法に従わずに自分でぶち込んだ方がラクな気もしますね。まあいいか。sandboxを何度も消したり作ったりする可能性がある場合はこっちでやっておいた方が多分ラクなのではないかと。