mysql 数据表维护
这两天在处理一个很有意思的问题:
由于公司大楼突然断电,来电从启后,邮件服务器里面的一个mysql 附件数据表无法使用了。在尝试使用 mysql 的修复工具无法完成修复工作后,决定通过附件文件的存储特点来检索附件文件,生成数据表所需要的各个字段。
附件数据表如下:
其中 id: 邮件编号,file_name:文件名称,file_size: 文件大小,att_id:表示文件中附件的序号(一个文件中可以有多个附件),date_added: 表示添加的日期。
附件文件的存储特点:
因此写了两段脚本:
第一个脚本:检索文件夹中不包含.eml 文件的这些文件的完整路径 ,并将它们存储到 att_file_name_doc.txt 中。
#! /bin/bash
function read_dir(){
for file in `ls $1` #注意此处这是两个反引号,表示运行系统命令
do
if [ -d $1"/"$file ] #注意此处之间一定要加上空格,否则会报错
then
read_dir $1"/"$file #是目录则递归读取目录下的文件
else
var=$1"/"$file
if [ "${var##*.}" != "eml" ]; then #不是.eml 的文件,则把文件路径保存到 att_file_name_doc.txt 中
echo $1"/"$file >> /home/wwwroot/att_file_name_doc.txt
fi
fi
done
}
#读取第一个参数
read_dir $1
第二个脚本:根据这些文件的名称获取邮件的编编号,名称,大小,顺序,创建时间。
#! /bin/bash
echo $(date)
n=1
count_id=''
for filename in $( cat /home/wwwroot/att_file_name_doc.txt)
do
time=$(stat $filename | grep Modify|awk '{print $2 "\t" $3}' |awk -F"." '{print $1}')
size=$(stat $filename | grep Size: |awk '{print $2}')
id=$( echo $filename |awk -F "/" '{print $6}' )
name=$( echo $filename |awk -F "/" '{print $8}' )
if [ "$id" == "$count_id" ]
then
n=$(($n+1))
else
n=1
fi
count_id=$id
echo $id","$name","$size","$n","$time >>/home/wwwroot/att_csv.txt
done
echo "done"$(date)
登录 mysql 选择 数据库,导入数据
LOAD DATA LOCAL INFILE '/home/wwwroot/att_csv.txt' INTO TABLE arc_att
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n'