2014-09-23 37 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