显示标签为“默认分类”的博文。显示所有博文
显示标签为“默认分类”的博文。显示所有博文

2009年1月7日星期三

mysql replication 故障处理一则

今早收到报警邮件,来至一台mysql slave

***_db : Slave io may not running.

 

 登陆到那台服务器上查看

mysql> show slave status\G

的确看到

Slave_IO_Running: No

 

不解,遂继续查看mysql slave 的error log

090107 11:57:41 [ERROR] Error reading packet from server: Client requested master to start replication from impossible position ( server_errno=1236)
090107 11:57:41 [ERROR] Got fatal error 1236: 'Client requested master to start replication from impossible position' from master when reading data from binary log
090107 11:57:41 [Note] Slave I/O thread exiting, read up to log '***-bin.000147', position 660737192

 

slave 去读取binary log,但是超出了master 上实际log的大小, 奇怪,我再登陆到master上查看


-rw-rw----  1 mysql mysql  660726317 Jan  7 08:04 ***-bin.000147
-rw-rw----  1 mysql mysql    7791850 Jan  7 08:54 ***-bin.000148
-rw-rw----  1 mysql mysql   19955513 Jan  7 11:59 ***-bin.000149

明白了,***-bin.000147 只有660726317  bytes,但是slave 要读取的是第660737192个byte, 当然失败了.估计是master 曾经出错重启了,丢失了部分的binary log.


接下来是如何处理, 安全可靠的办法当然是重新copy一份master数据到slave上,初始化一遍,从头开始.
在数据完整性要求不是这么强的前提下,可以用另外一个方法.
强制slave读取下一个log文件

mysql> CHANGE MASTER TO MASTER_LOG_FILE = '***-bin.000148' , MASTER_LOG_POS = 0;
mysql> slave start;

 
搞定!

2008年12月8日星期一

[转]这样的程序员创业有戏

原文地址 http://column.iresearch.cn/u/lei_jun/archives/2008/43765.shtml 雷军

 

文章提到5点对刚入门的程序员的要求.

1 只有真正喜欢才能写好程序

基本上每一个行业都一样,只有做喜欢的事情才能做好.

2 把程序当成艺术品,象写诗一样来写代码

这点我非常同意,代码不是光给自己看的. 写出大家都能看懂,都能从中学习到东西的代码才是好代码.

3 必须写够十万行代码,不要心存侥幸

基本功很重要!

4 时刻保持好奇心

世界变化太快了,跟不上就要落后

5 不要局限在技术本身,多花点精力关注用户

不单单关注用户,关注其他方面也很重要. steve jobs把他从书法学到的东西融汇到苹果公司来,取得了巨大的成功.

正文:


这是我为12月4日开始的“2008软件开发2.0技术大会”准备的讲稿。到了现场,我发现这个讲稿对现场近千人的技术高手不适合,只好临时讲了移动互联网的趋势。


 致刚入门的程序员五点建议


 每个IT企业,尤其是初创企业,非常苦恼:找不到好的程序员。现在大学、软件学院及各种培训机构,每年培养几十万的程序员,毕业的每个人都有同样困恼:找不到好的工作。问题出在哪里呢?其实,企业需要的是不是刚会写程序的人,需要来了就能干活的人,尤其能把活干好的人。而刚毕业的大学生多半刚学会如何写程序,的确很难企业需求。


企业到底需要什么样的程序员,一个刚入门的程序员如何成为企业需要的高手呢?还有很多程序员问我,“我需要具备什么样的能力就可以去创业?”我一直在琢磨类似的问题。我自己写过十年程序,也在金山管理过一千多人的研发队伍,最近也在做天使投资,仔细总结了如下五点建议与所有程序员分享。


 建议一、只有真正喜欢才能写好程序


 喜欢写程序,做程序员就是上天堂;


不喜欢写程序,做程序员就是下地狱。


程序员需要整天趴在电脑前,经常没日没夜的,非常辛苦,而且工作来不得半点虚假,少写一个标点符号都不行。喜欢的人,日子过得非常开心,每写一行代码,都会有新的成就,尤其当自己的作品被广泛应用的时候,那种自豪感油然而起。不喜欢的人,坐在电脑前极端无聊,被进度压得喘不过气来,天天为找bug改bug生气。


只有喜欢,只有热爱,才能把程序写好!


