2012-03-30 43 views
3

好,標題自擬描述它.. 我需要運行一個SQL函數清理了一些重複的帖子,我需要做的是,每天數次,所以我需要使用cron ...我如何設置一個crontab來執行mysql查詢並記錄輸出?

我樹立了新的crontab的工作,像這樣:

00 16,18,19,20,21 * * * mysql -h MY-DB-HOST.COM -u MY-DB-USERNAME -pMY-DB-PASSWORD -e "delete from hotaru_posts where post_id in (select post_id from (select post_id from hotaru_posts a group by post_title having count(post_title) > 1) b)" >> /tmp/cron_job.log 

但似乎沒有被記錄下來,所以我認爲它不工作。

Theres沒有問題與SQL句子,多數民衆贊成在這裏不是問題。

我的cron規則有什麼問題嗎?

+0

請問您的用戶名/密碼,包含可能混淆的bash的符號?像'&'一樣? – 2012-03-30 18:06:59

+0

首先想到的是,檢查/ var/log/cron以確保它甚至試圖運行。 – 2012-03-30 18:07:52

+2

第二個想法是,如果不在PATH中,請使用mysql的完整路徑。 – 2012-03-30 18:08:50

回答

8

好吧,因爲mysql在crontab裏面工作不正常(以爲我認爲這是像Alex Howansky說的那樣的路徑問題),我創建了一個處理這個查詢並在crontab中調用php的php文件,並給我選擇使用條件。

cron作業:

00 8,14,18,19,20,21,23 * * * /usr/local/bin/php /home/aikaforum/cata/public_html/cron_dup.php >> /cata/tmp/cron_dup.log 

php的:

<?php 
$username="xxxxxxx"; 
$password="xxxxxx"; 
$dbname="xxxxxx"; 
$dbhost="xxxxx.xxxxx.com"; 
$query="delete from hotaru_posts where post_id in (select post_id from (select post_id from hotaru_posts a group by post_title having count(post_title) > 1) b)"; 
mysql_connect($dbhost,$username,$password); 
@mysql_select_db($dbname) or die(strftime('%c')." Unable to select database"); 
mysql_query($query); 
mysql_close(); 
echo strftime('%c')." ok!"; 
?> 

感謝所有幫助。

+0

不錯的替代方案!使用400個權限保護文件,以便只有文件的所有者才能讀取這些明文密碼。 – 2017-04-07 18:52:50

2

我懷疑你的腳本正在工作,但實際上並沒有返回任何輸出。這是我的本地測試:

mysql -u username dbname -e "delete from posts" > foo    
cat foo 
(empty file) 

要清楚,foo是一個空文件。 posts不是空表。

所以,更確切地說,我認爲這是MySQL的預期行爲,儘管我無法在他們的文檔中確認這一點。如果你想/需要在這裏輸出,你可能需要編寫一個腳本來檢查你的表在刪除之前/之後。

+0

>和> >>之間的區別是什麼 – 2012-03-30 18:16:09

+0

對不起,這是從我的命令提示符的格式,我剛剛刪除它 – muffinista 2012-03-30 18:17:16

+1

哦,對不起,我刪除了一些東西'''寫入文件,但會覆蓋任何現有內容'''附加到文件,保留現有內容。 – muffinista 2012-03-30 18:21:32

2

您需要使用由cronjob執行的腳本的完整路徑。例如,如果mysql二進制文件的位置是/usr/local/mysql/bin/mysql,你可以在你的cronjob中使用它。

00 16,18,19,20,21 * * * /usr/local/mysql/bin/mysql -h MY-DB-HOST.COM -u ..... 
+0

作爲使用完整路徑調用的替代方法,您可以修改crontab中的PATH變量(默認情況下,該變量僅爲'/ usr/bin:/ bin')。像:'PATH =/usr/local/sbin:/ usr/local/bin:/ sbin:/ bin:/ usr/sbin:/ usr/bin' – tanius 2016-03-31 15:11:21

4

執行以下在你的cron配置

echo "your_SQL_statement" | mysql --skip-column-names -udbuser -pdbpassword yourdb >> yourlog.log