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)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つの案がダメなら・・・
いずれの場合もテスト用のテーブルを作成し、
動作実験してから実施するようにしてくださいね。
そして、最小値と最大値から10000引いた数を
上記クエリに差し替えて実行しています。
この SQL はこんなふうに書けます。
delete from wp_posts where id < (select max(ID)-10000 from wp_posts)
比較演算子を使えば最小値は必要ないです。
試すときはきちんと元に戻せるようにしてやってください。
SQL を cron で動かすやり方は分かってますよね。
sqlplus で先程の SQL を実行してください。
wp_postsからデータを消している最中にwp_postsを参照することはできないってことです
すなわち「(MySQLでは)こんなふうに(1つのSQLでは)書けません」なのです。
解説サイトを読んで、少し理解が深まりました。また宜しくお願いします。この度はありがとうございました。
次のようなシェルスクリプトを書けば出来ます。
#!/bin/sh echo "delete FROM wp_posts WHERE id between 4798774 and 5100866;" | mysql --user=ユーザー名 --password=パスワード
回答ありがとうございます。
現在、WEBサーバーとDBサーバーは別々で運営していまして、WEBサーバーから実行する形になります。この場合、ホストやデータベース名の設定が必要だと思うのですが、上記の前後に加える形で書くのでしょうか?
仮に
ホスト:mysql.host.net
データベース:db_test
とした場合の書き方をご教授下さればと思います。
(案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つの案がダメなら・・・
いずれの場合もテスト用のテーブルを作成し、
動作実験してから実施するようにしてくださいね。
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); }
この度はありがとうございまた。無事解決しました。
phpに入れるなら、もうひとつifを入れ子にします。
2012/06/10 20:41:25この度はありがとうございまた。無事解決しました。
2012/06/11 12:34:33