Archive for 02月, 2009
IE的Cookie机制不支持带 ‘_’ 的二级域名
这周tapd发布新版本时,习惯性地先在预发布环境中先更新一把,减少更新的风险。
结果预发布环境中在IE怎么样也无法通过身份验证,但firefox下正常。后来一直追踪下去,发现IE下发送请求并没有附带任何cookie信息。后来大胆假设了一下,原因果然出在这个url当中:tapd3_prepublic.oa.com。是因为域名中出现的’_’字符。
后来我再用做了一次测试:
测试地址:www.google.cn
IE版本:6
查看cookie工具:httpWatch Perfessional
1.访问www.google.cn 的cookie信息
2.访问thinklet.google.cn 的cookie信息
因为cookie的作用域是google.cn,所以访问thinklet.google.cn这个url时,cookie是有效的。
3.访问think_let.google.cn 的cookie信息,空白!
理论上think_let.google.cn跟thinklet.google.cn是同一个域,但cookie信息却没有生效。
结论:IE6的cookie机制不支持带有’_’字符的域名。
实战!利用APC来缓存和优化 PHP 的中间代码
Alternative PHP Cache(APC)是 PHP 的一个免费公开的优化代码缓存。它用来提供免费,公开并且强健的架构来缓存和优化 PHP 的中间代码。
Ubuntu Apache2 配置Allowoverride
前两天下了个最新版本的cakephp作研究时,却被apach allowoverride的设置问题困扰了。无论怎么把Allowoverride写在哪里都不生效。
原因是ubuntu下apache2的rewrite模块默认是不加载的。
只要运行了一下这个命令:a2enmod rewrite 就可以启用rewrite模块了。
网查了一下资料,Apaceh2 多了一组 a2enmod, a2dismod指令,用于启用和禁用Apache的模块。a2enmod用于在Apache启用指定的模块,它实际上做的是在/etc/apache2/mods-enabled目录下创建模块文件的符号链接。相反a2dismo则是通过删除符号链接而达到禁用指定模块的功能。当然,启用已启用的模块或禁用已禁用的模块是不会报错的。^^
这里有必要说明一下:
/etc/apache2/mods-available 放apache可用的模块文件
/etc/apache2/mods-enabled 放apache已启用的模块文件的链接
弄明白了,去查看一下/etc/apache2/mods-enabled目录,果然有新增了一条rewrite.load的链接。
实战!如何恢复丢失的数据
今天2009年2月11号,我们TAPD3系统出了一个运营事故,数据库需求表的部份数据丢失了!
针对这类问题,我们一般是分两条线去处理。
1. 迅速作数据恢复。
2. 追查问题根源。
今天我先谈一下,我们的TAPD系统是如何作数据恢复的。
首先,必须要了解我们服务器数据备份的策略。我们服务器是采用公司统一的分布式的备份机制,直接备份指定的整个目录或文件。周六全备份,其他天每天凌晨增量备份。简单来说我们会将服务器上的重要文件每天放到另外一个服务器中去。公司是使用一些相关的软件来管理备份的。如果是简单的备份,我们用scp结合crontab也可以做到。
了解数据的备份策略后,那要作数据恢复那很简单了。说白了就是要备份的数据从备份服务器copy回来。公司备份机制是有专人在管理的,只要联系一下接口人就可以取回自已想要的数据备份。
如果只是文件的丢失,经过上述处理就可以了。
如果是Mysql数据库中数据丢失的话,像这次我们碰到的运营事故一样,就要多做一些额外的数据库处理了。总结了一下,大致步骤如下:
1. 取回想要的完好的Mysql数据备份。
我们的Mysql服务器数据存储目录为/data/db/。而每个库会以一个个目录的形式存在于Mysql数据存储目录:如tapd库的数据就存储在这样的目录下:/data/db/tapd/。 在库目录下面是一些的表文件,每个表都会有三个表文件(*.frm、*.MYD和*.MYI文件),如tickets表就会有这样的三个文件:tickets.frm、tickets.MYD和tickets.MYI。
这次运营事故中,是tapd库的数据丢失了,丢失时间是2009年02月11号,所以我们只要从取回tapd库在2009年02月10号凌晨的备份文件就可以了。tapd库备份文件是放在这个目录下:/data/db/tapd。
2. 通过备份文件恢复数据库。只要将mysql库备份目录copy到本地的Mysql数据存储目录就可以了。(这一过程强烈建议在开发机上处理)
要恢复的2009年02月10号tapd库,我们把备份的库文件(/data/db/tapd) copy到nvwa的mysql数据存储目录(/data/db/)目录下。为了避免重复,copy的同时要将文件目录改为tapd20090210。这样后,nvwa的mysql中就多了一个名字为tapd20090210的库,这个库就是2009年02月10号凌晨的数据。
3.将从备份文件恢复过来的数据库中的相关数据dump到正式服务器中。这一步可以使用mysqldump这个工具来实现,当然使用一些数据库管理软件也没有问题。
恢复10号的需求表的数据,我这里就简单用navicat把需求表的数据直接导入正式库中就完事了。到这里我们只是恢复10号凌晨以前的数据,而10号到事故发生的时间段内的数据还是丢了。要找回这些数据就要利用mysql的log了,一般是使用mysqlbinlog这个工具来实现的。这个Topic franky研究细致后再跟大家分享。^^
这是一次真实的数据恢复的过程,谈到的知识不是很全面。更多mysql数据备份恢复的知识,建议大家看mysql的用户手册,里面有数据备份与恢复的一章。
如何解决Ruby on Rails – Mysql::Error: Lost connection to MySQL server during query:
Ruby on Rails – Mysql::Error: Lost connection to MySQL server during query:
前段时间,我们的CE平台不断出现上述错误。原因是:mysql server 的链接断开后,Rails的Active Record没有检测到,断续执行数据库查询。
Mysql链接保持时间默认为3600秒,在/etc/my.cnf 里可以修改名为wait_time参数的值以改变链接保持的时间。
Rails中Active Record的并不会自动检测与数据库的链接是否是活动的,断开后也不会自动重新链接;如果mysql链接超时,自动断开后,Active Record并不知道,再执行时,就会抛出Mysql::Error: Lost connection to MySQL server during query:的错误。
解决方法时:修改Active Record检证时间。
修改config/environment.rb配置文件,将config.active_record.verification_timeout = XXX 这句加入到Rails::Initializer.run do |config| …. end中, 值设为小于或等于mysql wait time的值 。
例如,mysql server 的wait_time=120,那我们rails的设置应该如下:
Rails::Initializer.run do |config|
config.active_record.verification_timeout = 118 #注,理论上小于等于120都没问题的
………
end
