Y-Ken Studio

新しもの好きのデータエンジニアが四方山話をお届けします。

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にて再配布されているMySQLrpmをを使わずに、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