gpt4 book ai didi

php - Mysql Auto Increment id 已占用但似乎未写入磁盘

转载 作者:行者123 更新时间:2023-11-29 03:18:38 25 4
gpt4 key购买 nike

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

我们在另一个数据库中有一个 MySQL 表(票证),它通过触发器从其他一些数据库表(应用程序数据库)插入记录。在继续之前,让我介绍一下数据库设计和表结构。

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

数据库

db_20110624

db_20110706

db_20110825

等等....600+

和日志数据库

我们将 after_insert 和 after update_trigger 写入应用程序数据库表。因此,只要从应用程序端插入/更新任何记录,我们就会在 logdb.tbl1 表中找到一个轨道。 (我们正在管理票证基础队列以进行进一步处理)

关于logdb.tbl1的信息

我们每天大约有 3 到 4 条记录在此表中缺失表中的当前记录 12,273,398(1200 万)我们会定期从表中清除 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 表)和选择(从 tbl1 表)之间有 1 秒到 15 秒的间隔。

提前感谢您的帮助。

最佳答案

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

**开始交易;

.....

提交;**

关于php - Mysql Auto Increment id 已占用但似乎未写入磁盘,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49506370/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com