MemSQL奇怪的插入/更新行为

时间:2016-12-26 18:53:02

标签: 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);

- 结束.sql文件

当我通过mysql命令行客户端触发上述.sql时,它有时会工作并且它不会很多次,有时如果我连续执行相同的.sql文件5-10次,更新将会生效在其中一个运行中,有时说例如,如果有3条记录,其中order_id 101和状态为SHIPPED,我们在合并表中得到更新,说订单状态已更改为DELIVERED,理想情况下,所有3个订单的状态应更改为已交付,但只有一个或两个与订单关联的行正在更新,但如果我通过My​​SQLWorkbench执行相同的.sql文件内容,它的工作完全正常,我可能听起来很愚蠢,但这就是正在发生的事情,我正在努力过去2天有这种奇怪的行为

请找到以下屏幕投射,我抓住了这种行为https://www.youtube.com/watch?v=v2HN-n4V0MI&feature=youtu.be

1 个答案:

答案 0 :(得分:1)

您的临时表是一个引用表,并且对引用表的写入将异步复制到群集。这就是为什么有时您的更新按预期工作,有时他们不会。

你可以

  • 写入参考表后稍等一下
  • 使登台表不参考