選択クエリの結果をファイルに保存してから、そのデータベース テーブルを切り捨てようとしています。バックアップの場合、シェル変数を使用してバックアップが必要な日数を決定するクエリを実行すると、正常に機能し、ファイルが保存され、希望どおりに機能します。
SET @sql_text = CONCAT ( "SELECT * FROM databasename.tablename WHERE (datetimestamp < (NOW()) AND datetimestamp > (DATE_SUB(NOW(),INTERVAL ",$daysback," DAY))) into outfile 'filename-" , DATE_FORMAT( NOW(), '%Y%m%d%H%i') , ".csv'" , "FIELDS TERMINATED BY ',' " , "LINES TERMINATED BY '\n' ");
PREPARE s1 FROM @sql_text;
EXECUTE s1;
DROP PREPARE s1;
daysback の値は、シェル スクリプト (ユーザー入力) から取得されます。その部分が機能するようにわかりました。
古いエントリを削除するために同じ行で何かをしようとすると、うまくいきません..
SET @sql_text = CONCAT("DELETE FROM databasename.tablename WHERE datetimestamp < DATE_SUB(NOW(), INTERVAL ",$daysret," DAY)");
PREPARE s1 FROM @sql_text;
EXECUTE s1;
DROP PREPARE s1;
ここでも変数 daysret はスクリプトから取得され、値は正しいです。確かに、MySQl シェルに入る前に両方の変数の値をエコーしようとしました..
さらに私も試しました
Set @daysret1=$daysret;
SELECT @daysret1 ;
そして、daysret1 の正しい値を取得し、daysret の値も正しいことを示します。また、クエリで @daysret1 を直接使用しようとしましたが、それでも役に立ちませんでした。二重引用符のさまざまなバリエーションと、そのdeleteステートメントにないものを試しましたが、うまくいきません。数値を直接 (変数なしで) 使用すると正常に動作するため、コマンドは適切であり、変数自体と関係があります。
また、構文エラーがある場合、MySql は実際にエラーを表示します (そのクエリで引用符やコンマなどをいじっているときにエラーのいくつかに遭遇しました) が、上に投稿したコマンドでは何も起こらず、スクリプトがハングし、データベースからは何も削除されません。
助けてください!
PS: それを行うより良い方法があれば、私はすべて耳にします..現在、これらのステートメントはこのようなブロック内で実行されています..
mysql -u$user -p$pass << EOF
....
....
EOF