IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    [原]MySQL DBA 面试题目 答疑记 《01》

    mchdba发表于 2016-08-12 23:21:14
    love 0



    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:产生的原因可能有多种多样,可以因地制宜,稳妥处理掉。遇到的时候不要慌 千万要镇静心平气和的逐个排查逐个处理。



沪ICP备19023445号-2号
友情链接