2016-12-26 68 views
0

我们使用的是单节点MemSQL和一切工作正常,但当我们试图将我们的MemSQL设置为使用多节点插入/更新语句行为非常古怪MemSQL奇怪的插入/更新行为

我的表结构像下面,已删除许多列,以保持它短

CREATE /*!90618 REFERENCE*/ TABLE `fact_orderitem_hourly_release_update` 
(
    `order_id` int(11) NOT NULL DEFAULT '0', 
    `customer_login` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL, 
    `warehouse_id` int(11) DEFAULT NULL, 
    `city` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL, 
    `store_id` int(11) DEFAULT NULL, 
    PRIMARY KEY (`order_id`) 
); 

CREATE TABLE `fact_orderitem_hourly_scale` (
    `order_id` int(11) NOT NULL DEFAULT '0', 
    `order_group_id` int(11) NOT NULL DEFAULT '0', 
    `item_id` int(11) NOT NULL, 
    `sku_id` int(11) NOT NULL DEFAULT '0', 
    `sku_code` varchar(45) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL, 
    `po_type` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL, 
    `store_order_id` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL, 
    `bi_last_modified_on` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00.000000', 
    PRIMARY KEY (`item_id`,`sku_id`), 
    /*!90618 SHARD */ KEY `sku_id` (`sku_id`), 
    KEY `idx_fact_orderitem_hourly_lmd` (`bi_last_modified_on`), 
    KEY `idx_fact_orderitem_hourly_ord` (`order_id`), 
    KEY `idx_order_group_id` (`order_group_id`), 
    KEY `idx_store_order_id` (`store_order_id`) 
); 

我负载脚本:

mysql -h$LiveMemSQL_DB -u$LiveMemSQL_USER --password=$LiveMemSQL_PASS -P$LiveMemSQL_PORT --verbose reports_and_summary < /home/titan/brand_catalog/upsert_memsql_orl_update.sql 

Contents of .SQL File : 

--start of .sql file 
    TRUNCATE TABLE reports_and_summary.fact_orderitem_hourly_release_update; 

#Load data into staging 

LOAD DATA LOCAL INFILE '/myntra/redshift/delta_files/live_scale_order_release_upd.txt' INTO TABLE reports_and_summary.fact_orderitem_hourly_release_update LINES TERMINATED BY '\n'; 


#Insert/Update statement 
INSERT INTO reports_and_summary.fact_orderitem_hourly_scale 
(
item_id, 
sku_id, 
customer_login, 
order_status, 
is_realised, 
is_shipped, 
shipping_charge, 
gift_charge, 
warehouse_id, 
city, 
store_id 
) 
select 
fo.item_id, 
fo.sku_id, 
fr.customer_login, 
fr.order_status, 
fr.is_realised, 
fr.is_shipped, 
fr.shipping_charge, 
fr.gift_charge, 
fr.warehouse_id, 
fr.city, 
fr.store_id 
from fact_orderitem_hourly_release_update fr 
join fact_orderitem_hourly_scale fo 
on fr.order_id=fo.order_id 
ON duplicate key update 
customer_login=values(customer_login), 
order_status=values(order_status), 
is_realised=values(is_realised), 
is_shipped=values(is_shipped), 
shipping_charge=values(shipping_charge), 
gift_charge=values(gift_charge), 
warehouse_id=values(warehouse_id), 
city=values(city), 
store_id=values(store_id); 

--End .sql文件

当我触发通过mysql命令行客户端上面的.sql,它的工作原理有时,它没有很多的时间,有的时候,如果我一直执行相同的.sql文件5-10倍,该更新将在其中一个运行中受到影响,有时例如说如果有3个记录,其中有order_id 101和状态为SHIPPED,并且我们在合并表中得到更新,说明订单状态已更改为DELIVERED,理想情况下,所有3个订单的状态应为改为交货,但只有一个或与订单都得到更新相关的行2,但如果我通过My​​SQLWorkbench执行相同的.sql文件内容是工作完全正常,我可能听起来很蠢,但这是发生什么事,我从最后2天疲于应付这种怪异的行为

请查看下面的屏幕截图,其中我捕获了此行为https://www.youtube.com/watch?v=v2HN-n4V0MI&feature=youtu.be

+0

我试着使用上述类似SQL来摄制,但它没没有repro,更新为我工作得很好。由于架构和查询不匹配,我无法使用精确的sql,查询中有不在架构中的列。您可以在观察错误的位置发布一组精​​确的模式/查询吗?另外,你使用的是什么版本? –

+0

@JackChen MemSQL版本5.5.3是,你可以在这里找到的文件和脚本来重现错误https://www.dropbox.com/s/ao8viv2wzfoh8a3/memsql_insert_update.zip?dl=0 –

+0

和群集设置在用是一个主机和两个从r3.2xlarge实例 –

回答

1

您的登台表是参考表,写入引用表的操作将异步复制到集群。这就是为什么有时你的更新按预期工作,有时他们不会。

可以

  • 等待一个位写入参考表
  • 后使临时表中的非参考
+0

感谢杰克,这是有道理的,会尝试同步复制 –

+0

感谢杰克,这是有道理的,会尝试同步复制和我们取得了一定的表引用的理由是,其实和尺寸的碎片是不一样的,所以我们定义为参考 –

+0

我创建了一个新的模式与同步开启,并当过我截断参考表,并重新加载它,我们再次登陆后进入问题,即更改参考表没有得到所有维度表立即影响到叶子 –