web-dev-qa-db-ja.com

ユーザーの一括削除

drupalインストールから約60万人のユーザーを一括削​​除する必要があります。UIDSがあり、それを実行するためのDrushスクリプトを作成しましたが、問題はこれがライブサイトであるため、 user_delete_multipleは全期間ロックを取得します(100のチャンクに分割するのにも時間がかかりすぎます)。そのため、配列を1つずつ反復し(そのためロックを解除して通常の操作を許可し)、1.5のレートで削除します1秒あたりのユーザー数600k->約1週間かかります。

さらに、テーブルがロックされているため、これを並列化できません(試してみましたが、遅くなります)。他にどんなオプションがありますか? (データベースから直接削除することを検討しましたが、user_deleteとentity_deleteを実装するモジュールがたくさんあるので、何かを忘れる可能性があります...

私は多分同じスクリプトを使用しているが、テーブルのロックを削除することを考えています...これを行う方法を知っていますが、オプションである可能性があります。

[編集]スクリプトを編集しただけですが、サイズ5の配列にチャンクし、user_delete_multipleを使用しています。これにより、module_invoke_allへの4つの呼び出しを保存することができ、少し速度が向上しました。現在、4、4.5秒で5人のユーザーを削除しています。これにより、ロックを維持する時間を短縮でき、サイトの運用も可能になります。 waitigは、この修正でサイトがまだ使用可能かどうかを確認します。

3
cromestant

私はいくつかのことをします。

削除が遅い場合は、MySQLインスタンス(または他のデータベースサーバー)のチューニングが不十分である可能性があります。私はサーバーで MySQLTuner (またはあなたのケースでは同等のもの)を実行し、きちんとした構成になっていることを確認します。

次に、メンテナンスモードでこれを実行します。サイトのトラフィックが増加し、ロックを取得することが困難になると、速度が低下する可能性があります。

私があなたの立場にあれば、次のようなシェルスクリプトを作成します。

drush @thesite variable-set -y --always-set maintenance_mode 1
drush @thesite -u 1 scr /path/to/a/drush/script.php
drush @thesite variable-delete -y --exact maintenance_mode

そして、これを毎晩crontabに置きます。 /path/to/a/drush/script.php内に、ユーザーのバッチ(たとえば100人程度)を削除するコードを記述します。

これにより、メンテナンスモード中にユーザーが小さなバッチで削除されます。これにより、サイトのダウンタイムが最小限になります。

進捗状況を監視し、完了したらcrontabエントリを削除します。

4
mpdonadio