在FreeBSD5.4下面做開發,需要定期備份mysql資料,開始在網上找了bash的腳本,但是執行無效,一怒之下,使用php來寫,嘿嘿,其實php寫腳本也不錯滴。備份其實就是把mysql的資料庫檔案複制出來,當然,也可以使用mysqldump之類的工具把結果生成sql語句,不過我為了友善,就直接複制檔案,并且壓縮一下。看php代碼:
把腳本儲存到 /home/heiyeluren/db_dump/mysql_dump.php。
上面的代碼很好了解吧,就是生成一個按照時間為名字的.tgz檔案,儲存在我的個人主目錄下面,為了腳本能夠執行,還要加上 chmod +x /home/heiyeluren/db_dump/mysql_dump.php ,讓腳本能夠有執行權限。我們自己先試驗一次這個腳本,看有效沒有:
/home/heiyeluren/db_dump/mysql_dump.php
在看看有沒有生成檔案:
ls /home/heiyeluren/db_dump/
嗯,生成了 mysql_20051206_xxxxx.tgz的檔案,證明有效果。
好,切換到root使用者:su - root,輸入密碼,添加cron任務:
加入任務:
嘿嘿,設定了一分鐘執行一次,設這麼快,主要是看看有沒有效果。
等了兩分鐘,看了一下,嗯?怎麼在 /home/heiyeluren/db_dump/下面還是沒有 .tgz 的檔案?怎麼回事呢?
刷刷列了好幾螢幕,看到類似這樣的:
Dec 6 19:32:00 BSD /usr/sbin/cron[12256]: (root) CMD (/usr/local/php/bin/php /home/heiyeluren/db_dump/mysql_dump.php > /dev/null)
證明我的腳本執行了。。。但是為什麼沒有效果呢?
哦,我想起來了,好像cron能夠把腳本中的輸出當作郵件發送給建立cron的使用者,嗯,好,我們去掉 > /dev/null 這段,就讓我們cron直接發送郵件給我們的root:
crontab -e
修改為:
*/1 * * * * /usr/local/php/bin/php /home/heiyeluren/db_dump/mysql_dump.php
等了一會,看一下郵件,可以使用mail指令來看,也可以直接在 /var/spool/clientmqueue/ 下面看,我們選擇第二種:
ls /var/spool/clientmqueue/
列出好多檔案:
dfjB6BG0SE012107 dfjB6BN0JP012185
dfjB6BU1mj012248 qfjB6BG0SE012107
qfjB6BN0JP012185 qfjB6BU1mj012248
dfjB6BH0aP012123 dfjB6BO1ID012192
dfjB6BV0dL012254 qfjB6BH0aP012123
qfjB6BO1ID012192 qfjB6BV0dL012254
我們打開一個來看:
cat /var/spool/clientmqueue/dfjB6BG0SE012107
嗯,看到輸出:
sudo: not found
???難道是我們的php腳本有問題,不是我測試過沒有問題的嗎?哦,看提示,原來是sudo指令沒有找到,為什麼呢?因為所有腳本中引用的程式都必須是絕對路徑滴,不然會找不到,唉,犯錯了。
嗯,既然我是用root執行的,權限是沒有問題滴,何不把sudo給删除呢,說幹就幹,修改腳本:
vi /home/heiyeluren/db_dump/mysql_dump.php
嘿嘿,去掉了sodu,嗯,儲存退出,看看我們的crontab效果如何。。。
哈哈,一分鐘過後,檢視下目錄:
ls /home/heiyeluren/db_dump
嘿嘿,有兩個 .tgz 的檔案了:mysql_20051206_xxxx.tgz,嗯,證明成功了,但是不能總是讓cron給root發郵件呀,不然一會功夫伺服器空間就沒有了,修改cron任務為:
0 6 * * * /usr/local/php/bin/php /home/heiyeluren/db_dump/mysql_dump.php > /dev/null
就是每天早上的六點執行一次,并且把任何輸出到輸出到 /dev/null 中,不要給root發郵件。
好,終于解決,不容易,涉及很多知識電,不過增長了經驗,不是嗎?
非學,無以緻疑;非問,無以廣識