人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

【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 です。

●質問者: tenmillion
●カテゴリ:インターネット ウェブ制作
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● 蝸牛角上争何事
●200ポイント

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

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

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

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

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


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


tenmillionさんのコメント
ご回答ありがとうございます。早速試してみたのですが、 #1093 - You can't specify target table 'wp_posts' for update in FROM clause とうエラーが出てしまいました。 コンマとかスペースとかの微調整が必要でしょうか?

うぃんどさんのコメント
wp_postsからデータを消している最中にwp_postsを参照することはできないってことです すなわち「(MySQLでは)こんなふうに(1つのSQLでは)書けません」なのです。

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

2 ● oil999
●100ポイント

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

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

tenmillionさんのコメント
回答ありがとうございます。 現在、WEBサーバーとDBサーバーは別々で運営していまして、WEBサーバーから実行する形になります。この場合、ホストやデータベース名の設定が必要だと思うのですが、上記の前後に加える形で書くのでしょうか? 仮に ホスト:mysql.host.net データベース:db_test とした場合の書き方をご教授下さればと思います。

3 ● うぃんど
●1000ポイント ベストアンサー

(案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つの案がダメなら・・・

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


tenmillionさんのコメント
回答ありがとうござます。 phpMyAdminにログインして、教えていただいたコードを入力すると処理成功しました。 要は、このコードを別ファイルに書いておくんですよね? それがバッチモード? 自分なりにチャレンジしています。 また詰まったら助けてくださいm(__)m

うぃんどさんのコメント
バッチモードは、 DBサーバー上にSQLスクリプトファイルを保存しておいて、 DBサーバー上のcronからMySQLにSQLスクリプトファイルを送り込む方式です。 DBサーバーのcronに処理を登録したりする権限が無い状況だとすると、 別サーバーからDBサーバ上のMySQLを操作する権限も無いと思われますので、 案2もしくは案3で、前述したSQLをDBサーバーに送って実行させるしかないでしょう。

tenmillionさんのコメント
早速の回答ありがとうございます。 WEBサーバーからDBサーバへはアクセス自体は可能のようです。 WEBサーバーにSSHでログインし、教えて頂いた「mysql -h ホスト名 -u ユーザー名 -p パスワード データベース名」で、ずらずら情報が出てくるとこまでは来ました。 仮に2案だとすると、phpはどのような記述をすればよいでしょうか?

うぃんどさんのコメント
エラー時のログ出力などを省いた最小のものだと下記のような具合です。 WEBサーバーに設定することを想定していますが、 DBサーバー上でもphpが動くならDBサーバー上に設置しても使えます。 >|php| #!/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`)')){ mysql_query('DELETE FROM `wp_posts` WHERE id between 4798774 and @a'); } } mysql_close($con); } ||< cron >|| /usr/local/bin/php -f /home/hogehoge/fugaguga/phpファイル ||< /usr/local/bin/php や /home/hogehoge/fugaguga はサーバーによって違う場合あり

tenmillionさんのコメント
!!!!! 出来ました!!!!!! ありがとうございます!!! 本当に感謝です!! 大変恐縮ですが、もう一つ教えて頂いてよいでしょうか? 上記処理で記事を消しああと、続けてデータベースごと最適化したい場合は どのようにしたら良いでしょうか? 普段は、phpMyAdminから、任意のテーブルに全チェック→テーブルを最適化 を手動でやっています。

うぃんどさんのコメント
最適化は次のSQLを投げます。 >|sql| OPTIMIZE TABLE wp_posts; ||<

tenmillionさんのコメント
すみません。頂いたコード使ってチャレンジしてみましたが、phpのif文のかっこのくくりがどのように作用しているのか分からないので、うまく動きません(汗 上記phpコードのどこに差し込めば良いでしょうか?

うぃんどさんのコメント
phpに入れるなら、もうひとつifを入れ子にします。 >|php| #!/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); } ||<

tenmillionさんのコメント
この度はありがとうございまた。無事解決しました。
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