2008年12月19日星期五

mysql编译相关参数


--enable-assembler
Use assembler versions of some string functions if available.
--enable-profiling
Build aversion with query profiling code (req. community-features)

--with-charset=CHARSET
Default character set, use one of:binary armscii8 ascii big5 cp1250 cp1251 cp1256 cp1257 cp850 cp852 cp866 cp932 dec8 eucjpms euckr gb2312 gbk geostd8 greek hebrew hp8 keybcs2 koi8r koi8u latin1 latin2 latin5 latin7 macce macroman sjis swe7 tis620 ucs2 ujis utf8

--with-extra-charsets=CHARSET,CHARSET,...
Use charsets in addition to default (none, complex, all, or a list selected from the above sets)
--with-big-tables
Support tables with more than 4 G rows even on 32bit platforms
--with-embedded-server Build the embedded server (libmysqld)


上面的 big-tables对于我们一般32位系统

2008年12月17日星期三

mysql变量之max_connect_errors

max_connect_errors

默认值:10
作用:当某台主机尝试连接超过max_connect_errors后,mysql将屏蔽掉这个主机.
日志:mysqld启动时开启了--log-warnings,会得到一下信息

Host 'host_name' is blocked because of many connection errors.


解决方法:
1 shell> mysqladmin flush-hosts
shell> mysqld_safe --max_connect_errors=10000 &
2 mysql> flush hosts;
mysql> set global max_connect_errors=10000;

2008年11月26日星期三

mysql复制-SQL_SLAVE_SKIP_COUNTER

当mysql replication 的slave出现些可以忽略但是又影响同步的错误的时候,我们通常会执行
SET GLOBAL SQL_SLAVE_SKIP_COUNTER = N (N=1 .2 .3...)
来解决同步问题。
1.执行这条sql的时候需要slave的同步进程是关闭的
2.跳过bin-log的某个sql对于事务和非事务的处理是不同的,非事务眺一条sql,事务的话直接跳过这个事务
参考手册

2008年11月10日星期一

给自己制定的学习计划

为了更好的了解数据库,更好的学习mysql!
决定给自己指定学习计划,开始学习postgresql
基本上是每天翻两页手册,并且和mysql做一下类比:)

2008年10月20日星期一

innodb学习-innodb_thread_concurrency

innodb_thread_councurrency
innodb试图保证并发线程小于或者等于这个设置的值,一旦线程数达到这个限制值,则另外生成的线程将被放入一个FIFO的队列中等待执行,而这些被等待中的线程将不会被计算入并发线程。
而怎么样设置这个值是依赖系统环境和系统负载,我们需要尝试在一个范围内的不同的值来决定我们的系统应该设置成什么值。
这个范围是从0-1000,在某些版本如果这个值等于大于20,被认为是无限大,而某些版本,我们可以通过设置为0来禁用并发检查。
这个默认值在5.1.11之前是20,从5.1.11开始是8.
所以innodb_thread_concurrency,我们需要实际的测试才能决定使用什么样的值:)
下附上一个关于innodb_thread_concurrency的bug37411
Threads staying in the "Sending Data" for long periods of time

2008年10月17日星期五

mysql 4g问题

mysql的有4g最大表限制,这个限制是来源于操作系统

mysql> show table status like 'example_table'\G
*************************** 1. row ***************************
Name: example_table
Engine: MyISAM
Version: 10
Row_format: Dynamic
Rows: 2750508
Avg_row_length: 472
Data_length: 1300304684
Max_data_length: 281474976710655
Index_length: 516225024
Data_free: 0
Auto_increment: 2800006
Create_time: 2008-02-27 10:45:44
Update_time: 2008-07-11 15:41:30
Check_time: 2008-02-27 11:05:27
Collation: utf8_general_ci
Checksum: NULL
Create_options:
Comment:

mysql> alter table example_table max_rows=210000000 avg_row_length = 1024;
Query OK, 2750508 rows affected (15 min 28.11 sec)
Records: 2750508 Duplicates: 0 Warnings: 0


mysql> show table status like 'example_table'\G
*************************** 1. row ***************************
Name: example_table
Engine: MyISAM
Version: 10
Row_format: Dynamic
Rows: 2750508
Avg_row_length: 472
Data_length: 1300304536
Max_data_length: 1099511627775
Index_length: 461033472
Data_free: 0
Auto_increment: 2800006
Create_time: 2008-10-17 13:27:33
Update_time: 2008-10-17 13:29:47
Check_time: 2008-10-17 13:42:58
Collation: utf8_general_ci
Checksum: NULL
Create_options: max_rows=210000000 avg_row_length=1024


这个修改可真是消耗时间,有时间还是应该早做处理,早做打算。
当然,在迁移数据的时候,我们应该有可以变通的方法。

2008年10月13日星期一

转贴:上传漏洞(php.rar格式文件)

原文地址:http://zhixinku.com/home/space.php?uid=4&do=blog&id=20

一般的网站都会开放rar附件上传,并可能会保留原来文件名称,这从而可能导致一个很严重的问题,xxx.php.rar文件会被Apache当作php文件来执行, 造成极大的安全隐患 .

如何测试? 将你的某个php程序文件后缀名修改成 xxx.php.rar , 这时测试一下, 还是按照PHP文件解析执行,Apache并不会认为这是一个rar文件, 这是为什么呢?

原来,每遇到一种后双重后缀名(如xxx.php.rar)的文件,Apache都会去conf/mime.types 文件中检查最后一个后缀,如果最后一个后缀并没有在mime.types文件中定义, 则使用前一个后缀来解释 ,因为在默认情况下,rar并未在mime.types中定义, 故Apache会使用php后缀来解释文件, 这就是漏洞的原因所在.

由此类推,如果使用xxx.jsp.ppp.rar 则会认为是jsp文件, 如果修改成xxx.shtml.rar ,则会识别成shtml文件.

a.php.c.d.e.rar 也是会被当成PHP文件解释的!
想想,不知道有多少网站存在这个问题?

那么针对网络管理员,如何杜绝这个隐患 ?
1.修改mime.types文件,在最后面加一条:
application/rar rar
然后重新启动Apache,即可.

针对WEB管理员及WEB程序开发者,如何更安全?
1.只允许上传指定后缀名的文件,当然,要禁止掉rar格式文件上传.(但这条往往行不通,一般的网站都需要上传rar文件)
2.对上传后的文件进行强制重命名, 强制使用最后一个扩展名,如原始文件名为xxx.php.rar ,上传后强制重命名为 20080912.rar即可避免这个隐患.

早期版本的phpcms 2007, discuz, ecshop都存在这个漏洞, 或许你的网站被挂马,就是因此引起.

希望本文对你有用.


不要指出的是只要不能解释的后缀都会重新解释前一个后缀
这样a.php.rar2 或者 a.b.php.gzip111都有可能直接解释成php
除了文中给出的方法外,最好能把上传的文件单独用没有添加php扩展的webserver来提供服务!

apache模块之mod_mime_magic

mod_mime_magic 在mod_mime不能确定文件类型的时候,读取文件的头几个字节来判断文件类型,觉得用处不是很大,还影响性能!
详见手册mod_mime_magic

2008年10月12日星期日

nfs的server端没有响应

突然接到alert:apache进程数过多!
查看server apache进程数过多,查看mysql的状态,正常。查看apache日志,正常,但是又有alter,该台server连不上内网中的一台nfs!
本能的df了一下,卡在某个nfs那里!
查看了nfs server,正常!
于是决定重新挂载nfs
这里需要注意的是,需要详细的写清楚nfs的路径ip:path ,而不能直接卸载映射到本地的目录!
卸载后再挂载,这时一切正常!
继续查看原因
在nfs server 的message中有网卡重启的信息

Oct 12 11:46:39 **** kernel: NETDEV WATCHDOG: eth1: transmit timed out
Oct 12 11:46:40 **** kernel: bnx2: eth1 NIC Link is Down
Oct 12 11:46:41 **** kernel: bnx2: eth1 NIC Link is Up, 100 Mbps full duplex
主机名用****代替

nfs client 的message中同样有相关信息

