2014-09-23 69 views
-1

我有十幾個表格每10-20秒左右用TRUNCATE表清空,我的php腳本在XAMPP本地機器的shell中運行。MySql表在多個TRUNCATE查詢後隨機消失

不明原因,每隔幾個小時隨機表消失,因此腳本停止。在腳本中沒有查詢會刪除/刪除表格

有趣的是,該表格在主視圖中被刪除,但我仍然可以在左邊的側邊欄中看到它。

當我嘗試重新創建刪除的表,我得到「沒有這樣的表」mysql錯誤。我設法重新創建它的方式是通過從相同的表中複製表「.frm」文件,它將允許我通過sql刪除舊的並重新創建它。

有沒有人遇到這種行爲或知道解釋?這在過去的幾天裏讓我瘋狂......

+1

「隨機表消失」 - 沒有任何隨機發生。總是有一個根本原因。 – 2014-09-23 23:45:00

+0

@MitchWheat我的意思是「隨機表消失」,即每次它是不同的表都會消失,儘管所有表都使用相同的確切函數來執行查詢。我有他們編號,每次它是一個隨機數,所以沒有容易的模式來發現「根情況」 – Acidon 2014-09-23 23:49:30

回答

4

也許你應該考慮不使用truncate進行這種操作。從the reference manual報價:

從邏輯上講,TRUNCATE TABLE類似於DELETE語句刪除所有行,或DROP TABLECREATE TABLE語句序列。爲了實現高性能,它繞過了刪除數據的DML方法。 [...]雖然TRUNCATE TABLE類似於DELETE,但它被歸類爲DDL語句而不是DML語句。它不同於刪除以下方式在MySQL 5.5:

  • 截斷操作刪除並重新創建的表,這是不是刪除行一個接一個,特別是對大表要快得多。

這對於不頻繁的操作可能是件好事。但是你每10-20秒截斷表!我不知道你的腳本是否連續運行,但是如果是這種情況,你的程序的一部分總是試圖將一行插入一個截斷的表中(可能還沒有完全重建)。在我的腦海裏(和我的內心)有很多東西告訴我,如此頻繁地截斷表不是一個好主意。

另一方面......爲什麼地球上每20秒就需要截斷表格!?我只能建議你避免這樣做...創建分區,索引你的表,截斷你的表,當你確定沒有其他進程正在嘗試使用它們...使用DELETE而不是TRUNCATE ... TRUNCATE是爲維護任務,而不是日常操作(這是我的看法)。

+1

感謝這樣一個偉大的詳細的答案,我不知道下降和截斷共享相同的技術,我相信這是造成問題的原因。我每隔幾秒清空表格的原因是因爲它被其他php腳本用於在每一行中存儲整個網頁,這些表的大小很快就會跳到千兆字節,並且無法處理這些數據量,所以我被迫清空並儘可能快地解析數據。一個問題,如果我使用delete而不是另一個腳本同時寫入同一個表 - 在這種情況下會發生什麼? – Acidon 2014-09-24 00:08:20

+0

@Acidon通常的提示:手頭上有參考手冊的副本(如果您覺得這個答案有用,請對其進行投票和/或接受它,如果你想的話)。至於你的第二個問題,它取決於你的具體實現(換句話說,它是不可攀登的細節)。嘗試一下,測試它......事先沒有辦法告訴。 – Barranka 2014-09-24 00:12:24

+0

明白了,我也這麼認爲,非常感謝! – Acidon 2014-09-24 00:17:06