shell 輔助管理數據庫技術關鍵在於掌握MySQL基本語句就能輕鬆經過shell操做MySQL並操做數據流,在linux裏操做文本數據最方便了,由於有強大的awk程序,因此廣泛的作法是將數據流導入臨時文件中處理。mysql
由於考慮到項目數據完整性須要,並且爲了下降後臺報錯概率。因此賦予用戶刪除文件的權限只是在文件記錄表中修改文件存放狀態字段,好比數據表file字段s_state記錄文件狀態,1=可下載,2=禁止下載,3=刪除。這樣賦予用戶的權限就是將文件狀態s_state字段值改成3,這樣作還有一個好處就是下降出錯率,有時候會出現數據表信息刪除了,但文件卻沒有刪掉,這樣有多餘無用文件佔用硬盤空間;若是文件刪除成功,可是數據表數據沒有刪除,數據表出現無用數據。linux
利用shell管理,就但願自動執行,因此應免除用戶名和密碼輸入,一下數據能夠免去鏈接MySQL數據庫用戶名和祕書輸入,並且添加-e參數能同時執行SQL語句:sql
mysql -h$host -P$port -u$user -p$passwd $dbname -e "SET NAMES utf8;SELECT ${outField} FROM ${tablename} WHERE ${field} = 3" > data_temp
$host: 數據庫鏈接主機,若是在本機執行,爲localhost;shell
$port: 數據庫端口,默認爲3306;數據庫
$user: 數據庫用戶;code
$passwd: 數據庫用戶密碼;get
$dbname: 須要鏈接的數據庫;table
-e 後面接着就是須要執行的SQL語句,> 將獲取的數據導入臨時文件data_temp中,後續處理;此時data_temp裏記錄了每一條數據,每一條記錄佔用一行,字段值之間以空格隔開。知道數據格式,下面處理就好辦了:class
# data_temp 數據格式: # s_id s_file # 1 "/pic/a.jpg" # 2 "/pic/b.jpg" sed '1d' data_temp | while read line # sed '1d'過濾第一行數據,由於第一行數據是字段名; while循環每次讀取一行數據 do echo $line > findtemp #將每行的數據暫時寫入findtemp中 awk '{print $2}' findtemp > imagetemp #經過awk獲取第二個字段值暫時寫入imagetemp中 cat imagetemp | while read imagedata #讀取imagetemp文件,經過rm命令刪除文件,帶上-f參數,強制刪除 do filePath=${fileRootPath}${imagedata} echo $filePath >> del_log.log #將刪除記錄添加到記錄del_log.log中,方面管理 rm -f $filePath done # 後面刪除數據庫記錄原理同樣 awk '{print $1}' findtemp > idtemp cat idtemp | while read iddata do mysql -h$host -P$port -u$user -p$passwd $dbname -e "SET NAMES utf8;DELETE FROM ${tablename} WHERE s_id = ${iddata}" done done
最後不要忘了刪除臨時文件:
awk
rm -f data_temp rm -f imagetemp rm -f idtemp
同時,向控制檯輸出標記,宣佈處理完成:
echo "^-^ clean!"
這樣,只要執行shell文件,一會就把大量的無用數據處理掉,方便省力!
總結:第一次寫awk程序,不是很熟悉,上面的處理顯得很笨挫,每次讀取的數據都要寫入新的文件,加大了磁盤數據讀取壓力,後續改進能夠利用shell變量傳遞。