如何合并使用转储文件创建的同一个表的不同版本

时间:2011-11-27 15:14:43

标签: mysql mysqldump

我在两台不同的计算机上使用相同的数据库,需要保持同步。

当我在一台计算机上完成工作时,我在那时创建了一个数据库的转储文件,所以我可以用另一条指令将其导入到另一台计算机中:

mysqldump -u username -p DataBaseName TableName > Table.dump

我的问题是,当我在某些表中插入元素时,可能会发生他们的主键已经分配给我的另一台计算机上同一个数据库表的元素。

我想知道如何在我创建的转储文件中插入问题How can I merge two MySQL tables?中找到的指令,以便为重复的条目分配新的主键值,而不会丢失表的数据

我想避免创建的转储文件的行为,这将完全删除感兴趣的表的先前版本,如下所示:

DROP TABLE IF EXISTS `TableName`;
CREATE TABLE `TableName` (
    ...
) ENGINE=MyISAM AUTO_INCREMENT=6512 DEFAULT CHARSET=utf8;

3 个答案:

答案 0 :(得分:1)

作为替代方案,您可以使用MySQL的增量和偏移设置,这些设置通常用于自动主从复制,其中数据在不执行mysqldump的情况下进行同步。或者,如果适用于您的情况,您实际上可以设置master到master复制。

在服务器A上,使用以下设置:

auto-increment-offset=1
auto-increment-increment=2

在服务器B上,使用以下设置:

auto-increment-offset=2
auto-increment-increment=2

以下是一个介绍主从复制设置的指南:Dual-Master MySQL 5 Replication Done Right

答案 1 :(得分:1)

您是否尝试过使用REPLACE?

http://dev.mysql.com/doc/refman/5.0/en/replace.html

答案 2 :(得分:0)

您可以考虑使用GUID作为主键(通过uuid功能)。这样,你就不会发生冲突。

任何涉及重新映射冲突的主键的方案如果以相反的方向将数据复制回来可能会导致问题(因为您将在原始数据库中获得两个数据副本,包含旧主键和新主键分别)。此外,如果主键没有足够的意义,可以重新映射(例如,如果它没有从其他链接表中引用),那么考虑是否需要主键。