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秒的间隙。
感谢您的帮助。
答案 0 :(得分:0)
我们终于能够确定问题了。这是因为存储过程中的以下语句。我们使用存储过程插入记录。问题是START和COMMIT之间发生了很多事情。当任何插入发生在另一个表时,它保留了自动增量id。但是在它提交之前不要将它写入磁盘。并且在写入磁盘的下一个id之间执行早于前一个进程的进程。所以现在最大数量差异开始了。
** START TRANSACTION;
.....
COMMIT; **