Oct 12 11:11:23 **** kernel: nfs: server *.*.*.* not responding, st
ill trying
Oct 12 11:11:56 **** last message repeated 13 times
Oct 12 11:12:01 **** last message repeated 2 times

问题:
1.相互出问题的时间并不一致
2.交换机并不存在问题,连接在同一交换机上的其他设备没有这样的日志.
结论:迷惑中:暂时只能先解决问题,初步认为网卡有些问题,需要再观察!

2008年10月10日星期五

查看mysql中当前用户

今天突然想看看连接mysqld的是哪个用户,于是随手 show user();发现不能用!
切记:
mysql下查看当前session的用户是

select user();
select current_user;
select current_user();
都是一样的效果。

而orcale 可以用
SHOW USER

有时候用得少,真混乱了,记录下:)
mysql中查看所有用户

SELECT * from mysql.user;

2008年10月9日星期四

libtoolize 与libtool

今天在找libtoolize属于哪个rpm包的时候,发现邮件列表里面有一段不错的话,特此记录下。

libtool and libtoolize are two very different things. But since libtoolize
is an add-on of libtool, it's included in the libtool package. Renaming
the package to libtoolize would be stupid because the package is way more
than that.
Renaming the libtoolize command to libtool would be stupid because it's
named libtoolize everywhere else, and because libtool is something else.

顺便说下libtoolize是属于libtool这个包的,我的系统libtool-1.5.6-4.EL4.2

2008年10月7日星期二

php的pdo_mysql的扩展

最近有朋友重新安装了服务器,发现连接mysql出问题,不能使用pdo_mysql.查看了下phpinfo,发现仁兄编译的时候没给zlib,后期动态扩展pdo_mysql的时候貌似是加入了php_mysql,但是连接的时候还是报异常!
简要讲下pdo_mysql的安装

./configure --with-zlib --with-pdo-mysql[=DIR]

或者参考手册动态加载,但是一定要注意,pdo-mysql需要zlib
参考手册

2008年9月27日星期六

vim环境ctags taglist 整合

需要在linux改c程序,所以需要弄下vim的环境.
系统 centos 5.2
安装ctags

yum install ctags

获得taglist

wget "http://www.vim.org/scripts/download_script.php?src_id=7701"
unzip taglist_45.zip
在你的用户目录下创建.vim目录(如/home/gogo407/.vim ; /root/.vim)
分别把taglist_45.zip解压出来的doc,plugin移入.vim文件夹中,如果.vim中已经存在doc和plugin文件夹,则讲doc中的文档和plugin中的插件,移入.vim中的相应位置
修改plugin中的taglist.vim中的76行,添加 let Tlist_Ctags_Cmd = "/usr/bin/ctags"
72 " function is not available, then don't load the plugin.
73 if !exists('*system')
74 echomsg 'Taglist: Vim system() built-in function is not available. ' .
75 \ 'Plugin is not loaded.'
76 let Tlist_Ctags_Cmd = "/usr/bin/ctags"
77 let loaded_taglist = 'no'
78 let &cpo = s:cpo_save
79 finish
80 endif


用cronolog为例子

cd cronolog-1.6.2/
cd src/
ls *.c|ctags -R



准备就绪,我们看看效果

vim cronolog.c
:set nu
:TlistToggle


这个就是我们能看到的图像了
还有一些基本的命令,是我以前没有到的如

ctrl +ww 切换窗口
还有就是最有用的
:help
:help tag

参考资料 :http://www.softpanorama.org/Editors/ctags.shtml

2008年9月26日星期五

系统问题:Set_rtc_mmss: can’t update from 0 to 59

一朋友的服务器频繁的报:Set_rtc_mmss: can’t update from 0 to 59,帮朋友处理下

/usr/bin/rdate -s rdate.darkorb.net 先和标准世界时间同步下 linux下
hwclock -w
date
hwclock --show

把系统时间和cmos时间同步下就可以了!问题解决了。
具体代码

2008年9月16日星期二

nfs优化

参考: IBM的lamp优化文档
每个客户机应该用 rsize=32768,wsize=32768,intr,noatime 挂装远程文件系统,从而确保:

* 使用大的读/写块(数字指定最大块大小,在这个示例中是 32KB)。
* 在挂起时 NFS 操作可以被中断。
* 不持续更新 atime。

对 intr我可是深有感触,查看没有使用intr导致的问题及其处理
下面是起用noatime,并添加到fstab中
/dev/VolGroup00/LogVol00 / ext3 defaults,noatime 1 1
LABEL=/boot /boot ext3 defaults,noatime 1 2
devpts /dev/pts devpts gid=5,mode=620 0 0
tmpfs /dev/shm tmpfs defaults 0 0
proc /proc proc defaults 0 0
sysfs /sys sysfs defaults 0 0
LABEL=SWAP-hdb2 swap swap defaults 0 0
LABEL=SWAP-hda3 swap swap defaults 0 0

mysql性能之内存

通过最近的工作,发现内存对mysql来讲是相当重要的!以前觉得只要满足mysql的基本需要,就应该没有问题。所谓满足mysql的基本需要,就是基本上没有使用到swap.
而实际上系统cache对mysql的性能也会有比较大的帮助。
以前一台mysql 3G 内存(32系统默认的内存不支持4G以上大内存),在insert 或者update的高峰期,会导致系统负载从1上升到几十,而且这种情况多发生在cache不够用(我们的应用是cache<2500M),同时出现扫表或者建立硬盘临时表的时候。
当给系统的内存加至4G后(cache始终〉3000M),系统负载很少大于1,几乎没有超过2的。
所以我比较迷惑的有两点
1.cache对mysql的帮助?减少硬盘扫描的时间,怎么减少?
2.如何判断多少的cache值才是当前系统的合理值

php之allow_url_fopen

默认的php配置文件中有
allow_url_fopen = On
allow_url_include = Off

很显然,默认配置中是关闭了include远端的php文件,但是还是支持url_open.所以可能还是可以通过一些操作,通过url_fopen实现url_include。这样可能会引发一些webserver的安全问题。
但直接关闭url_fopen可能又会影响一些正常应用。
总之url_fopen和url_include需要稍加注意。

2008年9月9日星期二

怎么样在mysql中建表中使用IDENTITY

  时常有人需要在mysql中使用identity.如
create table admin
(
adminId int not null identity(1000,1),
adminName varchar(40) not null,
adminPass varchar(40) not null,

);

总是identity出错...想请教下为什么? 在mysql数据库下 把identity(1000,1),去掉就行.

可是我语法有错误么?

 从t-sql手册中这里可以了解identity的意思。
 换句话说,其实就是mysql中的auto_increment,详细方法参考这里
 对于问题的解决
 

  create table admin ( adminId int not null auto_increment,adminName varchar(40) not null, adminPass varchar(40) not null ,primary key (adminId) );
  alter table admin AUTO_INCREMENT=1000

  特记录:)

2008年9月8日星期一

linux发行版本号查看

以前不太知道的,但是想知道的

cat /etc/issue
CentOS release 5 (Final)
Kernel \r on an \m

这两个不是同一台:)

cat /etc/redhat-release
CentOS release 4.5 (Final)


cat /proc/version
Linux version 2.6.18-8.el5 (mockbuild@builder4.centos.org) (gcc version 4.1.1 20070105 (Red Hat 4.1.1-52)) #1 SMP Thu Mar 15 19:57:35 EDT 2007


uname -a
Linux db-mysql-1 2.6.18-8.el5 #1 SMP Thu Mar 15 19:57:35 EDT 2007 i686 i686 i386 GNU/Linux


一台centos 4.5
lsb_release -a
LSB Version: :core-3.0-ia32:core-3.0-noarch:graphics-3.0-ia32:graphics-3.0-noarch
Distributor ID: CentOS
Description: CentOS release 4.5 (Final)
Release: 4.5
Codename: Final
另一台centos 5.0
lsb_release -a
LSB Version: :core-3.1-ia32:core-3.1-noarch:graphics-3.1-ia32:graphics-3.1-noarch
Distributor ID: CentOS
Description: CentOS release 5 (Final)
Release: 5
Codename: Final


