2016-11-29 6 views
1

linuxからWindowsマシンにmysqlを移行しています。私はマッピングテーブルを使用している更新クエリは、WindowsとLinuxで異なる結果を与えている。 私は問題を再現するための手順と私が得た結果を提供しました。WindowsとLinuxのmysqlの結果が異なります

は、Linuxで次の手順に従います。

  1. は、マッピングテーブル

    を使用してテーブルに

    CREATE TABLE `buildmapping` ( 
    `ver` varchar(36) DEFAULT NULL, 
    `build` varchar(36) DEFAULT NULL, 
    `branchname` varchar(36) DEFAULT NULL, 
    `buildminor` varchar(36) DEFAULT NULL, 
    UNIQUE KEY `bmap` (`ver`,`build`,`branchname`,`buildminor`), 
    KEY `ak` (`ver`), 
    KEY `br` (`branchname`), 
    KEY `bi` (`build`) 
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1 ; 
    
    CREATE TABLE `s_Last7days` ( 
    `ver` varchar(36) DEFAULT NULL, 
    `build` varchar(36) DEFAULT NULL, 
    `branchname` varchar(36) DEFAULT NULL, 
    `buildminor` varchar(36) DEFAULT NULL 
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1; 
    
  2. 挿入が必要なデータ

    Insert into buildmapping values ('1522','105','release_01','682'); 
    Insert into buildmapping values ('1384','105','release_01','682');  
    Insert into buildmapping values ('1090','105','release_01','682'); 
    Insert into s_Last7days values ('0','105','release_01','682'); 
    
  3. アップデート事実を必要の作成します

    update s_Last7days b , buildmapping c 
    set b.ver=c.ver 
    where b.ver=0 
    and b.Build=c.build 
    and b.BuildMinor=c.buildminor 
    and b.branchname=c.branchname; 
    
  4. 検証データ

    select * from s_Last7days; 
    
    +------+-------+------------+------------+ 
    | ver | build | branchname | buildminor | 
    +------+-------+------------+------------+ 
    | 1522 | 105 | release_01 | 682  | 
    +------+-------+------------+------------+ 
    
  5. は、Linuxサーバからのダンプを取る:

    mysqldump -uxxxxx -pxxxxxx -hxxxxx databasename buildmapping > buildmapping_bk1128.sql 
    
  6. SSHのWindowsサーバへのファイル

フォローしますWindowsサーバーの以下の手順:

  1. Windowsでテーブルを復元します。

  2. 必要なテーブルを作成します

    CREATE TABLE `s_Last7days` ( 
    `ver` varchar(36) DEFAULT NULL, 
    `build` varchar(36) DEFAULT NULL, 
    `branchname` varchar(36) DEFAULT NULL, 
    `buildminor` varchar(36) DEFAULT NULL 
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1; 
    
  3. (Iは、MySQL Workbenchを使用)挿入は

    update s_Last7days b , buildmapping c 
    set b.ver=c.ver 
    where b.ver=0 
    and b.Build=c.build 
    and b.BuildMinor=c.buildminor 
    and b.branchname=c.branchname; 
    
  4. 検証データをマッピングテーブルを使用して

    Insert into s_Last7days values ('0','105','release_01','682'); 
    
  5. アップデート事実をデータを必要と

    select * from s_Last7days; 
    
    +------+-------+------------+------------+ 
    | ver | build | branchname | buildminor | 
    +------+-------+------------+------------+ 
    | 1090 | 105 | release_01 | 682  | 
    +------+-------+------------+------------+ 
    

私は両方のサーバーが同期になりたいです。誰かがこの問題について私を助けてくれますか?

+2

あなた 'buildmapping'テーブルは' branchname'と 'buildminor'に一致する複数の行を持っています。 WindowsとLinuxが別の順序でそれらを取得しているように見えます。 –

+0

その場合(私はすばやくスキャンした)、あなたがあなたのロジックを台無しにしてしまったことを意味します。 – Drew

+2

問題は、毎回同じ順序で行が返されると仮定しているということです。行の順序を保証する唯一の方法は、ORDER BYを含めることです。 –

答えて

0

ORDER BY句を指定せずに指定した結果セットの行は、予期しないの順序で返されることがSQLの特徴です。これは、ランダムの順番で返されているというようなものです。しかし、問題は、通常は前回と同じ順序で返されます。は、そうでないときまでです。このようなものが本当にランダムなものだった場合、Linux上のこのデータベースのような欠陥は、誰かがそれを検出して修正する可能性が低くなります。

この場合、結果セットは次のとおりです。

select c.ver 
    from s_Last7days b , buildmapping c 
where b.ver=0 
    and b.Build=c.build 
    and b.BuildMinor=c.buildminor 
    and b.branchname=c.branchname; 

verという3つの異なる値が返されることに注意してください。更新でこの結果セットを使用すると、結果セットの各値に対して3回、行が3回更新されます。最後に来るのは、執着するものです。

Windowsで実行しているMySQLサーバの意味が、と異なることがあります。これは、Linuxで実行しているサーバよりも予期しないです。

の2つのサーバーに、同じ意味の予期しないメッセージが表示されることはありません。それはできません。クエリから予測不可能性を排除するか、予測不可能な状態で暮らす必要があります。このクエリは、最大値のverを取得します。

select c.ver 
    from s_Last7days b , buildmapping c 
where b.ver=0 
    and b.Build=c.build 
    and b.BuildMinor=c.buildminor 
    and b.branchname=c.branchname 
order by c.ver DESC 
limit 1 

あなたのLinuxデータベースには、変更されていないWindowsへの移植が不可能なバグがあります。バグが今まで発見されていないことは、あなたにとって幸運なこと(あるいはおそらく不運)です。あなたはこのデータベースを移植するときにこのバグを修正しなければならないか、バグの結果とともに生きていなければなりません。

+0

ジョーンズ、ロケット、ドリュー、ケンありがとう。はい、私は現在のサーバーで修正しようとします。それが最適な解決策になります。 – Arun

0

あなたの更新コマンドは、1対多の関係を使用して、ビルドマッピングのどの値をs_Last7days.verフィールドに使用するかを選択しています。 自然順序で最初に一致するタプルのみが使用されます。

詳細情報here

関連する問題