私は最近、私が取り組んでいたサイトでバグを見つけて修正しました。これにより、テーブル内に何百万ものデータの重複行が発生し、それらがなくても非常に大きくなります (まだ数百万)。これらの重複行を簡単に見つけることができ、単一の削除クエリを実行してそれらをすべて削除できます。問題は、一度にこれほど多くの行を削除しようとすると、テーブルが長時間ロックされることです。これは、可能であれば回避したいと考えています。(テーブルをロックすることによって) サイトをダウンさせずに、これらの行を取り除くことができる唯一の方法は次のとおりです。
- 数千の小さな削除クエリをループで実行するスクリプトを作成します。これにより、理論的にはロックされたテーブルの問題を回避できます。これは、他のクエリがキューに入って削除の間に実行できるためです。ただし、それでもデータベースの負荷がかなり高くなり、実行に時間がかかります。
- テーブルの名前を変更し、既存のテーブルを再作成します (現在は空になります)。次に、名前が変更されたテーブルでクリーンアップを行います。新しいテーブルの名前を変更し、古いテーブルの名前を元に戻して、新しい行を名前を変更したテーブルにマージします。これにはかなり多くの手順が必要ですが、中断を最小限に抑えて作業を完了する必要があります。ここで唯一難しいのは、問題のテーブルがレポート テーブルであることです。名前を変更して空のテーブルを元の場所に配置すると、元の場所に戻すまですべての履歴レポートが消えてしまいます。さらに、格納されているデータの種類が原因で、マージ プロセスが少し面倒になる可能性があります。全体として、これは今のところ私の選択の可能性が高いです。
他の誰かが以前にこの問題を抱えていたかどうか、もしそうなら、サイトを停止せずに、できればユーザーへの中断を最小限に抑えて、どのように対処したのだろうか? 2 番目の方法、または別の同様の方法を使用する場合、夜遅くに実行し、翌朝早くマージを実行するようにスケジュールを設定し、事前にユーザーに知らせることができるので、大したことではありません。誰かがクリーンアップを行うためのより良い、またはより簡単な方法についてアイデアを持っているかどうかを確認しているだけです.