2016-12-26 1 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 파일,536,913,632 10

mysql 커맨드 라인 클라이언트를 통해 위의 .sql을 트리거 할 때, 때때로 작동하고 많은 시간을하지 않으며, 동일한 .sql 파일을 계속 5-10 회 실행하면 업데이트가 실행됩니다. 이러한 실행 중 하나에서 영향을 받고 예를 들어 order_id 101 및 SHIPPED 상태의 레코드가 3 개 있고 병합 테이블에서 업데이트를 얻은 경우 주문 상태가 DELIVERED (이상적으로 모든 주문의 상태가 이상적임)로 변경되었다고 할 때가 있습니다. DELIVERED로 변경되었지만 주문과 관련된 행 중 하나 또는 두 개만 업데이트됩니다.하지만 MySQLWorkbench를 통해 동일한 .sql 파일 내용을 실행하면 완벽하게 작동하지만 어리석은 것처럼 보일 수 있습니다. 그러나 이것이 무슨 일입니까? 이 이상한 행동으로 지난 이틀 동안 고생하다

이 동작을 캡처 한 아래 화면 캐스트를 찾으십시오. https://www.youtube.com/watch?v=v2HN-n4V0MI&feature=youtu.be

+0

내가 위와 유사한 SQL을 사용하여 repro 수하려고 준비 테이블이 아닌 참조 할 수 있지만 didn 히 't repro, 업데이 트가 나를 위해 잘 작동합니다. 스키마와 쿼리가 일치하지 않으므로 정확한 SQL을 사용할 수 없습니다. 쿼리에는 스키마에없는 열이 있습니다. 오류를 관찰 한 정확한 스키마/쿼리 집합을 게시 할 수 있습니까? 또한 어떤 버전을 사용하고 있습니까? –

+0

@JackChen MemSQL 버전은 5.5.3이며 오류를 재현하기 위해 여기에서 파일과 스크립트를 찾을 수 있습니다. https://www.dropbox.com/s/ao8viv2wzfoh8a3/memsql_insert_update.zip?dl=0 –

+0

그리고 클러스터 설정은 다음을 사용하고 있습니다. 하나의 마스터이고 2 노예 r3.2xlarge 인스턴스 –

답변

1

스테이징 테이블은 참조 테이블이며 참조 테이블에 대한 쓰기는 클러스터에 비동기 적으로 복제됩니다. 따라서 때때로 업데이트가 예상대로 작동하고 때로는 업데이트가 작동하지 않는 경우가 있습니다.

당신은 참조 테이블

  • 로 작성 후 비트

    • 대기는
  • +0

    고마워 잭, 그것은 동기화 복제를 시도 할 것입니다 –

    +0

    감사합니다 잭, 그것은 동기 복제를 시도 할 것이고, 우리가 몇 가지 테이블 참조를 만든 이유는 사실과 치수의 조각입니다 같은 차원이 아니므로 모든 차원 테이블을 참조로 정의했습니다. –

    +0

    SYNC ON으로 새 스키마를 만들었으며 참조 테이블을 자르고 다시로드 할 때 참조 테이블을 변경하지 않는 문제가 다시 발생합니다 즉시 leafs에 영향을 미침 –