我建议不喜欢写程序的人早点转行,不要勉强自己,免得误人误己。


 建议二、把程序当艺术品,象写诗一样来写代码


 现在很少有公司做 codeview (对写好的程序做代码级检查),于是很多人在进度的压力下潦草应付,只要测试通过就算搞定。表面上看,开发速度很快,进度有保障;但实际上,这样的程序连开发者自己都很难读懂,一旦有bug,很难调试,将来维护升级都非常困难。这样的代码多半只能重写,浪费自然严重。


如果每个人写程序的时候当艺术品来写,写每行都认认真真、干干净净的,虽然速度略微慢了一点,但综合的开发成本会低很多。


如何写象诗一样美的代码呢?方法也很简单。


一、买几本经典的编程书,把书上所有例程全部重新写一遍,逐个比较和书上范例的差距,一步一步改善自己编程的风格和技巧。时间长了,自然就能写出象书上例程一样的代码,甚至可以比书上写得好。


二、基础扎实后,多看看Linux 等系统级的源代码,看看高手是如何写的,就有感觉了。


三、通读一下MSDN中所有的资料,这样,“读书破万卷,下笔如有神”。


还有,一定要牢记软件工程的铁律:可能出错的地方一定会出错。每个变量都做初始化,引用每个参数都会做有效性检查,在可能出错的每个地方都会做边界条件检查,这样开发出来的程序一定会稳固很多,就是出错也会很容易修改。野路子出来的高手,一般开发速度很快,但做完后bug很多,经常需要很长时间修改。而真正的高手,追求的境界是 bugfree code(零缺陷代码)。


 建议三、必须写够十万行代码,不要心存侥幸


 程序员象木工一样,熟能生巧。程序员必须写足够代码量的程序,才会有感觉,这是一个苦力活,没有任何捷径可走。


计算机是一门实践性的科学,没有动手能力做支撑,很难做出好的科研成果。我的一个学长是美国卡内基梅隆大学的博士,卡内基梅隆大学计算机系在全世界非常出名,他说每个博士生必须写十万行代码才能毕业,卡内基梅隆大学博士进任何一个大企业基本不用面试。而国内培养大部分的研究生、博士生,动手能力都偏弱。


没有写过足够代码量的,想成为高手是不可能的,只能纸上谈兵!


 建议四、时刻保持好奇心


 计算机技术更新换代非常快,每年都有各种各样的新技术出现。在我过去的职业生涯中,仅编程语言,我就用过 basic, masm, pascal, c++, vba, Delphi, java 等。需要时刻保持好奇心,不断学习各种新的东西,才能在未来的几十年职业生涯中不落伍。你要理解为什么 iPhone 出来很多高手用iPhone,现在一天到晚惦记着换部 gPhone 玩玩。


人的精力有效,高手往往工作压力也比较大,如何在有限的时间内掌握整个行业动态,的确是一个不简单的事情。我的经验是经常看业内的各种技术杂志,参加各种聚会,可以节约很多时间。最重要的是,交几个博学的技术高手,多和他们交流,一定获益匪浅!


 建议五、不要局限在技术本身,多花点精力关注用户


 做到前面几条,就已经是千金难求的高手了。但一个真正的高手需要知道用户需要什么,如何做出让用户满意的产品。


现在的软件研发越来越强烈团队协作,不少团队都配置了专门的需求分析的工程师、用户界面及用户体验的设计师,软件研发的分工越来越细。很多程序员以为只要把技术搞好,不用管用户需求和用户体验。实际上,需求方案及界面方案不可能写得非常细,具体的实施还是程序员自己来实现的。这个时候,好坏的差距很快就体现出来了。


我们写程序的最终目的是满足用户需求,不是简单完成需求规划方案中的功能。所以,程序员一定要认真揣摩用户心理,能明白用户的真实需求。


其次,怎么设计交互界面,让用户觉得好用,用起来舒服,这里面学问很大。我举一个小例子,每个程序窗口右上角都有三个按钮,如最小化、关闭等。乔布斯觉得不好看,不易用,他提出改用红绿蓝的交通灯。这样修改后,果然 Mac OS 漂亮和易用了很多。


目前互联网和手机上的应用开发,都非常强调小团队研发。这样研发模式速度会快很多,但对程序员的综合素质的要求也就更高了。


我强烈建议程序员不要仅仅局限在技术本事,还需要多点精力考虑和用户相关的问题,学会洞察用户的需求,并努力设计好用易用的产品。做着这点的程序高手,创业成算就很大了。


 这些就是我说的《创业十大标准》中提到的“技术过硬”要求。


