私が過去に使用したアプローチの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テーブルのトリガーを介してこのテーブルにデータを入力します。これらのアクションごとに、個別のステータスを設定します。
これにより、最初の移行スクリプトを実行してから変更されたすべてのレコードをすばやく検索し、それらのレコードのみを移行できます。
実稼働環境を変更しておらず、トリガーは「スレーブ」環境でのみ起動するため、実稼働環境にパフォーマンスや不安定性の問題を引き起こすことはありません。