以前不清楚,标记下:)

2008年9月1日星期一

nfs故障处理

状况: 因为各种原因导致一台nfs不能使用,而以前挂这这nfs的前端web负载节节升高,经过观察发现,每当执行地方这个命令的时候,总是执行不完.
情况类似于Blog ^A jianingy's
解决:
killall -KILL rpciod
杀掉rpcio的话可以解决df堆积的问题,但是不能根除,因为下次执行df的时候rpcio还是会出现.特别是如果你在crond中使用了df的时候.
根本解决,卸载出问题的nfs,如果你出问题的nfs为
222.222.222.222:/opt/nfs
,那你可以直接卸载掉,
umount 222.222.222.222:/opt/nfs
这样执行df的时候就不会再出问题了.
反思:

soft If an NFS file operation has a major timeout then report an I/O error to the calling program. The default is to continue retrying NFS file operations indefinitely.
hard If an NFS file operation has a major timeout then report "server not responding" on the console and continue retrying indefinitely. This is the default.
intr If an NFS file operation has a major timeout and it is hard mounted, then allow signals to interupt the file operation and cause it to return EINTR to the calling program. The default is to not allow file operations to be interrupted.

使用intr应该不会出现类似的问题.不过还好,我们可以解决问题.所以做sa&dba一定要思考严密

linux下切换用户启动服务

在linux用其他用户启动进程
如启动svn服务


#!/bin/sh
su svnuser -c '/opt/svn/bin/svnserve -d -r /opt/www/svnroot'


切换到svnuser这个用户去启动svn服务

2008年8月27日星期三

free-linux下基本命令

linux下面的内存查看,有时候让我比较迷茫

# free
total used free shared buffers cached
Mem: 3107520 1930720 1176800 0 732640 1050708
-/+ buffers/cache: 147372 2960148
Swap: 4194296 60 4194236

第一行是比较好理解的 总共的内存 3107520k 用掉了1930720k 空闲的1176800k 废弃 0K buffers 732640k cached 1050708k
第二行的理解有时候就让我迷糊,不过从扶凯的blog上,让我了解得比较清楚了
用掉了1930720k-buffers(732640k)-cached(1050708k)=147372K 这是程序已经使用了的内存,
而空闲的1176800k+buffers(732640k)+cached(1050708k)=2960148k (这表示是可以使用的,也许没有cached后,性能会降低,但是系统还是认为这些内存是可以使用的)。
顺便
-s update every [delay] seconds
-c update [count] times
这两个参数是比较好用的



参考:扶凯的blog

2008年8月21日星期四

mysql replication常见问题及其解决(一)

mysql replication同步出现问题的原因很多,其中有部分原因是因为master本身就出现了问题,今天遇到的问题就是master上的索引和数据出现了不一致,导致slave上同步也出现了问题。
解决问题很比较容易,按出错提示修复了下。
如下:
0:55:06 [ERROR] Slave: Error 'Incorrect key file for table 'space'; try to repair it' on query. Default da
tabase: ‘abc_table'. Query: 'update space set modified = '08-7-30 16:31:38' where id='11111'', Error_code: 1034


mysql> repair table space;
+-----------------+--------+----------+-------------------------------------------------+
| Table | Op | Msg_type | Msg_text |
+-----------------+--------+----------+-------------------------------------------------+
| aa.abc_table | repair | info | Wrong bytesec: 0- 0- 0 at 13830188; Skipped |
| aa.abc_table | repair | status | OK |
+-----------------+--------+----------+-------------------------------------------------+
2 rows in set (8.40 sec)

问题虽然解决了,问题怎么样杜绝或者怎么样更好的预防和监控才是关键。
btw:我很想知道Error_code: 1034的具体意思

2008年8月13日星期三

windows XP home是没有组策略(Gpedit.msc)

windows XP home是没有组策略(Gpedit.msc)
我想删除administrator,怎么办呢!
开始菜单中运行
control userpasswords2

删除用户就可以:)

awk实际应用


netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'

查看当前的连接,一直都不太清楚awk,所以基本上都只是会用的级别。
awk 后面的接的命令可以有
'或者"括起来
,这个都是允许的。
NF 当前行有多少列
NR 当前是第几行
FS 分割字符
这样就容易理解了netstat -n 出来的数据交给awk处理,
当awk读入一行数据,看开头是不是匹配tcp ,如果匹配,则在S[某种状态]自增,最后全部算完后,弄个 for循环,读出来.
在我的机子上等同于

netstat -n | awk '/^tcp/ {++S[$6]} END {for(a in S) print a, S[a]}'

类似的还有
awk ' { arr[$1]=arr[$1]+$2 } END { for( key in arr) { print key , arr[key] } } ' filename


弄来弄去,总算是感觉自己awk算入门了.

2008年7月18日星期五

[持续更新]各大爬虫的ip表--yahoo系

yahoo中国或者叫阿里yahoo的爬虫。
title是Yahoo! Slurp China; http://misc.yahoo.com.cn/help.html


202.160.178.104
202.160.178.108
202.160.178.111
202.160.178.112
202.160.178.114
202.160.178.116
202.160.178.136
202.160.178.140
202.160.178.144
202.160.178.145
202.160.178.161
202.160.178.166
202.160.178.170
202.160.178.183
202.160.178.185
202.160.178.189
202.160.178.193
202.160.178.198
202.160.178.201
202.160.178.206
202.160.178.208
202.160.178.21
202.160.178.210
202.160.178.214
202.160.178.236
202.160.178.243
202.160.178.248
202.160.178.26
202.160.178.28
202.160.178.37
202.160.178.61
202.160.178.65
202.160.178.70
202.160.178.74
202.160.178.83
202.160.178.84
202.160.178.88
202.160.178.89
202.160.179.100
202.160.179.122
202.160.179.130
202.160.179.134
202.160.179.140
202.160.179.142
202.160.179.145
202.160.179.152
202.160.179.155
202.160.179.164
202.160.179.23
202.160.179.24
202.160.179.3
202.160.179.40
202.160.179.47
202.160.179.5
202.160.179.6
202.160.179.63
202.160.179.67
202.160.179.70
202.160.179.71
202.160.179.84
202.160.179.89
202.160.179.92
202.160.180.111
202.160.180.115
202.160.180.121
202.160.180.128
202.160.180.138
202.160.180.14
202.160.180.141
202.160.180.142
202.160.180.148
202.160.180.153
202.160.180.161
202.160.180.163
202.160.180.164
202.160.180.179
202.160.180.180
202.160.180.181
202.160.180.186
202.160.180.187
202.160.180.208
202.160.180.23
202.160.180.34
202.160.180.43
202.160.180.54
202.160.180.57
202.160.180.58
202.160.180.64
202.160.180.73
202.160.180.77
202.160.180.80
202.160.180.81
202.160.180.99
202.160.181.184
202.160.181.189
202.160.181.190

还有yahoo,应该算是美国
title是Yahoo! Slurp; http://help.yahoo.com/help/us/ysearch/slurp

74.6.22.112
74.6.16.161
74.6.16.171
74.6.17.125
74.6.17.233
74.6.17.24
74.6.18.113
74.6.18.166
74.6.18.183
74.6.18.99
74.6.18.99
74.6.19.109
74.6.19.230
74.6.19.87
74.6.20.114
74.6.20.116
74.6.20.161
74.6.20.61
74.6.22.48
74.6.23.118
74.6.23.118
74.6.23.152
74.6.23.179
74.6.23.36
74.6.23.87
74.6.24.101
74.6.24.101
74.6.25.187
74.6.25.252
74.6.25.252
74.6.25.52
74.6.26.175
74.6.26.244
74.6.26.28
74.6.26.44
74.6.26.44
74.6.28.158
74.6.28.224
74.6.28.246
74.6.28.29
74.6.29.177
74.6.29.234
74.6.29.239
74.6.29.47
74.6.29.62
74.6.7.160
74.6.7.229
74.6.7.254
74.6.7.254
74.6.7.89
74.6.9.44
74.6.9.52
74.6.9.58

2008年7月14日星期一

