[groonga-dev,02676] ベクターカラム適用DBをダンプファイルから正常に復元する方法

Back to archive index

Kimura A a.kim****@live*****
2014年 8月 21日 (木) 19:55:50 JST


木村です。いつもお世話になっています。

Windows版Mroongaでベクターカラムを使ったDBを作成し、いったんMySQLDumpしてからインポートした場合に、ベクターカラムによる検索が機能しなくなってしまい困っています。
以下、「mroongaでベクターカラムを使ってタグ検索を実現するには」の例に従って再現手順を書いてみます。
http://qiita.com/groonga/items/f41cd8cfbe7bd158d5da

記事との違いは、以下の3点です。
◯テーブル名は小文字に統一:以前Windows環境で何かトラブルが起きたことがあったので。
◯「ENGINE=mroonga」を加筆:InnoDBになってしまうため。
◯インデックス用テーブルtagsに「1_」を前置:MySQLDumpファイルからのインポート時に、tags(1_tags)がbugsより先に生成されるようにするため。

まずtestデータベース内に、1_tagsおよびbugsテーブルを作成します。

use test;

CREATE TABLE 1_tags (
  name VARCHAR(64) PRIMARY KEY
) DEFAULT CHARSET=utf8
  COLLATE=utf8_bin
  ENGINE=mroonga
  COMMENT='default_tokenizer "TokenDelimit"';

CREATE TABLE bugs (
  id INT PRIMARY KEY AUTO_INCREMENT,
  tags TEXT COMMENT 'flags "COLUMN_VECTOR", type "1_tags"',
  FULLTEXT INDEX(tags)
) DEFAULT CHARSET=utf8
  ENGINE=mroonga;

レコードを挿入し、
  
INSERT INTO bugs (tags) VALUES ("Linux MySQL groonga");
INSERT INTO bugs (tags) VALUES ("mroonga");
INSERT INTO bugs (tags) VALUES ("groonga mroonga");

検索してみると、正常に2件ヒットします。

SELECT mroonga_command("select bugs --query tags:@mroonga --limit 10 --output_columns id,tags");

この段階で、testデータベースをMySQLDumpすると、ダンプファイルは以下のようになります(前後のコメント行のみ省略)。


──────────

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;

--
-- Table structure for table `1_tags`
--

DROP TABLE IF EXISTS `1_tags`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `1_tags` (
  `name` varchar(64) COLLATE utf8_bin NOT NULL,
  PRIMARY KEY (`name`)
) ENGINE=mroonga DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='default_tokenizer "TokenDelimit"';
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `1_tags`
--

LOCK TABLES `1_tags` WRITE;
/*!40000 ALTER TABLE `1_tags` DISABLE KEYS */;
INSERT INTO `1_tags` VALUES ('Linux'),('MySQL'),('groonga'),('mroonga');
/*!40000 ALTER TABLE `1_tags` ENABLE KEYS */;
UNLOCK TABLES;

--
-- Table structure for table `bugs`
--

DROP TABLE IF EXISTS `bugs`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `bugs` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `tags` text COMMENT 'flags "COLUMN_VECTOR", type "1_tags"',
  PRIMARY KEY (`id`),
  FULLTEXT KEY `tags` (`tags`),
  CONSTRAINT `tags` FOREIGN KEY (`tags`) REFERENCES `1_tags` (`name`) ON DELETE RESTRICT ON UPDATE RESTRICT
) ENGINE=mroonga AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `bugs`
--

LOCK TABLES `bugs` WRITE;
/*!40000 ALTER TABLE `bugs` DISABLE KEYS */;
INSERT INTO `bugs` VALUES (1,'Linux MySQL groonga'),(2,'mroonga'),(3,'groonga mroonga');
/*!40000 ALTER TABLE `bugs` ENABLE KEYS */;
UNLOCK TABLES;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;

/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;

──────────


続いて、インポート実験のためにtest2データベースを準備し、DBを切り替えます。

use test2;

そしてダンプファイルを「source ~.sql」という形でインポートしようとすると、以下のようなエラーが発生します。

mroonga can't use FOREIGN_KEY during different database tables
Table 'test2.bugs' doesn't exist

そこで、CONSTRAINT節から「`test`.」を除去して再度インポートすると、今度は以下のようなエラーが発生します。

You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '` (`name`) ON DELETE RESTRICT ON UPDATE RESTRICT) ENGINE=mroonga AUTO_INCREMENT'

ここでどうすべきか迷ったのですが、考えてみると「mroongaでベクターカラムを使ってタグ検索を実現するには」の解説では、テーブル生成時にCONSTRAINT節など存在しなかったことを思い出しました。
なので、このくだりはMroongaの自動処理に委ねるべき箇所なのかもしれない、と憶測して、試みにCONSTRAINT節(と直前のカンマ)をまるまる削ってみると、インポートはひとまず完走しました。
しかし、そのDBに対して

SELECT mroonga_command("select bugs --query tags:@mroonga --limit 10 --output_columns id,tags");

としてみても、ヒット件数は0になってしまいます。
試しに、1_tagsへのレコード挿入が明示的に行われないように(bugsへのレコード挿入時に自動実行されるように)するために、ダンプファイルから以下の行を除去してインポートし直してもみましたが、やはりヒット件数は0のままです。

INSERT INTO `1_tags` VALUES ('Linux'),('MySQL'),('groonga'),('mroonga');


この問題について、タグ検索がうまくいかない理由ももとよりですが、以下の3点を教えていただけないでしょうか?

◯上掲のような経緯でタグ検索が不可能になったDBを復旧させる方法
◯インポート前に、同様の問題を起こさないようにMySQLDumpファイルを編集する方法
◯同様の問題を起こさない、Mroongaの標準的ダンプ(バックアップ)方法

お忙しいところすみませんが、どなたかどうぞよろしくお願いしますm(_ _)m
 		 	   		  



groonga-dev メーリングリストの案内
Back to archive index