2013-04-02 36 views
2

我有一個mysql \ PHP應用程序託管在Intranet和Internet上。兩個mysql服務器都被複制,即實時同步。在同步的mysql服務器上設置手動增量值

我有一些表有自動增量id作爲主鍵。當同步關閉時,對於新的事務,在聯機以及內聯網服務器上使用相同的自動增量值。因此,即使服務器連接並開始同步,具有相同自動增量ID的記錄不會同步。服務器連接後,不重疊的值會很快同步。

要解決此問題,我正考慮在Intranet和聯機上使用具有不同範圍的手動增量值。

請建議,什麼可能是這個問題的最佳解決方案。

此外,如果我必須去手動增量ID,什麼是最好的技術或算法分別在聯機和Intranet上分配ID。

回答

1

有兩件事你可以做。第一是在活動服務器的啓動值更改爲一個非常高的數字(高於行預計數)

EG:

ALTER TABLE tbl AUTO_INCREMENT = 10000; 

現在的數字不會重疊。如果這不是一個選項,您可以更改間隔

SET @@auto_increment_increment=10; 

但這也意味着有一個重疊點。因爲增量步長爲1的服務器會跟上10之後的步驟..你猜對了10行! 但是你可以通過設置2臺服務器從1開始的增量和其他繞過這個,然後使這兩個有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 ; 
+0

我認爲由於複製查詢「ALTER TABLE tbl AUTO_INCREMENT = 10000;」由於同步,在線啓動的內容也將在Intranet上覆制。 – rkmourya

+0

是的,如果內聯網服務器將獲得超過10000行,那麼它將被複制。那就是爲什麼我提到使用你不期望的真正高價值(EG:1.000。000) 更新了重複鍵的解決方案 –

+0

對於兩臺服務器,增量爲2,偏移量爲1和2的工作正常:) –

1

我想出瞭解決這個問題的辦法。

配置mysql服務器的自動增量設置的複製時應該進行調整,以便服務器上的id不會重疊。示例如果您有2個服務器複製一臺服務器應該只生成偶數自動增量ID和其他唯一的奇數ID。

這是此鏈接的詳細信息。

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

更新既解決了這個問題,在服務器上設置。

+0

另請參閱:http://dev.mysql.com/doc/refman/5.0/en/replication-options-master.html#sysvar_auto_increment_increment –

+0

您也可以使用UUID –