lamp-隐藏php的版本

默认的lamp假设起来的web服务器,头信息中会显示

X-Powered-By: PHP/5.2.6

需要在php.ini中设置
expose_php = Off

并且重启apache
参考 1.apache tip
2.资料

[虚惊]硬盘挂了

早上来公司,同事在msn上留言,说测试服务器上的mantis,数据库出问题了!
连上服务器,top ,dmesg...几乎大多数命令都不能用,以为是path设置有问题,强强行输入全路径,还是不能用,跑到目录里面一看,文件夹里面很多打不开。cd 进去ssh就断。
出错信息和这位兄弟的类似
心想,这下硬盘糟了!看看mysql目录下面的数据库还能看见,马上copy了一份到另外的机子上!
测试服务器连上显示器,满屏幕的error.
重启后,更本不认这块硬盘了!(一共有两块硬盘,第一块已经不认了),把硬盘取下,连到自己的机子上面,发现能认出来,也能进入硬盘,东西还在!(高兴)。立马把需要的东西,全都copy出来,对硬盘fsck一下,没有问题!
把这块硬盘挂回去,好了!
故障分析,可能连接硬盘的线没有插好,导致系统找不到硬盘(类似硬盘坏掉的现象)
虽然是测试服务器,但我也真吓了一跳。
虚惊一场,不过不管做啥,备份很重要:)

2008年6月19日星期四

linux系统服务-acpid

acpid是管理系统电源的,通常笔记本需要启动
acpid :acpid(Advanced Configuration and Power Interface)是为替代传统的APM电源管理标准而推出的新型电源管理标准。通常笔记本电脑需要启动电源进行管理。
作为服务器可以关闭

2008年6月17日星期二

apache日志中记录X-Forwarded-For

有些时候,我们会在squid后面接apache,或者lighttpd等webserver.我们希望原始服务器能够记录下真实用户的ip,于是有需要头信息中的X-Forwarded-For。
当然,需要squid能把X-Forwarded-For传出来(squid当然可以替换掉X-Forwarded-For或者修改X-Forwarded-For)
那么apache的日志格式如下
原来的

LogFormat "%a %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined

修改后

LogFormat "\"%{X-Forwarded-For}i\" %l %u %t \"%r\"%>s%b\"%{Referer}i\" \"%{User-Agent}i\"" combined


参考:1
apache日志文档

2008年6月9日星期一

mysql版本

今天在csdn上看见有人在问mysql alpha,beta ,RC,GA等版本号之间的区别,感觉自己知道,但是也不是非常清楚,就翻了下手册,看了下,顺便做个记录。
alpha 暗示这是一个以展示新特性为目的的版本,存在比较多的不稳定因素,还会向代码中添加新新特性

beta 以后的beta版、发布版或产品发布中,所有API、外部可视结构和SQL命令列均不再更改,不再向代码中添加影响代码稳定性的新特性。

rc 是指 Release Candidate. Release candidates被认为是稳定的, 通过了mysql所有的内部测试, 修正了所有已知的致命bug. 但是rc版本还没有经历足够长的时间来确认所有bug都已经发现,但是对rc版本只会做些小的bug修正

GA如果没有后缀,则暗示这是一个大多数情况下可用版本或者是产品版本。. GA releases是稳定的, 并通过了早期版本的测试,并显示其可用性, 解决了所有严重的bug, 并且适合在生产环境中使用. 只有少数较为严重的bug修改才会添加到该版本中。

通常来讲我们在生产环境中还是建议使用GA版本:)






参考来源:英文5.1手册
翻译的手册

2008年6月3日星期二

net-snmp启动不起来

今天遇到一问题
系统centos5
net-snmp net-snmp-5.3.1-19.el5_1.4

[dba@db-mysql2 log]# service snmpd stop
Stopping snmpd: [FAILED]
[dba@db-mysql2 log]# service snmpd start
Starting snmpd: [ OK ]
[dba@db-mysql2 log]# service snmpd restart
Stopping snmpd: [FAILED]
Starting snmpd: [ OK ]

snmpd 启动不起来,但是也没有出错日志
google了下,资料不多,
1有人通过重新编译源码包解决了问题.
2 在centos的bug中,有人提到
Seems to be a dependency problem - just updating net-snmp doesn't update net-snmp-libs. The combination of net-snmp 5.3.1-19.el5_1.4 and net-snmp-libs 5.3.1-19.el5_1.3 leads to the described error, updating net-snmp-libs solves it
.也就是rpm包依赖性的问题,通过 install net-snmp-libs 可以解决问题。
所以未避免出现问题 net-snmp-libs 和 net-snmp需要同时安装


centos bug2700

2008年5月29日星期四

乱码-utf8

乱码,乱码!乱马1/2
做web难免会遇到乱码,可最近迁移完服务器后,用户post上来的数据有人出现的是乱码(几率很小)。
squid -> apache ->php->mysql
apache 中页面编码的设置为utf8
真是奇怪了,mysql

mysql> show variables like 'collation%';
+----------------------+-----------------+
| Variable_name | Value |
+----------------------+-----------------+
| collation_connection | utf8_general_ci |
| collation_database | utf8_general_ci |
| collation_server | utf8_general_ci |
+----------------------+-----------------+

mysql> show variables like 'character\_set\_%';
+--------------------------+-------+
| Variable_name | Value |
+--------------------------+-------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_results | utf8 |
| character_set_server | utf8 |
| character_set_system | utf8 |


apache 的页面是设置的utf8
实在是头疼不知道问题出现在哪里,不过有传输的地方就有编码的不一直,只有先在每一段设置下监控,看乱码最先是在哪里产生的!
初步猜测应该是在squid->apache这里由于网络问题产生的:)
先在这里记录下,前端稍微也做下调整。
update(2008-06-09):可能是别人写得发帖机器人post过来数据的编码存在一些问题。
update(2008-11-26):问题已经彻底解决,原因是之前有个和电信互联星空的一个合作项目,他们的页面编码是gb2312的,服务器是以前的老web服务器(域名不一样),由于我们迁移后,数据库的编码做了统一,而从合作项目post过来的数据作为gb2312过来的,所以插入数据库的时候数据乱码了!把post过来的数据做了下处理就好了:)

2008年5月27日星期二

mysql 安装

安装mysql时可能会遇到下面的问题(os :centos 5.0)
checking for termcap functions library... configure: error: No curses/termcap library found

解决方法:
yum install ncurses-devel

2008年5月5日星期一

header信息不一致

遇到一个trouble
一个css 访问的过程是squid ->apache(deflate)
直接访问apache是可以得到正确的header

HTTP/1.1 200 OK
Date: Mon, 05 May 2008 07:32:32 GMT
Server: Apache
Last-Modified: Thu, 27 Mar 2008 02:32:28 GMT
ETag: "278c15c-19da-ff234700"
Accept-Ranges: bytes
Cache-Control: max-age=5184000
Expires: Fri, 04 Jul 2008 07:32:32 GMT
Vary: Accept-Encoding
Content-Encoding: gzip
Content-Length: 1834
Connection: close
Content-Type: text/css


而经过了squid 后,时而好,时而不好
下面是不好

Date: Mon, 05 May 2008 07:30:29 GMT
Server: Apache
Content-Type: text/plain; charset=UTF-8
Last-Modified: Thu, 27 Mar 2008 02:32:28 GMT
ETag: "278c15c-19da-ff234700"
Accept-Ranges: bytes
Content-Length: 6618
Cache-Control: max-age=5184000
Expires: Fri, 04 Jul 2008 07:29:29 GMT
Age: 60
***-Cache: MISS from nj-1.***.com
***-Cache-Lookup: MISS from nj-1.***.com:80
Via: 1.0 nj-1.***.com:80 (*** Cache)


过squid好的情况

HTTP/1.0 200 OK
Date: Mon, 05 May 2008 07:33:40 GMT
Server: Apache
Last-Modified: Thu, 27 Mar 2008 02:32:28 GMT
ETag: "278c15c-19da-ff234700"
Accept-Ranges: bytes
Cache-Control: max-age=5184000
Expires: Fri, 04 Jul 2008 07:33:40 GMT
Vary: Accept-Encoding
Content-Encoding: gzip
Content-Length: 1834
Content-Type: text/css
***-Cache: MISS from nj-1.***.com
***-Cache-Lookup: MISS from nj-1.***.com:80
Via: 1.0 nj-1.***.com:80 (*** Cache)
Connection: close


