避免在 MySQL 服务器之间移动数据时自动递增 ID 冲突


Avoiding auto-increment ID collisions when moving data between MySQL servers

所以情况是,我将有两台或多台"插入"机器,我的 Web 应用程序只是将我们要登录的数据插入到机器中(它们都在负载均衡器后面)。每隔几个小时,计算机将一个接一个地与负载均衡器断开连接,并将其信息上传到"主"数据库计算机中,该计算机应具有我们正在收集的所有数据的相对最新版本。

最初我打算使用 mysqldump,但发现您无法指定命令不获取我拥有的 auto_increment id 列(这会导致主键冲突)。我看到另一篇文章建议使用临时表将数据放入然后删除列,但"插入"机器的规格非常低,数据量可能在 50,000 行左右相当可观。除了以编程方式一次获取 x 行并将它们插入远程"master"数据库之外,还有更简单的方法可以做到这一点吗?目前我在"插入"机器上安装了 php。

感谢您的投入。

难道您不希望主数据库记录的每个记录与从属数据库具有相同的主键吗?否则,这可能会导致查询将根据其所在的计算机生成不同结果的问题。

如果需要避免冲突的任意主键,请考虑删除自动递增 ID 并构造一个保证对每个服务器上的每条记录都是唯一的 ID。例如,您可以将 unix 时间(以微秒为单位)与每个服务器不同的标识符连接起来。一个稍微懒惰的解决方案是连接时间 + 一个随机的 10 位数字或其他东西。PHP 的 uniqid() 函数会自动执行类似操作。

如果您不打算使用该 ID,则只需将其从表中删除即可。没有规则说每个表都必须有一个主键。如果不使用它,但要对有关插入每条记录的时间的信息进行编码,请改为添加时间戳列(并且不要将其设为键)。