shell辅助管理网站后台数据

shell 辅助管理数据库技术关键在于掌握MySQL基本语句就能轻松通过shell操作MySQL并操作数据流,在linux里操作文本数据最方便了,因为有强大的awk程序,所以普遍的做法是将数据流导入临时文件中处理。

因为考虑到项目数据完整性需要,而且为了降低后台报错几率。所以赋予用户删除文件的权限只是在文件记录表中修改文件存放状态字段,比如数据表file字段s_state记录文件状态,1=可下载,2=禁止下载,3=删除。这样赋予用户的权限就是将文件状态s_state字段值改为3,这样做还有一个好处就是降低出错率,有时候会出现数据表信息删除了,但文件却没有删掉,这样有多余无用文件占用硬盘空间;如果文件删除成功,但是数据表数据没有删除,数据表出现无用数据。

利用shell管理,就希望自动执行,所以应免除用户名和密码输入,一下数据可以免去连接MySQL数据库用户名和秘书输入,而且添加-e参数能同时执行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;

$port: 数据库端口,默认为3306;

$user: 数据库用户;

$passwd: 数据库用户密码;

$dbname: 需要连接的数据库;

-e 后面接着就是需要执行的SQL语句,> 将获取的数据导入临时文件data_temp中,后续处理;此时data_temp里记录了每一条数据,每一条记录占用一行,字段值之间以空格隔开。知道数据格式,下面处理就好办了:

# 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

最后不要忘了删除临时文件:

rm -f data_temp
rm -f imagetemp
rm -f idtemp

同时,向控制台输出标记,宣布处理完成:

echo "^-^ clean!"

这样,只要执行shell文件,一会就把大量的无用数据处理掉,方便省力!

总结:第一次写awk程序,不是很熟悉,上面的处理显得很笨挫,每次读取的数据都要写入新的文件,加大了磁盘数据读取压力,后续改进可以利用shell变量传递。

你可能感兴趣的:(shell,awk,管理MySQL)