MySQL の INSTALL PLUGIN に失敗する時の処方箋(mroonga-1.20編)
MySQLにストレージプラグインを登録しようとした際、予期せぬエラーが起きる事があります。
mroonga の事例を用いて、その原因と解消法を紹介します。
Case.1: API version for STORAGE ENGINE plugin is too different
mysql> INSTALL PLUGIN groonga SONAME 'ha_groonga.so'; ERROR 1126 (HY000): Can't open shared library 'ha_groonga.so' (errno: 0 API version for STORAGE ENGINE plugin is too different)
原因:異なる(おそらく古い)MySQL向けにコンパイルされたプラグインをMySQLに読み込ませた事によるエラーです。
解決法:そのプラグインが推奨するMySQLのバージョンを利用するか、プラグインを再コンパイルしましょう。
Case.2: errno: 13 undefined symbol: ○○○
mysql> INSTALL PLUGIN groonga SONAME 'ha_groonga.so'; ERROR 1126 (HY000): Can't open shared library '/usr/lib/mysql/plugin/ha_groonga.so' (errno: 13 undefined symbol: _db_pargs_)
原因:Case.1と同様、組み合わせの不一致によるものです。
解決法:そのプラグインが推奨するMySQLのバージョンを利用するか、プラグインを再コンパイルしましょう。
mroongaに限って言えば、groonga-repositoryにて再配布されているMySQLのrpmをを使わずに、remi等の外部リポジトリを利用してインストールすると、このエラーが起きます。
※ mysql-groonga-0.4.2で発生していたエラーを引用しました
Case.3: Can't find symbol '○○○' in library
mysql> INSTALL PLUGIN groonga SONAME 'ha_mroonga.so'; ERROR 1127 (HY000): Can't find symbol 'groonga' in library
原因:プラグイン名の指定を間違えてます。
解決法:.soファイルに対応した名前を用いて下さい。
Case.4: Duplicate entry '○○○' for key 'PRIMARY'
mysql> INSTALL PLUGIN groonga SONAME 'ha_groonga.so'; ERROR 1062 (23000): Duplicate entry 'mroonga' for key 'PRIMARY'
原因:プラグインの管理テーブル(mysql.plugin)に不整合が起きています。
解決法:該当テーブルの調整を行う必要があります。少々手間が掛かるため、次の項にて解説します。
Case.4 の解決法
Case.4のMySQLのプラグイン管理テーブルに不整合が発生した場合の解決法を紹介します。
実はこちら、mroonga-1.2.0のリリースノートに以下の気になる事象が記載されていたので、意図的に不整合を起こし、復旧を行った記録です。
> 今のmroongaのRPMの作りがあまりよくなくて"yum remove"を忘れるとプラグイン管理テーブル(?)が壊れてしまいます。
> http://mroonga.github.com/ja/blog/2012/01/29/release.html
さて、順を追って見てみましょう。
インストール時に出たエラー
カジュアルに「yum upgrade mysql-mroonga」と実行してしまうと、インストール中に以下のエラーが出ます。
/usr/bin/mysql -u root -e " INSTALL PLUGIN mroonga SONAME 'ha_mroonga.so'; CREATE FUNCTION last_insert_grn_id RETURNS INTEGER soname 'ha_mroonga.so'; " ERROR 1062 (23000) at line 1: Duplicate entry 'mroonga' for key 'PRIMARY'
プラグイン状況を確認
登録に失敗しているので、もちろん一覧には出ません。
mysql> show engines; +--------------------+---------+----------------------------------------------------------------+--------------+------+------------+ | Engine | Support | Comment | Transactions | XA | Savepoints | +--------------------+---------+----------------------------------------------------------------+--------------+------+------------+ | MRG_MYISAM | YES | Collection of identical MyISAM tables | NO | NO | NO | | CSV | YES | CSV storage engine | NO | NO | NO | | MyISAM | YES | MyISAM storage engine | NO | NO | NO | | BLACKHOLE | YES | /dev/null storage engine (anything you write to it disappears) | NO | NO | NO | | MEMORY | YES | Hash based, stored in memory, useful for temporary tables | NO | NO | NO | | InnoDB | DEFAULT | Supports transactions, row-level locking, and foreign keys | YES | YES | YES | | ARCHIVE | YES | Archive storage engine | NO | NO | NO | | PERFORMANCE_SCHEMA | YES | Performance Schema | NO | NO | NO | | FEDERATED | NO | Federated MySQL storage engine | NULL | NULL | NULL | +--------------------+---------+----------------------------------------------------------------+--------------+------+------------+ 9 rows in set (0.00 sec) mysql> show plugins; +-----------------------+----------+--------------------+---------+---------+ | Name | Status | Type | Library | License | +-----------------------+----------+--------------------+---------+---------+ | binlog | ACTIVE | STORAGE ENGINE | NULL | GPL | | mysql_native_password | ACTIVE | AUTHENTICATION | NULL | GPL | | mysql_old_password | ACTIVE | AUTHENTICATION | NULL | GPL | | MRG_MYISAM | ACTIVE | STORAGE ENGINE | NULL | GPL | | MyISAM | ACTIVE | STORAGE ENGINE | NULL | GPL | | MEMORY | ACTIVE | STORAGE ENGINE | NULL | GPL | | CSV | ACTIVE | STORAGE ENGINE | NULL | GPL | | InnoDB | ACTIVE | STORAGE ENGINE | NULL | GPL | | INNODB_TRX | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_LOCKS | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_LOCK_WAITS | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_CMP | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_CMP_RESET | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_CMPMEM | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_CMPMEM_RESET | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | PERFORMANCE_SCHEMA | ACTIVE | STORAGE ENGINE | NULL | GPL | | BLACKHOLE | ACTIVE | STORAGE ENGINE | NULL | GPL | | FEDERATED | DISABLED | STORAGE ENGINE | NULL | GPL | | ARCHIVE | ACTIVE | STORAGE ENGINE | NULL | GPL | | partition | ACTIVE | STORAGE ENGINE | NULL | GPL | +-----------------------+----------+--------------------+---------+---------+ 20 rows in set (0.00 sec)
プラグイン管理テーブルの内容を確認
「Duplicate entry」と言われているので、mysqlの管理DBのpluginテーブルの内容を確認してみましょう。
残骸が残っていますね。
mysql> select * from mysql.plugin; +---------+---------------+ | name | dl | +---------+---------------+ | mroonga | ha_mroonga.so | +---------+---------------+ 1 row in set (0.00 sec)
余計なデータを削除
SUPER権限があれば消せるので、さくっとDELETE文を発行します。
mysql> delete from mysql.plugin where name = 'mroonga'; Query OK, 1 row affected (0.00 sec)
プラグインの再登録
再度 INSTALL PLUGIN を掛けると、問題なく入ります。
mysql> INSTALL PLUGIN mroonga SONAME 'ha_mroonga.so'; CREATE FUNCTION last_insert_grn_id RETURNS INTEGER soname 'ha_mroonga.so'; Query OK, 0 rows affected (0.01 sec)
Query OK, 0 rows affected (0.00 sec)
インストール確認
無事、プラグインの登録に成功しました。
mysql> show engines; +--------------------+---------+----------------------------------------------------------------+--------------+------+------------+ | Engine | Support | Comment | Transactions | XA | Savepoints | +--------------------+---------+----------------------------------------------------------------+--------------+------+------------+ | MRG_MYISAM | YES | Collection of identical MyISAM tables | NO | NO | NO | | CSV | YES | CSV storage engine | NO | NO | NO | | MyISAM | YES | MyISAM storage engine | NO | NO | NO | | BLACKHOLE | YES | /dev/null storage engine (anything you write to it disappears) | NO | NO | NO | | MEMORY | YES | Hash based, stored in memory, useful for temporary tables | NO | NO | NO | | InnoDB | DEFAULT | Supports transactions, row-level locking, and foreign keys | YES | YES | YES | | mroonga | YES | CJK-ready fulltext search, column store | NO | NO | NO | | PERFORMANCE_SCHEMA | YES | Performance Schema | NO | NO | NO | | FEDERATED | NO | Federated MySQL storage engine | NULL | NULL | NULL | | ARCHIVE | YES | Archive storage engine | NO | NO | NO | +--------------------+---------+----------------------------------------------------------------+--------------+------+------------+ 10 rows in set (0.00 sec)
最後に
mroonga-1.2.0へのアップグレード時にmysql-groongaのアンインストールを忘れても上記手順でリカバリ出来ますが、
groongaストレージエンジンで作成したテーブルのmysqldump及びdrop tableを忘れた場合はどうにもなりません。
該当テーブルは「unknown storage engine 'groonga'」となり、削除も参照も出来なくなります。
その場合には再度古いバージョンに戻して、mysqldumpとdrop tableを実行し、アップグレードを行う必要があります。
それでは、良いストレージプラグインライフをお過ごし下さい。
参考サイト
http://www.howtoforge.com/sphinx-as-mysql-storage-engine-sphinxse