murata satoshi
murat****@gmail*****
2017年 2月 11日 (土) 23:46:42 JST
むらたです。お世話になっております。
GroongaMeatupの際に少しだけお話ししたmysqldumpでの不具合を報告します。
(MySQL:5.1.17 / mroonga:6.13 / groonga:6.1.5)
確認している範囲では2点です。
- database毎mysqldumpした場合、テーブル名昇順なので参照先のテーブルが存在しないとエラーになる。
tag(参照先)、items(参照元)のような場合。(これは仕方がない気も。。
-> ERROR 1005 (HY000): refference table [xxxx.tag] is not mroonga table
- もう1点は例を記述します。
よくあるタグ検索用の参照型ベクタカラムを設定します。
mysql> CREATE TABLE tag (
name VARCHAR(10) NOT NULL,
PRIMARY KEY(name)
) ENGINE=Mroonga DEFAULT CHARSET=utf8mb4 COMMENT='default_tokenizer "TokenDelimit"';
mysql> CREATE TABLE items (
id int unsigned AUTO_INCREMENT,
tags VARCHAR(255) COMMENT 'flags "COLUMN_VECTOR", groonga_type "tag"',
PRIMARY KEY(id),
FULLTEXT INDEX ft_items_tags(tags) COMMENT 'table "tag"'
) ENGINE=Mroonga DEFAULT CHARSET=utf8mb4;
mysql> INSERT INTO items (tags) VALUES('mroonga'),('groonga'),('mysql'),('emacs'),('mroonga groonga');
この状態でmysqldump
** mysqldumpで出力されるCREATE TABLE文
------
CREATE TABLE `items` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`tags` varchar(255) DEFAULT NULL COMMENT 'flags "COLUMN_VECTOR", groonga_type "tag"',
PRIMARY KEY (`id`),
FULLTEXT KEY `ft_items_tags` (`tags`) COMMENT 'table "tag"',
CONSTRAINT `tags` FOREIGN KEY (`tags`) REFERENCES `xxxx`.`tag` (`name`) ON DELETE RESTRICT ON UPDATE RESTRICT
) ENGINE=Mroonga AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4;
------
// groonga_typeしてる時点でFOREIGN KEYが追加されているのでこれは正しい。
先にtagテーブルを作成して上記CREATE TABLEを実行
** 実際に作成されるテーブル
mysql> show create table items;
------
CREATE TABLE `items` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`tags` varchar(255) DEFAULT NULL COMMENT 'flags "COLUMN_VECTOR", groonga_type "tag"',
PRIMARY KEY (`id`),
KEY `tags` (`tags`),
FULLTEXT KEY `ft_items_tags` (`tags`) COMMENT 'table "tag"',
CONSTRAINT `tags` FOREIGN KEY (`tags`) REFERENCES `xxxx`.`tag` (`name`) ON DELETE RESTRICT ON UPDATE RESTRICT
) ENGINE=Mroonga AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4;
------
// FOREIGN KEYがあるのでカラムIndex(tags)が作られる(MySQL的には正しいですが...)
** このテーブルにINSERTしようとするとエラー(当然mysqldumpでdumpしたものをloadする場合もエラー)
mysql> INSERT INTO items (id, tags) VALUES(1, 'mroonga');
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (foreign record doesn't exist: <tags>:<"mroonga">)
groongaからschemaを比較すると、エラーになる方はそもそもベクタカラムになっていない等の差異があります。
とりあえずdatabase全体をmysqldumpする場合は、参照型カラムを含むテーブルを省き(--ignore-table)全体dump
省いたテーブルをdrop&createを省いて(--no-create-info --skip-add-drop-table)個別dump
loadする際には、全体load -> CREATE TABLE -> 個別をload とする事で可能です。。
以上になります。
むらた