【MySQL】 WordPressの記事を自動削除する方法を教えて下さい


WordPressで構築した記事投稿サイトを運営しています。
アカウントを持っているユーザーが書き込むタイプです。

リアルタイムの情報に意味があるため、
過去の情報は基本的に不要です。

現在、定期的にphpMyAdminよりログインして
下記のようなSQLクエリを手動実行しています。
delete FROM `wp_posts` WHERE id between 4798774 and 5100866

「4798774」というのは、テーブル:wp_postsのidというの列の最小値。
「5100866」は最大値から10000引いた数です。※10000記事残している為

具体的には、phpMyAdminログイン後、
wp_postsという名前のテーブルのID列をソートして、
最大値、最小値をメモ。

そして、最小値と最大値から10000引いた数を
上記クエリに差し替えて実行しています。

この作業、cronで自動実行出来ないかと考えています。

ググっていると、
「シェルスクリプトにやりたいことを書いてをcronにより自動実行する」
みたいなやり方を見つけました。

今手動でやっているような作業をシェルスクリプトに書く場合、
どのような記述をすればよいのでしょうか?

具体的な記述方法を教えて下さい。

※MySQLのバージョンは 5.0.77 です。

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2012/06/11 12:37:39
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:windofjuly No.3

回答回数2625ベストアンサー獲得回数1149

ポイント1000pt

(案1)MySQLをバッチモードで操作する

最新1万件だけ残して削除するSQLスクリプトファイル

SELECT @a:= (SELECT MAX(id) - 10000 FROM `wp_posts`);
DELETE FROM `wp_posts` WHERE id between 4798774 and @a;

cronに登録するコマンド

mysql -h ホスト名 -u ユーザー名 -p パスワード データベース名 < SQLスクリプトファイル

MySQLをバッチモードで動かせるかどうかはサーバー管理者に相談してください。
ダメなら次の案

(案2)phpからMySQLに投げるようにします。

phpでMySQLにSQLスクリプトを投げるプログラムを書き、cronからphpを実行する
phpをコマンドラインから実行できるかは、サーバー管理者に相談してください。
ダメなら次の案

(案3)perlなど・・・以下同様

perlを使えない環境はあまりないと思いますので、上記2つの案がダメなら・・・

いずれの場合もテスト用のテーブルを作成し、
動作実験してから実施するようにしてくださいね。

他7件のコメントを見る
id:windofjuly

phpに入れるなら、もうひとつifを入れ子にします。

#!/usr/local/bin/php -

<?php
if ($con = mysql_connect('ホスト名:ポート番号', 'ユーザー名', 'パスワード')) {
    if((mysql_select_db('データベース名'))) {
        if(mysql_query('SELECT @a:= (SELECT MAX(id) - 10000 FROM `wp_posts`)')){
            if(mysql_query('DELETE FROM `wp_posts` WHERE id between 4798774 and @a')) {
                mysql_query('OPTIMIZE TABLE wp_posts');
            }
        }
    }
    mysql_close($con);
}
2012/06/10 20:41:25
id:tenmillion

この度はありがとうございまた。無事解決しました。

2012/06/11 12:34:33

その他の回答2件)

id:mario-16 No.1

回答回数219ベストアンサー獲得回数21

ポイント200pt

そして、最小値と最大値から10000引いた数を
上記クエリに差し替えて実行しています。

この SQL はこんなふうに書けます。

delete from wp_posts where id < (select max(ID)-10000  from wp_posts)

比較演算子を使えば最小値は必要ないです。

試すときはきちんと元に戻せるようにしてやってください。


SQL を cron で動かすやり方は分かってますよね。
sqlplus で先程の SQL を実行してください。

他1件のコメントを見る
id:windofjuly

wp_postsからデータを消している最中にwp_postsを参照することはできないってことです

すなわち「(MySQLでは)こんなふうに(1つのSQLでは)書けません」なのです。

2012/06/10 16:23:17
id:tenmillion

解説サイトを読んで、少し理解が深まりました。また宜しくお願いします。この度はありがとうございました。

2012/06/11 12:35:16
id:oil999 No.2

回答回数1728ベストアンサー獲得回数320

ポイント100pt

次のようなシェルスクリプトを書けば出来ます。

#!/bin/sh
echo "delete FROM wp_posts WHERE id between 4798774 and 5100866;" | mysql --user=ユーザー名 --password=パスワード
id:tenmillion

回答ありがとうございます。

現在、WEBサーバーとDBサーバーは別々で運営していまして、WEBサーバーから実行する形になります。この場合、ホストやデータベース名の設定が必要だと思うのですが、上記の前後に加える形で書くのでしょうか?

仮に
ホスト:mysql.host.net
データベース:db_test

とした場合の書き方をご教授下さればと思います。

2012/06/10 12:14:12
id:windofjuly No.3

回答回数2625ベストアンサー獲得回数1149ここでベストアンサー

ポイント1000pt

(案1)MySQLをバッチモードで操作する

最新1万件だけ残して削除するSQLスクリプトファイル

SELECT @a:= (SELECT MAX(id) - 10000 FROM `wp_posts`);
DELETE FROM `wp_posts` WHERE id between 4798774 and @a;

cronに登録するコマンド

mysql -h ホスト名 -u ユーザー名 -p パスワード データベース名 < SQLスクリプトファイル

MySQLをバッチモードで動かせるかどうかはサーバー管理者に相談してください。
ダメなら次の案

(案2)phpからMySQLに投げるようにします。

phpでMySQLにSQLスクリプトを投げるプログラムを書き、cronからphpを実行する
phpをコマンドラインから実行できるかは、サーバー管理者に相談してください。
ダメなら次の案

(案3)perlなど・・・以下同様

perlを使えない環境はあまりないと思いますので、上記2つの案がダメなら・・・

いずれの場合もテスト用のテーブルを作成し、
動作実験してから実施するようにしてくださいね。

他7件のコメントを見る
id:windofjuly

phpに入れるなら、もうひとつifを入れ子にします。

#!/usr/local/bin/php -

<?php
if ($con = mysql_connect('ホスト名:ポート番号', 'ユーザー名', 'パスワード')) {
    if((mysql_select_db('データベース名'))) {
        if(mysql_query('SELECT @a:= (SELECT MAX(id) - 10000 FROM `wp_posts`)')){
            if(mysql_query('DELETE FROM `wp_posts` WHERE id between 4798774 and @a')) {
                mysql_query('OPTIMIZE TABLE wp_posts');
            }
        }
    }
    mysql_close($con);
}
2012/06/10 20:41:25
id:tenmillion

この度はありがとうございまた。無事解決しました。

2012/06/11 12:34:33

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません