樂思蜀的博客,包括但不限于SEO&SEM研究、应用中的心得体会,互联网、搜索引擎观察与思考。

导入Web日志到MySQL数据库

2008年12月06日 by 樂思蜀

访问分析是SEO的一项重要工作,但统计、分析工具毕竟功能是针对大众的,很多时候SEO需要一些特定的数据,是统计分析软件、程序所不能提供的。这样,直接的Web日志分析就是最合适的了,日志中会记录每一个访问情况,只要按自己的意愿提取、组合,就能得到想要的数据。

就这个问题与星箭聊了挺长时间,最后一致认为将日志导入到SQL数据库(MySQL & SQL Server)中,使用SQL语句分析是最方便的,需要什么样的数据,只要使用相应的SQL命令就能实现。

我的服务器是Linux的,没有 SQL Server,之前就没再继续这件事。今天聊到这个话题时认真的搜索了一下,找到了使用MySQL分析日志的第一步,记录在此。

下一步的分析方法我有心得后会发布在博客中,有兴趣的朋友可以留意;同时,征集精通于SQL语句的朋友,一起讨论分析的各种方法,并分享给其他朋友。

导入Web日志到MySQL数据库的实现

1、修改Apache日志格式

修改Web日志格式为:

Logformat combined %>a,%ui,%un,[%tl],"%rm %ru HTTP/%rv",%Hs,%h","%{User-Agent}>h",%Ss:%Sh

明白的朋友应该一看就知道了,SQL需要导入的内容有特定的分隔符,Apache的日志默认是以空格分隔的,而有些内容(如状态码中的 200 610)也包含空格,这就无法准确的导入。

将日志格式修改为以逗号分隔,就能准确的导入了。还可以根据自己的需要,取消日志格式中不需要的内容,减少日志文件大小。

2、建立MySQL数据表

drop table if exists weblog;
create table weblog (
id int unsigned auto_increment PRIMARY KEY not null,
l_date date,
l_time time,
c_ip varchar(15),
s_ip varchar(15),
s_port varchar(5),
method varchar(10),
path varchar(255),
query varchar(255),
status varchar(3),
domain varchar(50),
system varchar(200)
);

注:上面只是一个MySQL数据表结构范例,没有与上一步日志格式对应,请勿直接复制使用!

新建一个数据库,数据表结构与日志格式对应起来。

3、导入日志到MySQL中

LOAD DATA INFILE  '/日志位置/日志文件'  INTO TABLE weblog FIELDS TERMINATED BY ',';

weblog 对应上面的数据表名。

第二步就是分析了,如上所说,有心得后再分享。

另外,从网上找到一个将IIS日志导入到MySQL数据库的.pl程序,原理相通的,需要的点这里下载(Readme.txt为使用说明)。

MySQL批量替换指定字段字符串

2008年11月14日 by 樂思蜀

有时站内包含敏感词,会给我们带来麻烦,而在信息量较大的情况下,一篇篇查找、修改是不现实的。今天老樂被网监通知某站包含很多不允许字词,责令立即修改,就参考了专业人士的文章,用MySQL语句批量替换,甚是轻松。发布在这里供参考,以备不时之需。

MySQL批量替换指定字段字符串语句

UPDATE 数据表名 SET
字段名 = replace(字段名, '要替换的字符串', '替换为')
WHERE 设定条件;

如将WordPress文章中的“搜索引擎优化”全部替换成“搜索引擎营销”,替换语句为:

UPDATE wp_posts SET
post_content = replace(post_content, '搜索引擎优化', '搜索引擎营销');

语句中还可以加入替换条件,如只替换限定ID小于200的内容:

UPDATE wp_posts SET
post_content = replace(post_content, '搜索引擎优化', '搜索引擎营销')
WHERE ID < 200;

根据不同的需求,设定替换条件,妙用无穷。

最近老樂勤快了点,SEO博客发的文章多了些,很多采集、聚合也都上门了,故常刻意在内容中加入链接,望大家见谅!

PHPWind论坛数据库优化时提示EXTENDED错误的解决方法

2008年10月25日 by 樂思蜀

近日樂思蜀将服务器MySQL版本升级后,SEO论坛在后台优化数据库时出现下面提示信息,到PHPWind官方论坛上去查找,只见提同样问题的,不见一个可行的解决办法。

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'EXTENDED' at line 1 ( 1064 )

因不影响正常使用,也就没太在意。今日偶然想起,打开 PHPWind 程序的此文件,解决了问题,现分享方法如下。

打开“安装目录/admin/repair.php文件”,将下面一行中的 EXTENDED 删除:

$query = $db->query("OPTIMIZE TABLE $table EXTENDED ");

参考了相关资料,EXTENDED 参数用在 MySQL 数据库修复数据表时(只对MyISAM和ARCHIVE类型的表有效),起逐行重建索引的效果,同样的参数有:

  • QUICK:最快的选项,只修复索引树。
  • EXTENDED:最慢的选项,需要逐行重建索引。
  • USE_FRM:只有当MYI文件丢失时才使用这个选项,全面重建整个索引。

老乐也是知其然不知其所以然,抱着试一试的想法去掉 OPTIMIZE 一行中的 EXTENDED 参数,一测试竟然好了。

难道 OPTIMIZE TABLE 不支持 EXTENDED 参数?希望熟悉的朋友留言告诉我一下,我的数据库版本是 5.0.67,谢谢!

Linux自动备份MYSQL方法

2008年02月19日 by 樂思蜀

MYSQL定期备份是一项重要的工作,但人工操作太繁琐,也难避免有所疏漏,使用下面的方法即可让系统定期备份数据。

1、创建备份文件夹

#cd /www
#makedir backup

2、编写运行脚本

#vi autobackup

写入以下内容:

filename=`date +%Y%m%d`
mysql_bin_dir/mysqldump –opt dataname -u user -ppassword | gzip > /www/mysqlbackup/name$filename.gz

保存退出 

说明:

(1)mysql_bin_dir:mysql的bin路径;

(2)dataname:数据库名;

(3)user:数据库用户名;

(4)password:用户密码;

(5)name:自定义备份文件前缀标识。

如上例,将自动备份mysql数据库,并以gzip压缩方式存储,文件名为name20080101.gz的形式。

3、为脚本添加执行权限

#chmod +x autobackup

4、让crontab来完成定期执行的任务

这一步中,Redhat的方法会不一样,后面专门给出。

编辑crontab:

#vi /etc/crontab

在最后一行中加入:

01 5 * * * root /www/autobackup

每天5点运行脚本,也可以修改5为其他指定时间。

Redhat方法

Redhat的crontab采用按时间调用4个目录(/etc/cron.hourly:每小时;/etc/cron.daily:每天;/etc/cron.weekly:每周;/etc/cron.monthly:每月)中脚本出来运行的方式。

Redhat中只需要将刚才编辑的脚本复制到相应的目录即可。

5、重启crontab

#/etc/rc.d/init.d/crond restart

完成

其实原理很简单,自己制作一个脚本,让Linux系统自动运行。我们还可以再扩展一下,编辑一个自动备份网站文件的脚本,让Linux来完成,每天自动备份整个网站,等等……