已经采用了Mysql自动增量ID,但似乎没有写入磁盘

时间:2018-03-27 07:06:25

标签: php mysql triggers

MySQL有一个非常奇怪的问题,我们无法弄明白。所以我需要专家建议来找出严重的问题。我试图提供所有可能的细节。但如果您需要更多信息,可以要求更多信息。

我们在另一个数据库中有一个MySQL表(票证),它从其他数据库表(应用程序数据库)中获取由触发器插入的记录。在进一步介绍之前,让我介绍数据库设计和表结构。

我们有超过600个数据库表与InnoDB引擎具有相似的表模式。

数据库

db_20110624

db_20110706

db_20110825

依旧...... 600 +

和logdb

我们将after_insert和update_trigger写入应用程序数据库表之后。所以一旦从应用程序端插入/更新任何记录,我们就在logdb.tbl1表中得到了一个轨道。 (我们正在管理票务基础队列以进行进一步处理)

有关logdb.tbl1的信息

我们每天约有3到4张缺少记录 表12,273,398(12百万)中的当前记录 我们定期从表中清除1个月大的数据,但是从一个月或15天开始我们就没有清除它。

表格结构:

'serialid', 'bigint(20)', 'NO', 'PRI', NULL, 'auto_increment'

'requestunkid', 'bigint(20)', 'NO', 'MUL', NULL, ''

'fordate', 'date', 'YES', '', NULL, ''

'databasename', 'varchar(255)', 'YES', '', NULL, ''

问题

我们在另一台服务器上有一个进程,它从logdb.tbl1进程中选择数据并将这些行插入另一个数据库服务器。

我们从tickets.channelupdates中选择限制100中的数据并插入到另一个数据库服务器。为了跟踪挂起的队列,我们​​从另一个数据库服务器中找到max(serialid),并从ticket.channelupdates中选择接下来的100条记录。有时它会跳过一些记录来选择。

示例:

| logdb.tbl1 |

serialid

78887794

78887795

78887796

78887797

78887798

78887799

78887800

78887801

78887802

.......

但是当我们运行select时,它会给出一些缺少行的结果..(例如,它给出78887794,78887795,78887796,78887800,78887801,78887802)这里缺少78887797到78887800个记录。但是当我们在一段时间后使用最大数量运行相同的查询时......它会给出准确的结果。这对我们造成了非常严重的问题。由于这种差异,一些记录被忽略了。

请注意,问题是随机的。这种情况经常发生15到20天。此外,我们注意到插入(到tbl1表)和select(从tbl1表)之间有1秒到15秒的间隙。

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

我们终于能够确定问题了。这是因为存储过程中的以下语句。我们使用存储过程插入记录。问题是START和COMMIT之间发生了很多事情。当任何插入发生在另一个表时,它保留了自动增量id。但是在它提交之前不要将它写入磁盘。并且在写入磁盘的下一个id之间执行早于前一个进程的进程。所以现在最大数量差异开始了。

** START TRANSACTION;

.....

COMMIT; **