已知的情况
1.url带问号,如:

www/style/layout1.css?v=20080327_v1.css

2.apache已设置mod_deflate,和 mod_mem_cache,apache的addtype是正确的

CacheEnable mem /
MCacheSize 10240
McacheMaxObjectCount 5000


猜测原因1,mod_mem_cache的问题,squid设置的问题
需要进一步关注:)

2008年4月17日星期四

低版本php添加json

一个php5.1.2的版本需要添加json.so,虽然json也有纯php的实现,但是我们还是希望能后添加php的扩展。
JSON (JavaScript Object Notation) ,详细介绍,请查看该链接
json的php的扩展是php5.2以后才在ext目录下有的!
为了偷懒,我大概查看了php源码下ext/json的源码,貌似是可以作为扩展安装在php5.2版本下面的。
于是我就给php5.1.2安装了一个json扩展,代码来之于php5.2.5的源码。经过测试以前正常,有时间看看json,包括它的php的扩展的实现:)

2008年4月15日星期二

脚本批量替换

每个人都要为过去的事情买单。
需求:修改文件夹中所有文件,把http://a.b.c/d 替换成https://e.f.g/h
文件有很多,人来做是不太现实的了
参考了下面
车东的文章,评论也很精彩。
RainX的blog
总结下来有这么几种做法
用sed

sed --in-inplace -e 's#http://a.b.c/d #https://e.f.g/h#g' *

可以结合find查找自己需要的文件
用perl

perl -e ’s#http:\/\/a\.b\.c\/d#https:\/\/e\.f\.g\/h#i’ -pi.bak `(find . -type f )`

2008年4月11日星期五

squid cvs库

squid源码在cvs库中,而不是我们现在常用的svn中!准备添加一个小patch,所以需要check out一下源代码
cvs -d:pserver:anonymous@cvs.devel.squid-cache.org:/cvsroot/squid
login
密码为空
cvs -d:pserver:anonymous@cvs.devel.squid-cache.org:/cvsroot/squid co -d squid-2.6 squid
squid就是当前的2.6版本
cvs -d:pserver:anonymous@cvs.devel.squid-cache.org:/cvsroot/squid co -d squid-3 squid3

cvs -d:server co(check out) -d 本地目录 项目名
具体使用看cvs在squid-cache上的老的说明
貌似wiki上面的说明有点问题。
开始研究squid源代码了。

2008年4月6日星期日

mysql优化-索引优化

pabloj的blog上讲了两个关于索引优化的案例
第一个倒是我们在实际工作中经常会遇到的,由于项目的数据库设计者经验有限,时间也不是很充裕,所以在两个表的同一个字段经常会设置成两个不同的数据类型,这在联表的时候是不会使用到这个索引的,经常出问题的是int和char ,int和bigint ,char和varchar.
第二个,如果我们出现全表扫描的时候,一定需要去确认下,我们索引是否适用得合适!
其实没有什么高深的东西,但是使用不恰当或者没有注意真得会带来意想不到的性能损失!

2008年4月5日星期六

mysql脚本-mysqld_safe

mysqld_safe脚本是我们启动mysqld的一个脚本。他的作用在于: scripts to start the MySQL daemon and restart it if it dies unexpectedly(能够重启mysqld,如果mysqld意外的die掉。这在一些不稳定的进程中是比较常遇到的,比如某天我的lighttpd就意外退出,日志总没有任何记录,所以我们可能需要其他进程帮我们进行看管)
脚本共430行,下面可能对脚本进行下分析,力求能读懂他的实现过程.
1-12 :是注释和版权说明

13 KILL_MYSQLD=1;
14 MYSQLD=
15
16 trap '' 1 2 3 15 #捕捉信号 1 2 3 15,进行忽略 ( trap -l或kill -l能得到详细的信号表)
17
18 umask 007 #设置掩码
19
20 defaults=
21 case "$1" in
22 --no-defaults|--defaults-file=*|--defaults-extra-file=*)
23 defaults="$1"; shift
24 ;;
25 esac #读入主配置文件


####help的说明文档
27 usage () {
}



###函数parse_arguments()解析参数,需要带入arg
50 parse_arguments() {
51 # We only need to pass arguments through to the server if we don't
52 # handle them here. So, we collect unrecognized options (passed on
53 # the command line) into the args variable.
54 pick_args=
55 if test "$1" = PICK-ARGS-FROM-ARGV ##54-59我好像很少用到,看第一个参数是不是PICK-ARGS-FROM-ARGV,如果是,令pick_args=1,并且让参数数组左移一位
56 then
57 pick_args=1
58 shift
59 fi
60
61 for arg do ##arg是赋值进来的参数,并用同样的方法解析参数
62 case "$arg" in
63 --skip-kill-mysqld*)
64 KILL_MYSQLD=0;
65 ;;
66 # these get passed explicitly to mysqld
67 --basedir=*) MY_BASEDIR_VERSION=`echo "$arg" | sed -e "s;--basedir=;;"` ;;
68 --datadir=*) DATADIR=`echo "$arg" | sed -e "s;--datadir=;;"` ;;
69 --pid-file=*) pid_file=`echo "$arg" | sed -e "s;--pid-file=;;"` ;;
70 --user=*) user=`echo "$arg" | sed -e "s;--[^=]*=;;"` ; SET_USER=1 ;;
71
72 # these two might have been set in a [mysqld_safe] section of my.cnf
73 # they are added to mysqld command line to override settings from my.cnf
74 --socket=*) mysql_unix_port=`echo "$arg" | sed -e "s;--socket=;;"` ;;
75 --port=*) mysql_tcp_port=`echo "$arg" | sed -e "s;--port=;;"` ;;
76
77 # mysqld_safe-specific options - must be set in my.cnf ([mysqld_safe])!
78 --ledir=*) ledir=`echo "$arg" | sed -e "s;--ledir=;;"` ;;
79 --log-error=*) err_log=`echo "$arg" | sed -e "s;--log-error=;;"` ;;
80 --open-files-limit=*) open_files=`echo "$arg" | sed -e "s;--open-files-limit=;;"` ;;
81 --core-file-size=*) core_file_size=`echo "$arg" | sed -e "s;--core-file-size=;;"` ;;
82 --timezone=*) TZ=`echo "$arg" | sed -e "s;--timezone=;;"` ; export TZ; ;;
83 --mysqld=*) MYSQLD=`echo "$arg" | sed -e "s;--mysqld=;;"` ;;
84 --mysqld-version=*)
85 tmp=`echo "$arg" | sed -e "s;--mysqld-version=;;"`
86 if test -n "$tmp"
87 then
88 MYSQLD="mysqld-$tmp"
89 else
90 MYSQLD="mysqld"
91 fi
92 ;;
93 --nice=*) niceness=`echo "$arg" | sed -e "s;--nice=;;"` ;;
94 --help)
95 usage
96 ;;
97 *)
98 if test -n "$pick_args"
99 then
100 # This sed command makes sure that any special chars are quoted,
101 # so the arg gets passed exactly to the server.
102 args="$args "`echo "$arg" | sed -e 's,\([^a-zA-Z0-9_.-]\),\\\\\1,g'`
103 fi
104 ;;
105 esac
106 done
107 }
108




