3

これはおそらくどこかの時点で遭遇するチームなので、他のメンバーの経験を頼りにしています.

古い MySQL データベースを、構造がかなり変更された新しいデータベースに移行中です。一部のテーブルは複数の小さなテーブルに分割され、一部のデータは複数の小さなテーブルから 1 つの大きなテーブルに結合されました。

テストを実行したところ、データベースを新しいフォームに移行するのに数時間かかりました。問題は、古いデータベースが本番データベースであり、毎分変更されることです。数時間のダウンタイムはあり得ません。

このような状況では、どのようなアプローチが適切だと思いますか?

1M 行の「users」というテーブルがあるとします。毎秒変化しています。一部のフィールドが更新され、一部の行が追加され、一部の行が削除されます。これが、移行が完了した後、3 時間のデータが同期されないため、特定の時点でスナップショットを作成できない理由です。

4

3 に答える 3

1

私が過去に使用したアプローチの1つは、レプリケーションを使用することでした。

古い本番データベースと、データ移行に使用されたスレーブとの間にレプリケーションスキームを作成しました。移行を開始したとき、レプリケーションを一時的にオフにし、移行のデータソースとしてスレーブデータベースを使用しました。古い生産システムは引き続き稼働していました。

移行スクリプトが完了し、整合性チェックが実行されたら、古い本番システムからレプリケートされたスレーブへのレプリケーションを再度有効にしました。レプリケーションが完了したら、本番環境で「メンテナンスのためのダウン」サインを停止し、データ移行スクリプトと整合性チェックを再実行し、システムに新しいデータベースを指定して、「メンテナンスのためのダウン」サインを削除しました。

ダウンタイムはありましたが、数時間ではなく数分でした。

これは、変更された/新しいデータを簡単に識別できるようにするために、データベーススキーマに依存します。

スキーマが新しいレコードや変更されたレコードを見つけるためのクエリを簡単に実行できず、これを追跡するために新しい列を追加したくない場合、最も簡単な解決策は、移行ステータスを追跡するために個別のテーブルを作成することです。

例えば:

TABLE: USERS (your normal, replicated table)
----------------------
USER_ID
NAME
ADDRESS
.....


TABLE: USERS_STATUS (keeps track of changes, only exists on the "slave")
-----------------
USER_ID
STATUS
DATE

挿入、削除、更新のためにUSERSテーブルのトリガーを介してこのテーブルにデータを入力します。これらのアクションごとに、個別のステータスを設定します。

これにより、最初の移行スクリプトを実行してから変更されたすべてのレコードをすばやく検索し、それらのレコードのみを移行できます。

実稼働環境を変更しておらず、トリガーは「スレーブ」環境でのみ起動するため、実稼働環境にパフォーマンスや不安定性の問題を引き起こすことはありません。

于 2013-02-08T13:39:11.600 に答える
0

私が一度使用したアプローチが 1 つありますが、それはあなたにも役立つはずですが、そのためには運用データセットを変更する必要があります。簡単に:

  1. 移行するすべてのテーブルに、"migrated" (またはそのような) という名前の新しい列を追加します。ブール型にします。デフォルトでは 0 に設定します。
  2. 移行スクリプトを実行すると、新しいデータベースに移行されたすべてのエントリに対して、このフラグを 1 に設定する必要があります。すでに「1」になっているエントリはすべて無視する必要があります。そうすれば、同期の問題に遭遇することはありません。

そうすれば、移行スクリプトを何度でも実行できます。

ダウンタイムは発生しますが、そのダウンタイム中に移行する必要があるのはいくつかのデータセット (実際には、移行スクリプトの最後の実行と現在の間の最後の「デルタ」) だけであるため、最小限のものになります。

于 2013-02-08T13:28:52.807 に答える
0

新しいデータベースを現在のデータベースと並行して実行できますか? そうすれば、後で古いデータを古いデータベースから新しいデータベースに移行することができ、「ライブ」の状況が新しいデータベースですでにキャプチャされます。

つまり、古いデータベースに何かを書き込むときは、新しいデータベースにもデータを書き込む必要があります。

于 2013-02-08T13:32:16.177 に答える