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