奇怪的 MySQL 复制更新错误 (Magento)
Strange MySQL replication update error (Magento)
MySQL 复制对我来说有点新,但看起来我已经开始工作了,直到出现一些我不明白的错误。
一些背景:我正在将所有数据库(通过 SSL)从 MySQL 5.6.22 服务器复制到 MariaDB 10.0.15 服务器,除了作为大师。它执行了一些查询,但随后 运行 陷入了 Magento 数据库的更新问题。如果我跳过此查询,它只会 运行 进入导致相同错误的类似查询。
这是奴隶状态给我的错误:
Could not execute Update_rows event on table magento_db.log_visitor; Column 'visitor_id' cannot be null, Error_code: 1048; Can't find record in 'log_visitor', Error_code: 1032; Column 'visitor_id' cannot be null, Error_code: 1048; handler error HA_ERR_KEY_NOT_FOUND; the event's master log mysql-bin.000121, end_log_pos 7656
Exec_Master_Log_Pos 是 7215,但我认为这无关紧要,错误出现在下一个查询(/事务块)中。
这是一段(详细的)mysqlbinlog:
COMMIT/*!*/;
# at 7215
#150330 2:19:45 server id 1 end_log_pos 7292 CRC32 0xf975481b Query thread_id=25 exec_time=0 error_code=0
SET TIMESTAMP=1427674785/*!*/;
BEGIN
/*!*/;
# at 7292
# at 7358
#150330 2:19:45 server id 1 end_log_pos 7358 CRC32 0x0312921e Table_map: `magento_db`.`log_url_info` mapped to number 2528
#150330 2:19:45 server id 1 end_log_pos 7497 CRC32 0xe3704a8b Write_rows: table id 2528 flags: STMT_END_F
### INSERT INTO `magento_db`.`log_url_info`
### SET
### @1=12534083 /* LONGINT meta=0 nullable=0 is_null=0 */
### @2='http://www.myshop.com/catalog/category/view/id/29?cat=31&color=22&dir=desc&order=position&price=9-' /* VARSTRING(765) meta=765 nullable=1 is_null=0 */
### @3=NULL /* VARSTRING(765) meta=765 nullable=1 is_null=1 */
# at 7497
# at 7565
#150330 2:19:45 server id 1 end_log_pos 7565 CRC32 0x340012cd Table_map: `magento_db`.`log_visitor` mapped to number 2513
#150330 2:19:45 server id 1 end_log_pos 7656 CRC32 0xd3d2e26f Update_rows: table id 2513 flags: STMT_END_F
### UPDATE `magento_db`.`log_visitor`
### WHERE
### @1=3036630 /* LONGINT meta=0 nullable=0 is_null=0 */
### SET
### @2='deq65v4ks7tgahp2lvih8s74j1' /* VARSTRING(192) meta=192 nullable=0 is_null=0 */
### @3=1427667585 /* TIMESTAMP(0) meta=0 nullable=1 is_null=0 */
### @4=1427667585 /* TIMESTAMP(0) meta=0 nullable=0 is_null=0 */
### @5=12534083 /* LONGINT meta=0 nullable=0 is_null=0 */
### @6=1 /* SHORTINT meta=0 nullable=0 is_null=0 */
# at 7656
# at 7714
#150330 2:19:45 server id 1 end_log_pos 7714 CRC32 0xc1eee09b Table_map: `magento_db`.`log_url` mapped to number 2529
#150330 2:19:45 server id 1 end_log_pos 7770 CRC32 0xf7bcccad Write_rows: table id 2529 flags: STMT_END_F
### INSERT INTO `magento_db`.`log_url`
### SET
### @1=12534083 /* LONGINT meta=0 nullable=0 is_null=0 */
### @2=3036630 /* LONGINT meta=0 nullable=1 is_null=0 */
### @3=1427667585 /* TIMESTAMP(0) meta=0 nullable=0 is_null=0 */
# at 7770
#150330 2:19:45 server id 1 end_log_pos 7801 CRC32 0x51775dd4 Xid = 29537
COMMIT/*!*/;
# at 7801
#150330 2:19:53 server id 1 end_log_pos 7886 CRC32 0xd6d724c7 Query thread_id=26 exec_time=0 error_code=0
SET TIMESTAMP=1427674793/*!*/;
visitor_id
是在 phpMyAdmin 中显示的第一列,而且当我执行 SHOW COLUMNS FROM log_visitor;
时也是如此,所以我猜这个列映射到“@1”(找不到如何验证这一点)。但是当我搜索 visitor_id 3036630 的记录时,它只找到一个。请注意,这不是由于外部查询,当我再次执行 START SLAVE;
时,它会挂起相同的错误。另外,我在从机上尝试了 运行ning mysql_upgrade,但是除了一些警告之外,这没有解决任何问题。
底线是:我不知道如何解释这个错误,我是不是看错了查询?感觉应该不会出错,可能是不兼容吧?
欢迎提出任何建议!
编辑:根据要求,SHOW CREATE TABLE,在执行差异后在两台服务器上看起来相同,除了增量索引:
CREATE TABLE `log_visitor` (
`visitor_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'Visitor ID',
`session_id` varchar(64) NOT NULL COMMENT 'Session ID',
`first_visit_at` timestamp NULL DEFAULT NULL COMMENT 'First Visit Time',
`last_visit_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT 'Last Visit Time',
`last_url_id` bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT 'Last URL ID',
`store_id` smallint(5) unsigned NOT NULL COMMENT 'Store ID',
PRIMARY KEY (`visitor_id`)
) ENGINE=InnoDB AUTO_INCREMENT=3036631 DEFAULT CHARSET=utf8 COMMENT='Log Visitors Table'
slave是通过删除所有数据库创建的(我有过多次尝试),在获取master上的读锁后对所有数据库执行mysqldump,将其导入slave,然后在右侧启动slave位置。它进行了一些查询,当我查看时,它已经遇到了此处描述的更新错误。
看来我找到了解决办法。我曾经 copied/adjusted 给大师一个不错的 my.cnf,其中包括 MySQL 5.6 设置 "binlog_row_image = MINIMAL"。这会导致 binlog 跳过 UPDATE 的 SET 子句中的列,这些列已经在 WHERE 子句中并且未更改。 MariaDB 似乎没有实现此设置,默认的 binlog ROW 格式要求所有字段都有一个值。
MySQL 复制对我来说有点新,但看起来我已经开始工作了,直到出现一些我不明白的错误。
一些背景:我正在将所有数据库(通过 SSL)从 MySQL 5.6.22 服务器复制到 MariaDB 10.0.15 服务器,除了作为大师。它执行了一些查询,但随后 运行 陷入了 Magento 数据库的更新问题。如果我跳过此查询,它只会 运行 进入导致相同错误的类似查询。
这是奴隶状态给我的错误:
Could not execute Update_rows event on table magento_db.log_visitor; Column 'visitor_id' cannot be null, Error_code: 1048; Can't find record in 'log_visitor', Error_code: 1032; Column 'visitor_id' cannot be null, Error_code: 1048; handler error HA_ERR_KEY_NOT_FOUND; the event's master log mysql-bin.000121, end_log_pos 7656
Exec_Master_Log_Pos 是 7215,但我认为这无关紧要,错误出现在下一个查询(/事务块)中。
这是一段(详细的)mysqlbinlog:
COMMIT/*!*/;
# at 7215
#150330 2:19:45 server id 1 end_log_pos 7292 CRC32 0xf975481b Query thread_id=25 exec_time=0 error_code=0
SET TIMESTAMP=1427674785/*!*/;
BEGIN
/*!*/;
# at 7292
# at 7358
#150330 2:19:45 server id 1 end_log_pos 7358 CRC32 0x0312921e Table_map: `magento_db`.`log_url_info` mapped to number 2528
#150330 2:19:45 server id 1 end_log_pos 7497 CRC32 0xe3704a8b Write_rows: table id 2528 flags: STMT_END_F
### INSERT INTO `magento_db`.`log_url_info`
### SET
### @1=12534083 /* LONGINT meta=0 nullable=0 is_null=0 */
### @2='http://www.myshop.com/catalog/category/view/id/29?cat=31&color=22&dir=desc&order=position&price=9-' /* VARSTRING(765) meta=765 nullable=1 is_null=0 */
### @3=NULL /* VARSTRING(765) meta=765 nullable=1 is_null=1 */
# at 7497
# at 7565
#150330 2:19:45 server id 1 end_log_pos 7565 CRC32 0x340012cd Table_map: `magento_db`.`log_visitor` mapped to number 2513
#150330 2:19:45 server id 1 end_log_pos 7656 CRC32 0xd3d2e26f Update_rows: table id 2513 flags: STMT_END_F
### UPDATE `magento_db`.`log_visitor`
### WHERE
### @1=3036630 /* LONGINT meta=0 nullable=0 is_null=0 */
### SET
### @2='deq65v4ks7tgahp2lvih8s74j1' /* VARSTRING(192) meta=192 nullable=0 is_null=0 */
### @3=1427667585 /* TIMESTAMP(0) meta=0 nullable=1 is_null=0 */
### @4=1427667585 /* TIMESTAMP(0) meta=0 nullable=0 is_null=0 */
### @5=12534083 /* LONGINT meta=0 nullable=0 is_null=0 */
### @6=1 /* SHORTINT meta=0 nullable=0 is_null=0 */
# at 7656
# at 7714
#150330 2:19:45 server id 1 end_log_pos 7714 CRC32 0xc1eee09b Table_map: `magento_db`.`log_url` mapped to number 2529
#150330 2:19:45 server id 1 end_log_pos 7770 CRC32 0xf7bcccad Write_rows: table id 2529 flags: STMT_END_F
### INSERT INTO `magento_db`.`log_url`
### SET
### @1=12534083 /* LONGINT meta=0 nullable=0 is_null=0 */
### @2=3036630 /* LONGINT meta=0 nullable=1 is_null=0 */
### @3=1427667585 /* TIMESTAMP(0) meta=0 nullable=0 is_null=0 */
# at 7770
#150330 2:19:45 server id 1 end_log_pos 7801 CRC32 0x51775dd4 Xid = 29537
COMMIT/*!*/;
# at 7801
#150330 2:19:53 server id 1 end_log_pos 7886 CRC32 0xd6d724c7 Query thread_id=26 exec_time=0 error_code=0
SET TIMESTAMP=1427674793/*!*/;
visitor_id
是在 phpMyAdmin 中显示的第一列,而且当我执行 SHOW COLUMNS FROM log_visitor;
时也是如此,所以我猜这个列映射到“@1”(找不到如何验证这一点)。但是当我搜索 visitor_id 3036630 的记录时,它只找到一个。请注意,这不是由于外部查询,当我再次执行 START SLAVE;
时,它会挂起相同的错误。另外,我在从机上尝试了 运行ning mysql_upgrade,但是除了一些警告之外,这没有解决任何问题。
底线是:我不知道如何解释这个错误,我是不是看错了查询?感觉应该不会出错,可能是不兼容吧?
欢迎提出任何建议!
编辑:根据要求,SHOW CREATE TABLE,在执行差异后在两台服务器上看起来相同,除了增量索引:
CREATE TABLE `log_visitor` (
`visitor_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'Visitor ID',
`session_id` varchar(64) NOT NULL COMMENT 'Session ID',
`first_visit_at` timestamp NULL DEFAULT NULL COMMENT 'First Visit Time',
`last_visit_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT 'Last Visit Time',
`last_url_id` bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT 'Last URL ID',
`store_id` smallint(5) unsigned NOT NULL COMMENT 'Store ID',
PRIMARY KEY (`visitor_id`)
) ENGINE=InnoDB AUTO_INCREMENT=3036631 DEFAULT CHARSET=utf8 COMMENT='Log Visitors Table'
slave是通过删除所有数据库创建的(我有过多次尝试),在获取master上的读锁后对所有数据库执行mysqldump,将其导入slave,然后在右侧启动slave位置。它进行了一些查询,当我查看时,它已经遇到了此处描述的更新错误。
看来我找到了解决办法。我曾经 copied/adjusted 给大师一个不错的 my.cnf,其中包括 MySQL 5.6 设置 "binlog_row_image = MINIMAL"。这会导致 binlog 跳过 UPDATE 的 SET 子句中的列,这些列已经在 WHERE 子句中并且未更改。 MariaDB 似乎没有实现此设置,默认的 binlog ROW 格式要求所有字段都有一个值。