首页 > 代码库 > MySQL DBA 面试题目 答疑记 《01》
MySQL DBA 面试题目 答疑记 《01》
MySQL DBA 面试题解惑
一个朋友发了帖子,询问一些mysql dba面试题,回答的人比较少,他把地址给了我,只是我没有那个网站的账号,所以就整理下发在我的blog里面,大家可以参考下,也欢迎提出更加合理更加高效的处理方案。
1、对于一台DB服务器,有哪些是必须监控的基础指标,如何得到这些值?
必须监控的有:cpu负载、内存使用率、磁盘大小、io读写、网络流量、db端口流量、数据库客户端连接数等
如何得到这些值:可以通过第三方工具比如cacti、zabbix等;
Cacti监控mysql参考:http://blog.csdn.net/mchdba/article/details/27404109
zabbix监控mysql参考:http://blog.csdn.net/mchdba/article/details/51447750
2、简单介绍一个你用过的MYSQL状态探测或监控工具,第三方的或自己写的都可以,说出你觉得最好用的地方
自己使用过的有nagios、cacti以及zabbix;一般nagios和cacti搭配使用;zabbix可以单独使用。
(1) Nagios的优势在于报警内容丰富第三方控件成熟,cacti的图画效果比较清晰逼真;
(2) Zabbix的优势在于分布式部署,快速搭建,但是监控图比较粗糙,很多模板都需要自己实现,而且版本之间改动太大模板不能兼容。
Zabbix心得参考我的blog:http://blog.csdn.net/mchdba/article/category/2220809
Nagios心得参考:http://blog.csdn.net/mchdba/article/category/2247105
Cacti心得参考:http://blog.csdn.net/mchdba/article/category/2292853
3、简单介绍一个你用过的MySQL日志(slow/general/binary log)分析工具,第三方的或自己写的都可以,说出你觉得最好用的地方
Generl、binary log只是偶尔作为验证使用,很少经常哪来分析的,毕竟消耗性能太大了,倒是slow log经常作为分析的依据。
分析下自己做的比较简单的处理slow log的脚本:
# check_slow.sh 分析slow log脚本,按照执行数和执行时间来排序 [root@hch_test_121_61 ~]# vim /home/data/mysql/script/check_slow.sh
datestr=`date -d "1 day ago" +"%Y-%m-%d"` mysql_command=/usr/local/mysql/bin/mysql mysqlslow_command=/usr/local/mysql/bin/mysqldumpslow # su - mysql cd /home/data/mysql/slowlog/ mkdir $datestr cd $datestr $mysql_command -uroot --password=‘‘ -e ‘set global slow_query_log=0;‘; $mysql_command -uroot --password=‘‘ -e ‘SHOW VARIABLES LIKE "slow_query_log";‘; cp /home/data/mysql/data/db-master-1-slow.log . > /home/data/mysql/data/db-master-1-slow.log # > /data/mysql/data/localhost-slow.log $mysql_command -uroot --password=‘‘ -e ‘set global slow_query_log=1;‘; $mysql_command -uroot --password=‘‘ -e ‘SHOW VARIABLES LIKE "slow_query_log";‘; $mysqlslow_command -s c -t 50 db-master-1-slow.log > business_db_count_$datestr.log $mysqlslow_command -s at -t 50 db-master-1-slow.log > business_db_time_$datestr.log
# crontab 任务调度,一天执行一次 00 00 * * * /home/data/mysql/script/check_slow.sh >> /tmp/check_slow.log 2>&1 |
4、介绍一件遇到过的DB服务器故障
以前遇到的也比较多,有些记录下来了,有些没有来得及记录,谈不上印象最深刻的,因为解决完了后,随着时间推移的,慢慢都淡忘了,如果那件让你刻骨铭心的话,那估计是你惹上了大篓子了,让你承受超过一般的代价。
不过幸好,我比较谨慎、比较认真,暂时还没有出过比较大的篓子,属于小问题处理了很多,但是大篓子基本没有,但是小问题积小成多,也会厚积薄发的,我把以前的一些故障记录在了:http://blog.csdn.net/mchdba/article/category/1596355,欢迎参考,所谓三人行必有我师焉,大家一起交流一起进步。
5、如果出现Too many connections,应该采取哪些措施?
这种遇到过,高并发的时候,很多慢sql导致的。
(1)记得当时的处理办法是,先在线加大connections连接数,如下所示:
mysql> set global max_connections=20000; Query OK, 0 rows affected (0.10 sec)
mysql> |
(2)然后看哪些无效的连接数,直接kill掉;
分析下曾经写过的一个kill无效连接的脚本,大家可以参考下:
#It is used to kill processlist of mysql sleep #!/bin/sh while :
do n=`mysqladmin processlist -uadmin -pxxxxx|grep -i sleep |wc -l` date=`date +%Y%m%d\[%H:%M:%S]` echo $n
if [ "$n" -gt 10 ] then for i in `mysqladmin processlist -uadmin -pxxxxxx|grep -i sleep |awk ‘{print $2}‘` do mysqladmin -uadmin -pxxxx kill $i done echo "sleep is too many I killed it " >> /tmp/sleep.log echo "$date : $n" >> /tmp/sleep.log fi sleep 1 done |
(3) 然后查找产生这么多无效sql的真实原因,可能有如下几种情况:
(a) 是人为误删除索引,则补上索引。
(b) 是高并发sql导致,则看下优化sql添加索引,如果还不能减少连接数,则看哪个应用导致的高并发sql,暂时停止这个应用。
(c) 如果连接来源是不认识的非应用服务器的ip发起的,那么直接在网络层做下数据端口访问限制。
(d) 如果是某个比较慢的临时select语句消耗了临时内存资源,则kill掉这个临时select语句。
PS:产生的原因可能有多种多样,可以因地制宜,稳妥处理掉。遇到的时候不要慌 千万要镇静心平气和的逐个排查逐个处理。
MySQL DBA 面试题目 答疑记 《01》