Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在同步mysql服务器上设置手动增量值_Php_Mysql - Fatal编程技术网

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

Php 在同步mysql服务器上设置手动增量值,php,mysql,Php,Mysql,我在intranet和internet上有一个mysql\PHP应用程序。两个mysql服务器都是复制的,即实时同步的 我有一些表的主键是自动递增id。当同步关闭时,对于新事务,在线服务器和intranet服务器上使用相同的自动增量值。 因此,即使服务器连接并开始同步;具有相同自动增量id的记录不同步。具有非重叠值的ID会在服务器连接后立即同步 为了解决这个问题,我正在考虑在intranet和online上使用不同范围的手动增量值 请建议,什么可能是这个问题的最佳解决方案 另外,如果我必须使用手

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

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

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

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


另外,如果我必须使用手动增量ID,那么在联机和intranet上分别分配ID的最佳技术或算法是什么。第一种方法是将live server的起始值更改为非常高的数字(高于预期的行数)

例如:

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

SET @@auto_increment_increment=10;
但这也意味着在某一点上存在重叠。因为在..之后,增量步骤为1的服务器将赶上步骤为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 ;

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

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

这是关于这个的详细信息的链接


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

我假设由于复制查询“ALTER TABLE tbl AUTO_INCREMENT=10000;”而在线触发的设置也会由于同步而在intranet上复制。是的,如果intranet服务器中的行数超过10000行,则它将被复制。这就是为什么我提到使用一个你不期望的非常高的值(例如:员工为1.000.000)更新为两台服务器的重复密钥解决方案,增量为2,偏移量为1和2可以正常工作:)但这与5和10没有实际区别,尽管数字会增加得更快参见:
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 ;