2009-03-09 17 views
2

私たちには、オンサイトにあるSQL Server DBと会話するデータセンター内にあるMySQLデータベース(ほとんどが読取り専用なMyISAMテーブル)があります。 WANにはかなりのレイテンシがあります(100ms以上)。約6ヶ月でSQL Server DBMSがデータセンター(例えば、同じギガビットLAN)に移動します。SQL ServerからMySQLテーブルを効率的に更新

MySQL DBには、SQL Serverデータベースの結果から更新する必要がある数千の行があります。 MySQL DBはLinux上で動作するレールアプリに付属しているので、できるだけデータを移行するロジックを維持したいと思いますシェルスクリプトまたはrake/ruby​​タスク(私たちはWindowsアプリケーション開発者ではありませんので、Win32アプリなどは、となりました。!)。

これはかなり簡単なプロセスです。擬似コード内:

頻繁に(5分ごとに)更新する必要がある数千の行があるとしましょう。また、私はSQL Serverのどの行が変更されたのかわからないと仮定します(残念ながら!)ので、変更した行に制限することはできません - SQL Server DB 編集:私たちはDBMSを制御しているので、テーブルのトリガや新しいストアドプロシージャなどの軽度の変更を行うことができます。テーブルスキーマは変更されません最後に更新された列を追加してください。最後の手段としてこのオプションを保存したいと考えています)。

ランタイムを最小限に抑えるこのアップデートプロセスを最善の方法で実行するにはどうすればよいですか?このプロセスは数分おきに実行する必要があり(早くても良い)、SQL ServerとMySQLのデュアル接続をRubyから発行するのは遅すぎます。 MyISAMエンジンで発行された書き込みテーブルロックの一部でもかまいませんが、Innodbへの変換はそれほど高速化されていないようです(システムはテスト中で、同じ種類の負荷をシミュレートするのは簡単ではありません。それはロックに関連していないと信じて)。

私は現在、LinuxサーバにFTP接続しているVIEW(上記のSQL Serverの文に対応する)をBCPに向けているし、Rubyを使ってファイルをforeachしていますシリアライズされたSQLステートメント)、私はそこに良い方法があると想像しなければなりません。

答えて

1

あなたはそこからthese instructions

MySQLのテーブルと金額が等しくないし、それに応じてそれらを更新し、あなたのMSSQLテーブル間の結合を行うようにあなたが何かを行うことができ、次のSQL ServerへのリンクサーバーとしてMySQLを追加することができます。 これをSQLジョブとして実行すると、dbを5分ごとに同期させることができます。

例えば、

SELECT * FROM mysql.dbo.bank_account myb 
INNER JOIN bank_account sqlb 
ON myb.id = sqlb.id 
AND sqlb.amount <> myb.amount 

は、あなたがより少ないリソースを使用するSQL Serverの内部からMySQLのテーブルを照会することができたら、データが変更されたものを考え出すのよりスマートな方法があるかもしれませんが、これはスタートです。

+0

これはかなりラドです。ソースが消えた場合に備えてsol'nをコピーして貼り付けますか?私は礼儀を覚えていない –

+0

私はソースがすぐに消えるとは思わない。たぶんその別の良い良い質問:SQL Serverのリンクされたクエリの指示 –

0

古い値をキャッシュするか、triggers (yuck)で更新された行が見つからないように、別のテーブルをMSSQL側に追加することができます。

MySQLの場合は、federated engineのようなMSSQL DBのリモートビューを提供するMySQLエンジンがあるかどうかわかりません。

+0

ああ、1つは、SQLサーバーから直接テーブルを更新するMySQLは、リンクサーバーを追加できますか? –