110 #找到根目录和mysqld所在的位置
111 # First, try to find BASEDIR and ledir (where mysqld is)
112 #
113
114 MY_PWD=`pwd`
115 # Check for the directories we would expect from a binary release install
116 if test -f ./share/mysql/english/errmsg.sys -a -x ./bin/mysqld
###test的用法详见man test errmsg.sys存在并且是一般的文件同时mysqld存在并且是可执行文件
117 then
118 MY_BASEDIR_VERSION=$MY_PWD # Where bin, share and data are
119 ledir=$MY_BASEDIR_VERSION/bin # Where mysqld is
120 # Check for the directories we would expect from a source install
121 elif test -f ./share/mysql/english/errmsg.sys -a \
122 -x ./libexec/mysqld
123 then
124 MY_BASEDIR_VERSION=$MY_PWD # Where libexec, share and var are
125 ledir=$MY_BASEDIR_VERSION/libexec # Where mysqld is
126 # Since we didn't find anything, used the compiled-in defaults
127 else
128 MY_BASEDIR_VERSION=/home/mysql5.0/
129 ledir=/home/mysql5.0/libexec
130 fi




131##找到数据所在的目录
132 #
133 # Second, try to find the data directory
134 #
135
136 # Try where the binary installs put it
137 if test -d $MY_BASEDIR_VERSION/data/mysql
138 then
139 DATADIR=$MY_BASEDIR_VERSION/data
140 if test -z "$defaults" -a -r "$DATADIR/my.cnf" ##
###$defaults长度为0且$DATADIR/my.cnf存在并可读
141 then
142 defaults="--defaults-extra-file=$DATADIR/my.cnf"
143 fi
144 # Next try where the source installs put it
145 elif test -d $MY_BASEDIR_VERSION/var/mysql
146 then
147 DATADIR=$MY_BASEDIR_VERSION/var
148 # Or just give up and use our compiled-in default
149 else
150 DATADIR=/home/mysql5.0/var
151 fi




######确认$MYSQK_HOME,并寻找my.cnf
153 if test -z "$MYSQL_HOME"
154 then
155 if test -r "$MY_BASEDIR_VERSION/my.cnf" && test -r "$DATADIR/my.cnf"
156 then
157 echo "WARNING: Found two instances of my.cnf -"
158 echo "$MY_BASEDIR_VERSION/my.cnf and"
159 echo "$DATADIR/my.cnf"
160 echo "IGNORING $DATADIR/my.cnf"
161 echo
162 MYSQL_HOME=$MY_BASEDIR_VERSION
163 elif test -r "$DATADIR/my.cnf"
164 then
165 echo "WARNING: Found $DATADIR/my.cnf"
166 echo "Datadir is deprecated place for my.cnf, please move it to $MY_BASEDIR_VERSION"
167 echo
168 MYSQL_HOME=$DATADIR
169 else
170 MYSQL_HOME=$MY_BASEDIR_VERSION
171 fi
172 fi
173 export MYSQL_HOME



#####我们需要设置的变量
175 user=mysql
176 niceness=0
177
178 # these rely on $DATADIR by default, so we'll set them later on
179 pid_file=
180 err_log=




182 # Get first arguments from the my.cnf file, groups [mysqld] and [mysqld_safe]
183 # and then merge with the command line arguments
184 if test -x ./bin/my_print_defaults
185 then
186 print_defaults="./bin/my_print_defaults"
187 elif test -x /home/mysql5.0/bin/my_print_defaults
188 then
189 print_defaults="/home/mysql5.0/bin/my_print_defaults"
190 elif test -x /home/mysql5.0/bin/mysql_print_defaults
191 then
192 print_defaults="/home/mysql5.0/bin/mysql_print_defaults"
193 else
194 print_defaults="my_print_defaults"
195 fi
##########确认print_default,具体用途不明白###############
197 args= #设置变量为空
198 SET_USER=2
199 parse_arguments `$print_defaults $defaults --loose-verbose mysqld server`
#####用上面确认的print_defaults去解析配置文件
# 解析成下面的格式,方便得到参数
# ./my_print_defaults -c /etc/my.cnf5.0 --loose-verbose mysqld server
#--port=3307
#--socket=/home/mysql5.0/tmp/mysql.sock
#--skip-locking
#--key_buffer=16M
#--max_allowed_packet=1M
#--table_cache=64
#--sort_buffer_size=512K
#--net_buffer_length=8K
#--read_buffer_size=256K
#--read_rnd_buffer_size=512K
#--myisam_sort_buffer_size=8M
#--log_slow_queries=/home/mysql5.0/var/mysql5.0_slow_query.log
#--long_query_time=3
#--log-bin=mysql5.0-bin
#--server-id=2
#--tmpdir=/home/mysql5.0/tmp/
###########################################
200 if test $SET_USER -eq 2
201 then
202 SET_USER=0
203 fi



#####从my.cnf中得到参数
204 parse_arguments `$print_defaults $defaults --loose-verbose mysqld_safe safe_mysqld`
#####从启动mysqld_safe中读取参数 $@是启动mysqld_safe的时候带入的
205 parse_arguments PICK-ARGS-FROM-ARGV "$@"
206 safe_mysql_unix_port=${mysql_unix_port:-${MYSQL_UNIX_PORT:-/home/mysql5/tmp/mysql.sock}}
######不太清楚这句赋值是什么意思


208 # Make sure that directory for $safe_mysql_unix_port exists
###确认socket文件存在
209 mysql_unix_port_dir=`dirname $safe_mysql_unix_port`
210 if [ ! -d $mysql_unix_port_dir ]
211 then
212 mkdir $mysql_unix_port_dir
213 chown $user $mysql_unix_port_dir
214 chmod 755 $mysql_unix_port_dir
215 fi
216



216###确认mysqld的存在
217 # Use the mysqld-max binary by default if the user doesn't specify a binary
218 if test -z "$MYSQLD"
219 then
220 if test -x $ledir/mysqld-max
221 then
222 MYSQLD=mysqld-max
223 else
224 MYSQLD=mysqld
225 fi
226 fi
227
228 if test ! -x $ledir/$MYSQLD
229 then
230 echo "The file $ledir/$MYSQLD doesn't exist or is not executable"
231 echo "Please do a cd to the mysql installation directory and restart"
232 echo "this script from there as follows:"
233 echo "./bin/mysqld_safe".
234 echo "See http://dev.mysql.com/doc/mysql/en/mysqld_safe.html for more"
235 echo "information"
236 exit 1
237 fi




