2

イントラネットとインターネットでホストされている mysql\PHP アプリケーションがあります。両方の mysql サーバーは複製されます。つまり、リアルタイムで同期されます。

主キーとして自動インクリメントIDを持つテーブルがいくつかあります。同期がオフになると、新しいトランザクションに対して、オンライン サーバーとイントラネット サーバーで同じ自動インクリメント値が使用されます。そのため、サーバーが接続されて同期が開始された場合でも。同じ自動インクリメント ID を持つレコードは同期されません。重複しない値を持つ ID は、サーバーが接続されるとすぐに同期されます。

この問題を解決するために、イントラネットとオンラインで異なる範囲の手動インクリメント値を使用することを考えています。

この問題の最善の解決策を提案してください。

また、手動でインクリメント ID を使用する必要がある場合、オンラインとイントラネットで ID を個別に割り当てるための最良の手法またはアルゴリズムは何でしょうか。

4

2 に答える 2

1

できることは2つあります。1 つ目は、ライブ サーバーの開始値を非常に大きな数 (予想される行数よりも大きい) に変更することです。

例えば:

ALTER TABLE tbl AUTO_INCREMENT = 10000;

これで数字が重ならなくなりました。それがオプションでない場合は、間隔を変更できます

SET @@auto_increment_increment=10;

しかし、これは、ある点で重複があることも意味します。インクリメント ステップが 1 のサーバーは、10 行後に 10 ステップに追いつくためです。ただし、1 つのサーバーを 1 でインクリメントを開始し、もう 1 つのサーバーを 2 でインクリメントを開始するように設定し、両方のインクリメント ステップを 2 にすることで、これを回避できます。

それは次のようなものになります

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

重複を防ぐために、2 列の主キーを使用することもできます。これで、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 に答える