2016-12-26 99 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

我創建了一個新的模式與同步開啓,並當過我截斷參考表,並重新加載它,我們再次登陸後進入問題,即更改參考表沒有得到所有維度表立即影響到葉子 –