238###整理相关的参数如pid_file,err_log,socket,tcp_port,nice#####
239 if test -z "$pid_file"
240 then
241 pid_file=$DATADIR/`/bin/hostname`.pid
242 else
243 case "$pid_file" in
244 /* ) ;;
245 * ) pid_file="$DATADIR/$pid_file" ;;
246 esac
247 fi
248 test -z "$err_log" && err_log=$DATADIR/`/bin/hostname`.err
249
250 if test -n "$mysql_unix_port"
251 then
252 args="--socket=$mysql_unix_port $args"
253 fi
254 if test -n "$mysql_tcp_port"
255 then
256 args="--port=$mysql_tcp_port $args"
257 fi
258
259 if test $niceness -eq 0
260 then
261 NOHUP_NICENESS="nohup"
262 else
263 NOHUP_NICENESS="nohup nice -$niceness"
264 fi



265
266 # Using nice with no args to get the niceness level is GNU-specific.
267 # This check could be extended for other operating systems (e.g.,
268 # BSD could use "nohup sh -c 'ps -o nice -p $$' | tail -1").
269 # But, it also seems that GNU nohup is the only one which messes
270 # with the priority, so this is okay.
271 if nohup nice > /dev/null 2>&1
272 then
273 normal_niceness=`nice`
274 nohup_niceness=`nohup nice`
275
276 numeric_nice_values=1
277 for val in $normal_niceness $nohup_niceness
278 do
279 case "$val" in
280 -[0-9] | -[0-9][0-9] | -[0-9][0-9][0-9] | \
281 [0-9] | [0-9][0-9] | [0-9][0-9][0-9] )
282 ;;
283 * )
284 numeric_nice_values=0 ;;
285 esac
286 done


还有100多行,头疼了,先休息去了

2008年3月18日星期二

mysql的锁机制-初步

总结一下mysql的锁机制,主要参考资料:手册lock_table
主要使用:
先在test库中创建测试表test1

mysql> use test;
mysql> create table `test1` ( `id` int(10) NOT NULL default '0', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8;//并在test1表中插入1-7共7行数据以供测试

先讲读锁(read lock)

mysql>lock tables test1 read; //同时给所有数据库加读锁FLUSH TABLES WITH READ LOCK
mysql> insert into test1 values(8);
ERROR 1099 (HY000): Table 'test1' was locked with a READ lock and can't be updated

与此同时,另外的一个连接

mysql> select * from test1;
+----+
| id |
+----+
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
+----+
7 rows in set (0.00 sec)
//可以读,但不能写
mysql> insert into test1 values(8);
Query OK, 1 row affected (1 min 59.94 sec)//两分钟是上面进程锁表的时间

关于解锁

mysql> unlock tables ; //解除当前连接建立的所有的锁


再讲写锁

mysql> lock tables test1 write;
Query OK, 0 rows affected (0.00 sec)
//本连接,锁表的连接
mysql> select * from test1;
+----+
| id |
+----+
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
| 8 |
+----+
8 rows in set (0.00 sec)
//可以读
mysql> insert test1 value(9);
Query OK, 1 row affected (0.00 sec)
//可以写


同时其他连接

mysql> select * from test1;
+----+
| id |
+----+
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
| 8 |
| 9 |
+----+
9 rows in set (27.84 sec)
//同时不能读
mysql> insert test1 value(10);
Query OK, 1 row affected (35.55 sec)
//也不能写


2008年3月13日星期四

硬盘空间监控

虽然nagios中有监控系统硬盘空间的,但我还是想自己来定制一份,来满足我简单的需求。
需求的功能:
1.检测空间
2.邮件通知

perl版:

1 #/usr/bin/perl
2 ##############################
3 #author skine0709@gmail.com
4 #date 2008-03-15 #
5 ##############################
6 use warnings;
7 use strict;
8 use MIME::Lite;
9 use Net::SMTP;
10
11 my $opt_R = q/^$/;
12 my $opt_r = "";
13 my $exclude_re = "(^//|^none)";
14 my $cmd="/bin/df -k";
15 my @output = `$cmd` ;
16 my $a;
17 #########setting#################
18 my $alert=90;
19 my @email=('****@***.com'); //发送到邮件地方
20 my $mailserver='smtp.***.com'; // smtp server
21 my $mailuser='********'; //邮件用户
22 my $mailpasswd='********'; //邮件密码
23 my $debug=0; //是否调试
24 ################################
25 #print "@output";
26 foreach my $a (@output) {
27 if ( $a =~ /([\d\w\/]+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\%\s+([\/\w\d\.-] +)$/) {
28 # next if ($a = ~ m/$opt_R/);
29 # next if ($a !~ m/$opt_r/);
30 # next if ($a =~ m/$exclude_re/);
31 my ($dev,$s,$u,$f,$pu,$d) = ($1,$2,$3,$4,$5,$6);
32 if ($5 > $alert) {
33 my $driver=$6;
34 my $num=$5.'%';
35 disk_mail($driver,$num);
36 };
37 }
38
39 }
40
41 sub disk_mail
42 {
43 my $driver=shift;
44 my $num=shift;
45 my $time=localtime;
46 my $hostname=`hostname`;
47 foreach my $email (@email){
48 my $meg=MIME::Lite->new
49 (
50 Subject=>"disk alert",
51 From=>'skine0709@163.com',
52 To=>$email,
53 Type=>'text/html',
54 Data=>"$driver --- $num --- $time --- $hostname"
55 );
56 $meg->send('smtp',"$mailserver", Debug=>"$debug",
57 AuthUser=>"$mailuser", AuthPass=>"$mailpasswd");
58 }
59
60 }

随意写了一个,感觉爱蛮好用的。至少是满足我的需求了,参考了nagios插件中的check_disk.pl
当然,简单的也有一句话的shell

df|awk '{gsub(/%/,"")} NR>1 {if($5>90) print $5"%"}'

参考:一个简单的磁盘报警脚本
nagios中的check_disk.pl

2008年3月12日星期三

apache中给ani正确的MIME类型

需要给网页中的鼠标变换图像,文件后缀为.ani 或者.cui的!
apache中需要给定一个类型application/octet-stream .ani
就可以了!
但是这玩意有安全漏洞,因为这样后,IE就会把这个.ani就是可执行文件了!
HOHO ,firefox不理这个东东:)

apache mod_proxy模块不太好用

不知道是自己对apache的了解还不够透彻还是mod_proxy真的不太好用,用apache的proxy做代理的时候真的不太好用!做代理的时候效果明显不如squid,特别是当网络不稳定的时候,会时不时的不能建立连接!
类似于 ap_proxy_connect_backend disabling worker for
(***.domain.com)
暂时我也不清楚原理,不过从google结果来看,应该是判断了原始服务器dead,所以在默认的时间内不再发起http请求了。
具体问题,以后再说。反正用apache的mod_proxy做代理千万要考虑到这个问题.
mod_proxy中,我们常用到的是
ProxyPass /mirror/foo/ http://backend.example.com/
ProxyPassReverse /mirror/foo/ http://backend.example.com/

但是我在这里存在两点疑问:
1.ProxyPassReverse 实际的作用是什么,他能避免掉什么问题
2.我怎么能设置一个固定的ip来作为我的backend


update:2008-08-18

2008年3月7日星期五

svn使用hook--自动更新

产品服务器上面需要自动更新最新的版本库,这时就需要能够在svn中添加hook了!由于同步更新是在commit之后需要执行的,所以写在post-commit里面(记得要有执行权限)

/usr/bin/svn up [PATH...] -r 'HEAD' --non-interactive --username *** --password *** --ignore-externals

这样的话就应该可以自动更新了
如果是远程就可以通过ssh来执行了

usr/bin/ssh user@ip " /usr/bin/svn up [PATH...] -r 'HEAD' --non-interactive --username=*** --password=*** --ignore-externals"

客户端的老版本不支持--ignore--externals (忽略外部扩展)

2008年3月6日星期四

mysql 存储过程-我的第一个过程

一直想动手写写存储过程,却总是遗忘了。参考手册,写下我第一个procedure。

use mysql;
delimiter //
create procedure gogo407count (out gogo407 int )
begin
select count(*) into gogo407 from mysql.user;
end

由于到现在为止,我还不清楚什么东西些procedure最舒服,所以我觉得直接存在**.sql之后,再执行是比较方便的。因为现在没有在线修改存储过程的工具!当我们需要修改已经写好的procedure后,我们需要先删除

mysql>drop mysql.gogo407count (procedure是属于某一个数据库的,所以需要指定数据库)

然后再写入修改后的procedure

2008年3月4日星期二

mysql问题-drop user出错

在做mysql的操作的时候,需要drop user一个用户,可如果你有两个以上的用户名一样,drop user 的时候就会报错
ERROR 1268 (HY000): Can't drop one or more of the requested users

在这种情况下只有
mysql>delete from mysql.user where host='' and user=''
mysql>flush privileges

mysql论坛上也有类似的问题
mysqld的版本是4.1.18

2008年2月26日星期二

linux使用 --分区

最近硬盘空间不够了,想把以前的windows分区直接拿过来。
umount /mnt/wind (卸载 已经挂载的windows分区)
mkfs -t ext3 /dev/***
mount -t ext3 /dev/*** /mnt/download
操作其实很简单:)

2008年2月25日星期一

svn使用问题-文件和目录名不可用

常在河边走,哪有不湿鞋。某天svn up的时候遇到了
svn: Valid UTF-8 data
(hex: 72)
followed by invalid UTF-8 sequence
(hex: e9 75 6e 69)

顺手google了下,svn邮件列表中有 相关讨论。
粗略看了下,似乎是文件名或者目录名是非utf8的,删除后立马ok,(或者用iconv来修改文件名)
问题产生的本身是因为用ftp上传了非utf8的文件名的文件,而在服务器上(服务器编码是utf8)不能把该文件加入到svn版本库中。
随手做了下测试,在windows机子了,用非utf8的文件名的文件在提交的后,会自动转码。
 问题的根本,可能就是svn的客户端是根据os的环境指定的编码来做一系列的推断的!

2008年2月24日星期日

服务器状况--内存泄露导致服务不可用

好一个星期天,中午的收到手机短信报警。闷闷不乐的打开电脑,想连上服务器看看到底发生了什么。
状况:
1.服务器可以ping通,无任何异常现象
2.服务器任何端口都连接不上
解决过程:
1.尝试从各个地方连接服务端口,都没有响应。
2.联系机房重启服务器(怀疑服务器被攻击)
3.重启服务器,重启后正常。
4.查看日志(正常),查看重启前负载,内存使用等基本信息(负载200以上,内存吃光)
5.查找攻击迹象或者程序内存泄漏的迹象
6.发现crontab中某程序狂吃内存,以每秒10M的速度吃内存.
7.暂时在crontab中注释掉该程序
后续
1.分析该程序,内存泄漏的根本原因
2.不管是写程序和维护都应该对自己负责,对别人负责,毕竟是一个团队,和不喜欢负责任的人一起工作实在是太累了:)
总结
整个过程使服务暂停10分钟,这样的一个小问题,导致的用户不爽,太那个了.
希望一切一切都可以慢慢的向好的方面发展.
遐想:
1.似乎需要有程序对内存使用以固定的频率进行检查.
2.服务器是centos4,其他的unix os是不是对内存使用的监控和分配更加可控和合理?

2008年1月14日星期一

mysql内存使用与优化-myisam

凌晨,一台mysql(全部是myisam表)出现了内存不足!
Out of memory; restart server and try again (needed 67108856 bytes)

Got error 12 from storage engine

[ERROR] Got error 12 when reading table './****/baby'

