2

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

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

为了解决这个问题,我正在考虑在 Intranet 和 Online 上使用不同范围的手动增量值。

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

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

4

2 回答 2

1

我想出了解决这个问题的方法。

在配置 mysql 服务器自动增量设置的复制时,应调整服务器上的 id 永远不会重叠。例如,如果您复制了 2 台服务器,则一台服务器应仅生成偶数自动增量 ID,而其他仅生成奇数 ID。

这是有关此详细信息的链接。

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

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

于 2013-04-03T09:40:28.043 回答
1

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

例如:

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 ;
于 2013-04-02T14:20:08.630 回答