这样的技术高手,如果捕捉到合适的产品方向,并且具备一定带团队的能力,创业成功机会很大!事实上,绝大部分创业的技术公司,创始人都是这样的人!比如迅雷的邹胜龙和程浩,UCWEB的何小鹏和梁捷等。


 程序员系列:


    《我十年的程序员生涯》


    《我写BITLOK那七年》


    《阳光灿烂的日子》


    《致刚入门的程序员五点建议》


 直接登录 www.leijun.com 访问雷军博客



 

2008年11月24日星期一

不要轻信PHP_SELF

看了tingo发的文章,PHP中$_SERVER的详细参数与说明, 有感而发..

我们编程的时候要紧记,任何用户端的输入都是不可靠的.





if (isset($_REQUEST['submitted']) && $_REQUEST['submitted'] == '1') {
echo "Form submitted!";
}
?>







看似准确无误的代码,但是暗藏着危险。让我们将其保存为 foo.php ,然后放到 PHP 环境中使用


foo.php/%22%3E%3Cscript%3Ealert('xss')%3C/script%3E%3Cfoo访问,会发现弹出个 Javascript 的 alert -- 这很明显又是个 XSS 的注入漏洞。究其原因,发现是在

echo $_SERVER['PHP_SELF'];这条语句上直接输出了未过滤的值。追根数源,我们看下 PHP 手册的描述

'PHP_SELF' The filename of the currently executing script, relative to the document root. For instance, $_SERVER['PHP_SELF'] in a script at the address http://example.com/test.php/foo.bar would be /test.php/foo.bar. The __FILE__ constant contains the full path and filename of the current (i.e. included) file. If PHP is running as a command-line processor this variable contains the script name since PHP 4.3.0. Previously it was not available.原因很明确了,原来是 $_SERVER['PHP_SELF'] 虽然“看起来”是服务器提供的环境变量,但这的确和 $_POST 与 $_GET 一样,是可以被用户更改的。

其它类似的变量有很多,比如 $_COOKIE 等(如果用户想“把玩”他们的 cookie,那我们也是没有办法)。解决方案很简单,使用 strip_tags、htmlentities 等此类函数过滤或者转义。

echo htmlentities($_SERVER['PHP_SELF']); 

 

2008年11月6日星期四

[转]expect实现ssh交互

转载至:http://www.hiadmin.com/expect%e5%ae%9e%e7%8e%b0ssh%e8%87%aa%e5%8a%a8%e4%ba%a4%e4%ba%92/

expect实现ssh自动交互
9月 4th, 2008 Posted in shell < by John.Lv >
由于最近刚接手一批oracle数据库服务器,只能使用指定用户oracle进行相关操作。而且ssh没有做public key,并且也没有权限做ssh的public key,使用shell脚本居然问我一次又一次的要密码,怎么脚本自动化?没办法,只能使用expect来实现了。
一般使用ssh的public key的ssh脚本如下:

#!/bin/sh
servers=`cat /etc/hosts | grep -v ^# | grep ^192.168.1 | cut -f1`
username="oracle"
echo exec cmd all...
for server in $servers; do
echo "##########################################"
echo $server
ssh $username@$server $1
echo "##########################################"
done
wait
echo complete!

上面是shell脚本,这里就不多解释了,相信大家都能看明白。$1可以是运行命令也可以执行脚本,随便你,只要你喜欢!
如果不允许或者没有权限使用ssh的public key,那么只能使用expect进行ssh自动交互了

#!/usr/bin/expect
set username "oracle"
#ssh的用户名
set passwd "oracle11"
#ssh的密码
set servers [exec cat /etc/hosts | grep -v ^# | grep ^192.168.1 | cut -f1]
#读取hosts中要访问的主机
foreach server $servers {
#循环
spawn ssh $username@$server "[lindex $argv 0]";
#执行ssh,注意expect中输入的第一个变量用$argv 0表示。
expect "*password: ";
sleep .1;
send "$passwd\r";
#当出现提示输入密码时,自动输入密码
interact;
}

ok,这样指定的一般用户在ssh且不能使用key时就不用一次次输入密码了。

2008年11月5日星期三

msn假死的简单解决办法

原文: http://hi.baidu.com/%C7%E1%C7%E1%B5%E3%B5%E3/blog/item/1c793987719b922fc75cc33f.html

最近msn经常假死,导致系统无反应,要过几秒才恢复,非常讨厌.

于是google一把, 在hosts文件加上如下

127.0.0.1 crl.microsoft.com

 

世界清净了..