在同步的mysql服务器上设置手动增量值

时间:2013-04-02 14:12:57

标签: php mysql

我有一个在Intranet和Internet上托管的mysql \ PHP应用程序。两个mysql服务器都被复制,即实时同步。

我有一些表具有自动增量ID作为主键。当同步关闭时,对于新事务,在线以及Intranet服务器上使用相同的自动增量值。 即使服务器连接并同步开始;具有相同自动增量ID的记录不会获得同步。具有非重叠值的ID会在服务器连接后立即同步。

要解决此问题,我正在考虑在Intranet和在线上使用不同范围的手动增量值。

请建议,这个问题的最佳解决方案是什么。

此外,如果我必须使用手动增量ID,那么在线上和内部网上分别指定ID的最佳技术或算法是什么。

2 个答案:

答案 0 :(得分:1)

你可以做两件事。第一种方法是将实时服务器的起始值更改为一个非常高的数字(高于预期的行数)

EG:

ALTER TABLE tbl AUTO_INCREMENT = 10000;

现在这些数字不会重叠。如果这不是一个选项,您可以使用

更改间隔
SET @@auto_increment_increment=10;

但这也意味着一度存在重叠。因为增量步长为1的服务器将赶上10后的步骤..你猜对了...... 10行! 但是你可以通过设置一个服务器以1开始递增而另一个服务器加2来绕过这个,然后使两者都有2的递增步骤。

这会产生类似

的东西
intranet 1, 3, 5, 7, 9
live 2, 4, 6, 8, 10

您还可以使用双列主键来防止重复。现在你有一个自动增量字段和一个varchar字段(live和intr),这是你唯一的密钥。

CREATE TABLE `casetest`.`manualid` (
    `id` INT( 10 ) NOT NULL AUTO_INCREMENT ,
    `server` VARCHAR( 4 ) NOT NULL DEFAULT 'live',
    `name` INT NOT NULL ,
    PRIMARY KEY ( `id` , `server` )
) ENGINE = MYISAM ;

答案 1 :(得分:1)

我找到了解决这个问题的方法。

在配置mysql服务器的复制时,应调整自动增量设置,使服务器上的ID永远不会重叠。例如,如果您有2台服务器被复制,则一台服务器应该只生成自动增量ID和其他只有奇数ID。

以下是有关详细信息的链接。

http://jonathonhill.net/2011-09-30/mysql-replication-that-hurts-less/

更新两台服务器上的设置解决了这个问题。