簡體   English   中英

由事件插入時,MySQL 選擇記錄偶爾會丟失

[英]MySQL select records missing occasionally when inserted by an EVENT

我正在運行事件以從主表中獲取數據並將其插入到Summary表中

我每 2 分鍾運行一次 MySQL 事件,並在我的事件中調用存儲過程以進行從主表到匯總表的一些分組、解析和計算。

但是在選擇 2 分鍾的記錄時,有時會在創建摘要時錯過上次記錄的某個時間

丟失記錄的頻率為 1 天 90-100 條記錄(主表中的 1 天記錄數為 30K)。

MySQL 在存儲過程中選擇查詢:

SELECT ID, COUNT(*) AS TOT_COUNT
FROM CUSTOMER 
WHERE (TIMESTAMP > (DATE_FORMAT((NOW() - INTERVAL 3 MINUTE),"%Y-%m-%d 
%H:%i:00"))
  AND TIMESTAMP <= (DATE_FORMAT((NOW() - INTERVAL 1 MINUTE),"%Y-%m-%d %H:%i:00")))
GROUP BY ID, NAME;

:選擇前2分鍾記錄,跳過當前分鍾記錄

我嘗試更新 select 語句,條件如下(丟失記錄頻率降低到 50%)

SELECT ID, NAME, COUNT(*) AS TOT_COUNT
FROM CUSTOMER 
WHERE (SUBSTRING_INDEX(TIMESTAMP, ':', 2) !=  SUBSTRING_INDEX((NOW()), ':', 2)
  AND SUBSTRING_INDEX(TIMESTAMP,':',2) >= SUBSTRING_INDEX((NOW() - INTERVAL 2 MINUTE),':',2))
GROUP BY ID,NAME;

還嘗試通過在存儲過程中使用以下語句來捕獲異常。

DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
    GET DIAGNOSTICS CONDITION 1 @sqlstate = RETURNED_SQLSTATE, 
    @errno = MYSQL_ERRNO, @text = MESSAGE_TEXT;
    SET @full_error = CONCAT("ERROR ", @errno, " (", @sqlstate, "): ", @text);
    SELECT @full_error;
    INSERT INTO ERRORS_TABLE (Level,Code,Message,INSERT_TMST) VALUES ("ERROR ", @errno, @full_error, now());
END;

未找到事件或存儲過程失敗日志或 MySQL 錯誤日志。 還檢查了空值。

如果我手動為那個錯過的分鍾記錄集手動調用存儲過程,那么它會返回正確的計數。

你能幫我調試這個問題嗎,任何其他完美的選擇查詢來獲取 2 分鍾的記錄,或者我遺漏了什么?

提前致謝

您不能完全依賴准時運行的事件。 你就是不能。 你已經知道如果你這樣做了會發生什么。

您正在嘗試為匯總表中的數據創建所謂的物化視圖 你能做些什么呢? 一些不同的事情。

  1. 您可以使用普通的、非物化的數據視圖。 如果您的表上有正確的索引,則 VIEW 很可能會表現良好。 這是一個強大的解決方案。

  2. 您可以重寫事件中存儲的代碼,以便它處理自上次事件運行以來的所有內容。 為此,您可能需要一個帶有上次運行中使用的 TIMESTAMP 的小型單行表。

  3. 切換到原生支持物化視圖的 RDBMS。 那可能是甲骨文,所以它會花費一大筆錢。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM