Skip to content

Instantly share code, notes, and snippets.

@kazeburo
Created January 29, 2014 05:34
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kazeburo/8682403 to your computer and use it in GitHub Desktop.
Save kazeburo/8682403 to your computer and use it in GitHub Desktop.
ON DUPLICATE KEY UPDATE と mroongaでレプリケーションが壊れる件の検証

環境

  • CentOS 6.5
  • MySQL 5.6.15 Oracle rpm
  • mroonga 3.11
  • binlog_formatはMIXED

テーブル

CREATE TABLE article_index (
  id bigint unsigned NOT NULL AUTO_INCREMENT,
  article_id bigint unsigned NOT NULL,
  terms mediumtext,
  publish_datetime datetime NOT NULL,
  created_on datetime NOT NULL,
  PRIMARY KEY (id),
  UNIQUE KEY unique_entry (article_id),
  FULLTEXT KEY terms (terms)
) ENGINE=mroonga DEFAULT CHARSET=utf8mb4

以下の順序でクエリを実行

root@12804 mysql>INSERT INTO article_index(article_id,terms,publish_datetime,created_on)
    ->   VALUES ('2829654','Mroonga 3.12でWプラグマの挙動が変わっています。Wプラグマを使っているSQLはすべて変更しないといけません。3.12にアップグレードするときは注意してください!','2014-01-
28 12:05:10','2014-01-28 12:05:10')
    ->   ON DUPLICATE KEY UPDATE  terms = VALUES(terms),
    ->               publish_datetime = VALUES(publish_datetime);
Query OK, 1 row affected (0.00 sec)

root@12804 mysql>INSERT INTO article_index(article_id,terms,publish_datetime,created_on)
    ->   VALUES ('2829654','Mroonga 3.12でWプラグマの挙動が変わっています。Wプラグマを使っているSQLはすべて変更しないといけません。3.12にアップグレードするときは注意してください!','2014-01-
28 12:05:10','2014-01-28 12:05:10')
    ->   ON DUPLICATE KEY UPDATE  terms = VALUES(terms),
    ->               publish_datetime = VALUES(publish_datetime);
Query OK, 0 rows affected (0.00 sec)

root@12804 mysql>INSERT INTO article_index(article_id,terms,publish_datetime,created_on)
    ->   VALUES ('2829654','Mroonga 3.12でWプラグマの挙動が変わっています。Wプラグマを使っているSQLはすべて変更しないといけません。3.12にアップグレードするときは注意してください!','2014-01-28 12:05:10','2014-01-28 12:05:10')
    ->   ON DUPLICATE KEY UPDATE  terms = VALUES(terms),
    ->               publish_datetime = VALUES(publish_datetime);
Query OK, 0 rows affected (0.00 sec)

ここまでは問題なし

2行目を追加

root@12804 mysql>INSERT INTO article_index(article_id,terms,publish_datetime,created_on)
    ->   VALUES ('3829654','新しめのLWPやFurlの場合、Mozilla::CAを使うからルート証明書の有効期限切れの影響受けないかな','2014-01-25 12:05:10','2014-01-25 12:05:10')
    ->   ON DUPLICATE KEY UPDATE  terms = VALUES(terms),
    ->     publish_datetime = VALUES(publish_datetime);
Query OK, 1 row affected (0.00 sec)

root@12804 mysql>INSERT INTO article_index(article_id,terms,publish_datetime,created_on)
    ->   VALUES ('3829654','新しめのLWPやFurlの場合、Mozilla::CAを使うからルート証明書の有効期限切れの影響受けないかな','2014-01-25 12:05:10','2014-01-25 12:05:10')
    ->   ON DUPLICATE KEY UPDATE  terms = VALUES(terms),
    ->     publish_datetime = VALUES(publish_datetime);
Query OK, 2 rows affected (0.00 sec)

最後、Query OK, 2 rowsとなってここがおかしい。レプリケーションも壊れる。

slaveのエラーは

Last_SQL_Error: Could not execute Update_rows event on table mrooga_repl_test.article_index; Can't find record in 'article_index', Error_code: 1032; handler error HA_ERR_END_OF_FILE; the event's master log mysql-bin.000005, end_log_pos 1892

binlogはこうなってる

$ mysqlbinlog -v --base64-output=DECODE-ROWS mysql-bin.000005
#140129 14:21:34 server id 12804  end_log_pos 1160 CRC32 0xaa88ba54     Query   thread_id=2     exec_time=0     error_code=0
SET TIMESTAMP=1390972894/*!*/;
BEGIN
/*!*/;
# at 1160
#140129 14:21:34 server id 12804  end_log_pos 1235 CRC32 0x037bf1ea     Table_map: `mrooga_repl_test`.`article_index` mapped to number 70
# at 1235
#140129 14:21:34 server id 12804  end_log_pos 1426 CRC32 0xbe576efe     Write_rows: table id 70 flags: STMT_END_F
### INSERT INTO `mrooga_repl_test`.`article_index`
### SET
###   @1=6
###   @2=3829654
###   @3='新しめのLWPやFurlの場合、Mozilla::CAを使うからルート証明書の有効期限切れの影響受けないかな'
###   @4='2014-01-25 12:05:10'
###   @5='2014-01-25 12:05:10'
# at 1426
#140129 14:21:34 server id 12804  end_log_pos 1511 CRC32 0x1acc8320     Query   thread_id=2     exec_time=0     error_code=0
SET TIMESTAMP=1390972894/*!*/;
COMMIT
/*!*/;
# at 1511
#140129 14:21:36 server id 12804  end_log_pos 1595 CRC32 0x2e44399f     Query   thread_id=2     exec_time=0     error_code=0
SET TIMESTAMP=1390972896/*!*/;
BEGIN
/*!*/;
# at 1595
#140129 14:21:36 server id 12804  end_log_pos 1670 CRC32 0xa7ed687a     Table_map: `mrooga_repl_test`.`article_index` mapped to number 70
# at 1670
#140129 14:21:36 server id 12804  end_log_pos 1892 CRC32 0x77c795ef     Update_rows: table id 70 flags: STMT_END_F
### UPDATE `mrooga_repl_test`.`article_index`
### WHERE
###   @1=0
###   @2=0
###   @3=''
###   @4='1970-01-01 00:00:00'
###   @5='1970-01-01 00:00:00'
### SET
###   @1=0
###   @2=0
###   @3='新しめのLWPやFurlの場合、Mozilla::CAを使うからルート証明書の有効期限切れの影響受けないかな'
###   @4='2014-01-25 12:05:10'
###   @5='1970-01-01 00:00:00'
# at 1892
#140129 14:21:36 server id 12804  end_log_pos 1977 CRC32 0xd712d053     Query   thread_id=2     exec_time=0     error_code=0
SET TIMESTAMP=1390972896/*!*/;
COMMIT
/*!*/;
DELIMITER ;
# End of log file
ROLLBACK /* added by mysqlbinlog */;
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment