標籤:http 0 rows cal 效能 通過 -- 分布式部署 rip 自己
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指令碼,按照執行數和執行時間來排序 [[email protected]_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》