很明显,该台mysql关于内存设置偏高,导致mysql请求分配内存失败!特别是每连接独享的内存设置存在问题,当连接数过多时,内存会相当稀缺!而myisam的cache是使用的文件系统本身的cache,所以内存不足将导致性能急剧下降。
先了解对于myisam我们需要调节的几个跟内存相关的参数!
所有连接共享的参数
1 key_buffer_size
这个肯定都知道,索引区大小
2 query_cache_size
查询缓存区大小
每连接独享的参数
3 join_buffer_size
在不使用索引的情况下,用于完全联接的缓冲区的大小!
4 read_buffer_size
读每个表里面连续的一块东西使用的缓存区大小
5 read_rnd_buffer_size
对已经排序了的结果直接读取,避免从disk读取
6 sort_buffer_size
排序空间大小
7 thread_stack
默认的已经足够大192K
8 binlog_cache_size
这个我用的很少,具体见手册
上面每连接独享的参数,一定要注意!如果修改不当,将导致mysql内存不足,偷鸡不成,反赊把米!
基本内存估算就是
全局内存=key_buffer_size+query_cache_size
每连接独享内存=sort_buffer_size+read_buffer_size+read_rnd_buffer_size+join+buffer_size
+上面的7和8(很少用)
所以使用的最大内存=全局内存+每连接独享内存*连接总数(max_connections)

2008年1月11日星期五

apache防webdup

2008年某天一大早来公司,查看流量表,发现凌晨一点的时候流量有些偏大!看日志发现,有人用webdup来抓cms!
想想,cms被小偷程序抓也不是一次两次了!本以为,这些小偷程序改个User-agent,我也不太好防!可令人气愤的是,在国内,这些小偷爬人家的站,User-agent都不愿意改下!
索性我也来个防菜鸟不防高手了,参考手册rewrite
写下下面小段的rewrite:
RewriteCond %{HTTP_USER_AGENT} ^Webdup.* [NC]
RewriteRule ^.* - [F,L]

稍微注释下:flag中的 [NC](No Case) 忽略大小写
[F] (force URL to be Forbidden) 给个403,静止入内:)
[L] (last rule) 应用了这条ReriteRule直接跳出,不在理会下面的rewrite了。
国内这种抓的气氛太浓了,不单只在内容上,在项目本身设计上也是这样,导致很多网站相似性太高!从内容本身很难去拉开于同类网站的差距,在国内创意变得不再是最最重要的创业基础,你的项目有创意,好的前景,人家照样插。从blog在国内的发展我们就能看出端倪。在短时间内做大做强,做出用户,做出品牌!

2008年1月9日星期三

apache配置-Sections

在配置apache的时候,我们经常需要对同一个虚拟主机下面的不同目录,不同的url,不同的文件做不同的配置。
常见的需求是首页的max-age=90,但是内页的max-age=9000或者更常,而内页可能体现在不同的目录,或者在同一目录下面只是不同的url.
所以我们需要把他们分开进行配置,我们能使用的指令有Directory
Directorymatch
files
filesmatch
href="http://httpd.apache.org/docs/2.0/mod/core.html#location">location
locationmatch
proxy
proxymatch
从头到尾,这些都是所谓的容器!可能让我们根据特性把集合分开!

linux系统命令 vmstat

经常使用vmstat来查看系统的运行状况,实际上却还是有些细节被我忽略了!
今天正好兴起,就一次性弄清楚!
Procs
r: The number of processes waiting for run time.
b: The number of processes in uninterruptible sleep.
我们经常会看见r的数值比较大,也很明显的知道等待运行的进程比较多,
Memory
swpd: the amount of virtual memory used.
free: the amount of idle memory.
buff: the amount of memory used as buffers.
cache: the amount of memory used as cache.
inact: the amount of inactive memory. (-a option)
active: the amount of active memory. (-a option)
内存使用情况的说明,和free显示的内容是一样的
Swap
si: Amount of memory swapped in from disk (/s).
so: Amount of memory swapped to disk (/s).
交换区的使用情况
IO
bi: Blocks received from a block device (blocks/s).
bo: Blocks sent to a block device (blocks/s).
对物理块的读写速率
System
in: The number of interrupts per second, including the clock.
cs: The number of context switches per second
in是中断次数/秒,cs是做上下文交换的次数/秒
CPU
These are percentages of total CPU time.
us: Time spent running non-kernel code. (user time, including nice time)
sy: Time spent running kernel code. (system time)
id: Time spent idle. Prior to Linux 2.5.41, this includes IO-wait time.
wa: Time spent waiting for IO. Prior to Linux 2.5.41, shown as zero.
cpu的使用率,id为空闲cpu,wa为等待磁盘io的使用率!wa过高的话,说明磁盘io存在一定的瓶颈.
发现以前学的操作系统好像在这里找到了些影子.

2008年1月6日星期日

squid3.0-STABLE1出炉

一直对squid情有独钟,也许是因为它maillist上面的热闹,也许他是我第一个深入了解的开源项目。也许也正是因为squid让我对http协议有了更深的了解。
总之在varnish昙花一现以后,squid3.0给出了第一个稳定版!squid2.6也给出了第17个稳定版
3.0与2.6之间具体差别,我还没来得及细细比较,
大体是增加了
# Code converted to C++, with significant internal restructuring and rewrites.
(用c++重构并改写了代码)
# ICAP implementation (RFC 3507 and www.icap-forum.org)
# Edge Side Includes (ESI) implementation (www.esi.org)
(实现了两个协议)
遗憾的是本来在2.6中实现了的follow_x_forwarded_for,在3.0中暂时还没有实现!
  

2008年1月3日星期四

apache模块之include_module

今天帮同事在测试机上添加下Server-Side Includes的支持!郁闷了一小时,愣是没有弄起来,测试机上是用的xmapp套件!对xmapp不熟悉,捣鼓了好一阵,还是没有搞定!
要找时间彻底把它搞定!
先理一下大体的思路吧!
Server-Side Includes(简称ssi)
手册上面的命令如下
AddType text/html .shtml
AddOutputFilter INCLUDES .shtml

在你需要进行ssi解析的里面添加
Options +Includes

当然和平常的指令一样,如果这些指令每授权给了.htaccess,可以在.htaccess里面设置
在手册的下面添加了一段

AddHandler server-parsed .shtml

apache会启动INCLUDES 链对能和MIME类型为text/x-server-parsed-html的文件
中间有需要了解的Filter,Handler!
在测试机上最后添加了AddHandler server-parsed .shtml才搞定!
但是为什么只是添加在输出链中在测试机上不鼎,在生产机上却是可以的!中间有什么样的不同了!
先记录在这里:),以后再深入研究下:)