您的位置:首页 > 运维架构 > Linux

最近分析数据库问题总结(linux+mysql)

2010-02-06 01:32 381 查看
1、show processlist非常有用,正常状态下,非Sleep状态的进程应该只有几个,偶尔出现十几个、几十个,但是成百上线的就不正常了。Sleep状态的不用管,一般使用了连接池就会有大量的Sleep进程(连接)。
2、如何分析各种状态的连接数?首先执行mysql –uroot –p123456 –e “show processlist” | grep –v Sleep > tmp.txt将非Sleep状态的连接(进程)的情况输出到tmp.txt文件。然后就使用grep和wc -l来统计。比如我想知道有多少个Blocked,那么执行cat tmp.txt | grep Blocked | wc –l。
3、出现大量Blocked状态的连接,可以设置以下两个参数:low_priority_updates和concurrent_insert两个参数,具体数值网上查。前者的意思是让update/insert操作的优先级低于select操作。
4、不能忽略的一个事实是:select语句是会上锁的,是read锁,上了read锁之后,任何insert、update都会被Block住。而如果low_priority_updates=OFF的话,一旦有一个insert/update被Block住,此后来的select也会被Blocked。(以上都是指myisam同一个表)。因此一个大查询是有可能导致大量被Block的进程出现的。
5、MyIsam真的不适合频繁更新的系统。但InnoDB也有它的麻烦:备份麻烦、一个数据库写在一个文件不便于管理维护等,系统工程部的人不推荐使用。再只有MySQL可使用的情况下,使用好缓存,不去实时操作数据库是唯一的药方。
6、group by等类似操作时毒药,能不用尽量不用,尤其在高并发的系统中,尤其如此。
7、写了一个脚本放到了crontab,每段时间取一次show processlist的情况,对数据库情况分析非常有用:
#!/bin/bash
dd=`date +%Y-%m-%d%t%r`
echo $dd >>/usr/local/2.txt
/usr/local/mysql/bin/mysql -psd-9898w -h10.1.1.161 -e "show processlist" >/usr/local/1.txt
zs=`cat /usr/local/1.txt | wc -l`
sl=`cat /usr/local/1.txt | grep -v Sleep | wc -l`
echo -n  1.161 ${zs}//${sl} >>/usr/local/2.txt
echo "">>/usr/local/2.txt
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息