web-dev-qa-db-ja.com

投稿リビジョンを一括削除する最も安全な方法

私のクライアントの1人は、投稿数とトラフィックの観点から、かなり大きなブログに参加しています。私は彼女のデータベースを管理可能なサイズにすることを試みています、そして急増している1つの事柄は文字通り何万もの投稿リビジョンです。

私はすでにWordpressのconfigを設定して、将来のリビジョン数を2に制限します。

define('WP_POST_REVISIONS', 2);

しかし、私は既存のすべてのリビジョンを削除したいのです。

質問1 :post_typeのリビジョンを持つwp_postsテーブルのすべての行を直接削除しても安全ですか? (これについては矛盾する答えを見ましたが、安全であればこのようにしてそれを実行できるようにしたいと思います)。

質問2…これは私がすべき場合にのみ関係があります _ _ではありません 質問1から単純な削除をしてください:

この答え / songdogtechが安全に削除するためのデータベースクエリを提供するところですが、(1)マルチサイトの質問(これは単一のサイトです)への回答です。データベースの変更が含まれています。 (だから、私はデータベースクエリを読むことで、そこで何が起こっているのか、そしてWP 3.6の単一のサイトでうまくいくかどうかを正確に知ることはできない

8
StudioAl

Post_typeのリビジョンを持つwp_postsテーブル内のすべての行を直接削除しても安全ですか? (これについては矛盾する答えを見ましたが、安全であればこのようにすることができればと思います)

安全です、それはsafeです。

サイト上の投稿を編集できるユーザーが1人だけの場合は安全で、他の問題は発生しません。

より多くのユーザーがいて、そのうちの1人が投稿を編集している間にリビジョンを削除してもまだ安全ではありませんが、そのユーザーにとってはリビジョンが消えてしまうのは面倒です。

絶対に 安全でない とは、1つ(またはそれ以上)の手頃なバックアップを取り、ローカルの/ dev環境でクエリをテストせずにWPデータベースでSQLクエリを実行することです。予め。

あなたが誤って'revision'の代わりに'post'とタイプしたと想像してみましょう。バックアップがなく、本番サイトでクエリを実行した場合、どうなりますか?

2番目の質問に関しては、 query Posted 内のすべての場所で{id}_を削除し、wp_{id}_postswp_postsになるようにしてください。

warning wp_部分は標準のテーブルプレフィックスで、クールな人たちはWPインストール中に違うものに変わる。

変更した場合、wp_config.php$table_prefix = 'something_else_than_wp_';が表示されます。

あなたの質問は次のようになります。

DELETE a,b,c
FROM something_else_than_wp_posts a
LEFT JOIN something_else_than_wp_term_relationships b ON (a.ID = b.object_id)
LEFT JOIN something_else_than_wp_postmeta c ON (a.ID = c.post_id)
WHERE a.post_type = 'revision'

私はこのように進めることを提案します:

  1. データベースをバックアップする
  2. データベースを再度バックアップします
  3. データベースをanother databaseに復元してバックアップをテストします。
  4. この新しいデータベースを使用するように 'wp_config'を変更してください。
  5. 新しいデータベースでクエリを実行し、問題があるかどうかを確認します。
  6. そうでなければ、あなたは終了です。もしそうなら、再度 'wp_config'を変更してoldデータベースを使わせ、問題を調査してみてください。
18
gmazzap

これまでに提供された詳細は、せいぜい不完全なものであり、a、b、cクエリは良くありません - 潜在的に危険でさえあります。潜在的な依存関係の多くを考慮に入れるのを忘れています。詳しい議論とより良い質問があります ここ

この改訂版 のクエリのバージョンもありますが、これははるかに優れていますが、低リスクの開発環境でテストしてバックアップします。

具体的には:

DELETE a,b,c
FROM wp_posts a
LEFT JOIN wp_term_relationships b ON ( a.ID = b.object_id)
LEFT JOIN wp_postmeta c ON ( a.ID = c.post_id )
LEFT JOIN wp_term_taxonomy d ON ( b.term_taxonomy_id = d.term_taxonomy_id)
WHERE a.post_type = 'revision'
AND d.taxonomy != 'link_category';

このクエリは、WordPressが投稿とリンクの両方にwp_term_relationshipsテーブルで同じobject_idを使用している可能性がある古いデータを処理します。このa、b、cクエリの他のバージョンを実行することで、リンクデータも誤って削除する可能性があります。これは、WordPressの新しいインストールではそれほど問題ではありません。

そのバージョンの照会を実行して0個の削除を取得した場合、それは単にwp_term_taxonomyテーブルに 'link_category'エントリーがないことを意味します。そのテーブルを確認して確認し、最後の行を削除してクエリを再実行するだけです。

ただし、本番データを使用する前に、必ず結果をバックアップ、テスト、および検証してください。このクエリは、最適化後の300 MBから5 MBまでの私のリビジョン肥大化wp_postsテーブルの1つを取りました。

4
Andrew

SQLクエリを実行します。

DELETE FROM wp_posts WHERE post_type = "revision" // for "wptest" DB, note the table name

注:上記のクエリは「リビジョンとしてマークされた投稿を削除するだけです」。何らかの理由で、最終的な投稿が公開されたときに削除されたタグまたはカテゴリにリビジョンを関連付けた場合は、用語など、他のテーブルに追加のエントリが追加されます。 (必要に応じてテーブルのプレフィックスを変更します)

DELETE a,b,c FROM wp_posts a LEFT JOIN wp_term_relationships b ON (a.ID = b.object_id) LEFT JOIN wp_postmeta c ON (a.ID = c.post_id) WHERE a.post_type = 'revision'
2
Tara