首页 > 代码库 > 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》