1

ローカルマシンでは、Webサーバー上のテーブルのミラーレプリカであるいくつかのInnoDBテーブルを維持しています。新しいデータまたは更新されたデータがある場合は常に、ローカルテーブルでそれを実行します。更新の場合、通常、一部のテーブルのいくつかのフィールドのみが対象です。ローカルで行うと、ステージングの前にデータの処理と検証を実行するのに役立ちます。最後に、これらの差分データをリモートサーバーに移動します。

このデータ移行プロセス全体をどのように最適に達成できますか。私があなたのインプット/経験を探しているいくつかの段階があります:

  • すべてのテーブルから差分データを識別してフェッチするコマンド、
  • リモートサイトで、このデータでそれぞれのテーブルを更新するコマンド、
  • 更新のアトミック性を確保して、更新で作成されたWebページコンテンツの整合性を損なわないようにするにはどうすればよいですか。

このプロセス全体を自動化することを計画しています。将来的には、そのような更新が数千回行われる可能性があるため、この時間とサイズを最適化してもらいたいと思います。

私はPythonを使用しており、ファブリックを使用してコマンドを実行する予定です。

4

1 に答える 1

1

バイナリ ログを使用して、ローカル データベースへの変更を記録してみます。次に、 mysqlbinlogツールを使用してバイナリ ログを SQL スクリプトに変換し、それを Web サイトに適用するだけです。ポイントインタイムリカバリを実行するのと同じプロセスです。

ローカルbinlogの SQL への変換が完了したら、ローカル システムでFLUSH LOGS (またはmysqladmin flush-logs ) を使用します。そうすれば、中断した場所が正確にわかり、次に変更をアップロードするときにそこから開始できます。

本当にアトミックな方法で Web サーバーに変更を適用するかどうかはわかりません。そのためには、トランザクションを使用する必要があります。START TRANSACTION と COMMIT の間に SQL スクリプトを挟むこともできますが、binlog 自体にトランザクション ステートメントが含まれていないことを確認したいと思います。

2 つのデータベースを比較し、変更の最小セットを把握する別のツールは、Percona Toolkit のpt-table-syncです。しかし、そのツールは通常、データベースを同一にすることを目的としています。ローカル開発者インスタンスにない Web サーバー上に実稼働データがある可能性が高いため、特定のテーブルにフィルター処理する必要があるか、pt-table-sync に「挿入するが削除しない」オプションなどがあります。ドキュメントを注意深く読み、テスト インスタンスで実験することをお勧めします。

于 2013-02-21T21:30:05.733 に答える