残念ながら、100行の小さなバッチでコピーを行っても、しばらくするとかなりの遅れが生じます。
各バッチ間に遅延を追加しますか、それとも単に更新をバッチ処理し、前のバッチの直後に各バッチを実行しますか?
その場合は、次のようなものを使用して、お気に入りの言語で変換のスクリプトを作成してください。
repeat
copy oldest 100 rows that haven't been copied yet to new table
sleep for as long as that update took
until there are <100 rows unprocessed
stop logging service
move the last few rows
rename tables
restart logging
delete the old table when you are sure the conversion has worked
これにより、システムの使用が時間とともに変化するため、サーバーの処理能力の半分以上を変換に費やさずに、負荷の差を許容できます。
データベースは、そのユーザーのためのいくつかの作業を行う必要がある場合、またはあなたは、サービスが(潜在的に時間のかなりの長さのため一時停止)オフ比較的アイドルが、帰ってきたとき、できるだけ多くの時間として使用したい場合は、交換してくださいsleep for as long as the update took
とif the server's load is above <upper measure>, sleep for some seconds then check again, loop around the sleep/check until the load drops below <lower measure>
。これは、静かな時間に先に進むことができることを意味しますが、サーバーが通常のワークロードの実行でビジーになると完全に一時停止します。負荷の決定はOSに依存します-Linuxでは、同様の1分間の負荷平均値/proc/loadavg
または出力がuptime
行うべきです。<lower measure>
そして<upper measure>
、あなたのプロセスはその後すぐに起動負荷測定に影響を与えるために、独自の再起動を一時停止維持しないように違いを持っているために、このような制御では通常ですが、同じ値であってもよいです。
もちろん、これは古い行が変更される可能性のあるテーブルでは機能しませんが、説明したようなログテーブルでは問題なく機能します。
この場合、新しいテーブルにデータを入力した後、インデックスを作成するという通常の知恵を無視する必要があります。物事を可能な限り高速にしたい場合(システムの残りの部分への影響を気にせず)本当に効率的ですが、この場合、プロセスの最後に大きな負荷がかかりたくないインデックスは一度に完全に作成されます。これは、忙しいときに一時停止できないプロセスだからです。