本文匯總了MySQL DBA日常工作中用到的些工具,方便初學者,也便於自己查閱。
先介紹下基礎設施(CPU、IO、網絡等)檢查的工具:
vmstat、sar(sysstat工具包)、mpstat、oprofile、nicstat、dstat、iotop、tsar、iostat 掌握幾個即可,功能大同小異(個人常用的是 dstat、sar)。
CPU:
mpstat -P ALL 1 每隔1s顯示一次
上圖可以看到CPU調度不均衡。因此我們可以嘗試將pid為700的進程綁定到第四顆CPU上。taskset -p 03 700
磁盤:
vmstat -S m 1 10
iostat -xkdz 1
iotop
pt-ioprofile --profile-pid=$(pidof mysqld) --cell=sizes --run-time=30
內存:
vmtouch 【很cool的工具】 參考:http://blog.yufeng.info/archives/1903
作用:
查看一個文件(或者目錄)哪些部分在內存中;
把文件調入內存;
把文件清除出內存;
把文件鎖住在內存中而不被換出到磁盤上;
1. 看看/bin目錄有多少內容在內存中
$ vmtouch /bin/
Files: 92
Directories: 1
Resident Pages: 348/1307 1M/5M 26.6%
Elapsed: 0.003426 seconds
2. 看看某文件(big-dataset.txt)有多少在內存中
How much ofbig-dataset.txt is currently in memory?
$ vmtouch -v big-dataset.txt
big-dataset.txt
[ ] 0/42116
Files: 1
Directories: 0
Resident Pages: 0/42116 0/164M 0%
Elapsed: 0.005182 seconds
然后讀入部分文件,
$ tail -n 10000big-dataset.txt > /dev/null
然后在用vmtouch查看一下:
$ vmtouch -vbig-dataset.txt
big-dataset.txt
[ oOOOOOOO] 4950/42116
Files: 1
Directories: 0
Resident Pages: 4950/42116 19M/164M 11.8%
Elapsed: 0.006706 seconds
我們可以看出big-datset.txt開始時沒有數據在內存中,在用tail命令讀入了部分數據后,有19MB的數據進入了內存。
3. 把文件(a.txt)清除出內存
$ vmtouch -vea.txt
Evicting a.txt
Files: 1
Directories: 0
Evicted Pages: 42116 (164M)
Elapsed: 0.076824 seconds
vmtouch主要作用是做數據的warm-up,即對於將要用到的數據,通過vmtouch把它們事先讀入內存,而不是在需要時再從硬盤上讀入,這樣可以提高系統效率。
網絡:
nicstat -z 1 (需要參照網上自己編譯安裝)
全面的工具:
dstat -tclmdny 1
oprofile
【這個工具太厲強大,但是需要我們先安裝帶debug的kernel才行,具體請自行查閱文檔】
基礎設施沒問題后,我們才可以去考慮MySQL的參數調優及性能優化。
常用的性能分析工具有:
mytop、innotop、orzdba、dodba、mysqltuner.pl。(這幾個工具都很好用)
此外,常用的帶web界面的監控工具有:
官網:http://www.lepus.cc/page/opensource
專業做mysql監控的軟件。
可直觀監控主從狀態,界面比較炫。支持分析慢查詢(基於pt-query-digest實現)
PMM監控的部署(采用docker容器的部署方法很簡單,界面也很炫,但是感覺還是不夠實用。)
命令行的pt工具包套件:
percona-toolkit家族的系列工具,功能非常多,已經在我博客里面拆分成好幾篇基本上都羅列了一遍用法了。
此外, 比較推薦的有如下2個命令行的工具:
參考://www.percona.com/blog/2013/10/14/innotop-real-time-advanced-investigation-tool-mysql/
下載地址:git clone https://github.com/innotop/innotop.git 【epel源里面也可以直接yum方式安裝】
配置方法:
yum install perl-TermReadKey perl-Time-HiRes perl-DBD-MySQL perl-DBI
./innotop --help 可以查看到支持的參數。不過我們不在命令行輸入密碼,所有這些參數一般都用不到的。
./innotop --write 進入交互式界面后,輸入@ 根據提示輸入相關的參數,然后退出命令行。會在當前目錄下生成一個.innotop/innotop.conf里面記錄了數據的密碼信息。【我們只要在最后一步,提示是否保存密碼到文本中時候,選擇n即可只保存配置信息,不記錄密碼】
輸入? ,顯示所有支持的命令,如下圖:
按q鍵,可以退出inntop的控制台界面。
在當前目錄下,自動生成一個.innotop的隱藏文件夾。innotop.conf里面保存了數據庫的連接方式。
如果我們不退出剛才的Dashboard界面,直接輸入I ,可以看到IO相關狀態,如下圖:
輸入Q,可以查看query list
然后按e並輸入thread ID顯示執行計划或者按f顯示完整sql語句,或者按o顯示系統優化過的語句(需要MySQL的版本支持EXPLAIN EXTENDED)
innotop是通過information_schema.processlist來獲得完整的sql語句,並且根據COMMAND來過濾掉空閑線程的。
輸入S,然后選擇我們上面的test連接配置,可查看 Variables & Status。
輸入B,顯示 Buffer Pool的狀態:
輸入M,可以查看主從復制的狀態。下圖是master上的截圖:
比較簡單。
mytop --user root --pass root
一個pl腳本,mysqltuner 根據提示輸入用戶名和密碼即可分析並給出優化的建議。直接使用yum install mysqltuner也能安裝。
http://code.taobao.org/p/orzdba/src/trunk/
chmod +x orzdba即可。
我個人常用下面的2個即可,其他的狀態使用dstat、sar等命令來獲取。
注意:下面的2個參數的調用默認是沒有地方輸入用戶名和密碼的,因此建議將密碼寫到/etc/my.cnf 的client段里面。
./orzdba -mysql -C 10 -i 1
./orzdba -innodb -C 10 -i 1
step1、
tcpdump -s 65535 -x -nn -q -tttt -i eth0 -c 5000 port 3306 > /root/dump.txt
上面的命令參數含義:
-s #snaplen, 也就是數據包的截取長度
-nn #將地址、端口顯示為數字格式【經常用】
-q #快速輸出。只輸出較少的協議信息。【經常用】
-tttt # 在每行打印的時間戳之前添加日期的打印【經常用】
-c #在收到指定的數量的分組后,tcpdump就會停止。
step2、
pt-query-digest --type tcpdump/root/dump.txt 即可分析出結果
#!/bin/bash
#實時采集並分析1000個分組的sql包數據
#Date:2017/05/02
#注意部分機器的網卡是eth1或多網卡,腳本里面需要做修改
source/etc/profile
[! -e /usr/sbin/tcpdump ] && yum install tcpdump -y > /dev/null 2>&1
#如果抓取的數據太少,可以修改-c 5000 多抓取些用於分析
tcpdump -s 65535 -x -nn -q -tttt -i eth0 -c 5000 port 3306 > /root/dump.txt && pt-query-digest --type tcpdump /root/dump.txt > /root/pt_result.log
if[ $? -eq 0 ] ; then
echo "統計結果輸出到/root/pt_result.log" && rm -f /root/dump.txt
else
echo "程序運行出錯"
fi
doDBA tools是一個基於控制台的遠程監控工具,它不需要在本地/遠程系統上安裝任何軟件,它可以實時收集操作系統、MySQL、InnoDB的實時性能狀態數據,並可以生成Doing日志文件,來幫助你快速了解/優化系統及MySQL數據庫。
遠程收集系統信息是通過ssh(用戶名密碼或建立信任)的方式連接到遠程服務器上收集,收集的方法都是通過讀取Linux的proc下的等meminfo,diskstats,uptime,net,vmstat ,cpuinfo ,loadavg等文件,這和pmm,zabbix收集方式一致。
遠程收集MySQL信息是通過 MySQL tcp連接到MySQL數據庫上收集,只需要授予連接用戶PROCESS、SELECT權限即可。
系統信息和MySQL信息的收集可以分離,如果只想收集系統信息,只需要提供系統用戶名密碼即可,如果只收集MySQL可以只提供MySQL連接信息,如果是rds用戶,可以使用-rds參數,在使用mytop時會自動忽略系統信息的收集。
http://www.ywnds.com/?p=7499
下載地址:https://github.com/dblucyne/dodba_tools
wget https://raw.githubusercontent.com/dblucyne/dodba_tools/master/doDBA--no-check-certificate
wget https://raw.githubusercontent.com/dblucyne/dodba_tools/master/doDBA.conf--no-check-certificate
chmod +x doDBA
功能非常強大,官方地址:https://github.com/dblucyne/dodba_tools 介紹的很詳細
具體如何使用在運維幫的公眾號上面有比較全面的介紹,下面是我摘錄的部分內容:
./doDBA-help 查看幫助
收集Linux性能數據
./doDBA-h=192.168.2.11 -sys # 通過ssh遠程連接去獲取信息
搜集MySQL性能數據
./doDBA-h=127.0.0.1 -mysql
執行前需要先去修改 doDBA.conf 配置上mysql的用戶名密碼和端口:
{
"Host":"",
"Huser":"root",
"Hport":"22",
"Hpwd": "",
"Muser": "root",
"Mpwd": "Abcd@1234",
"Mport":"3306"
}
### 這里需要注意一點就是:搜集遠程mysql時候,必須要先在目標MySQL上對本機IP做授權,不然會出現下圖類似的報錯。
搜集InnoDB性能數據
./doDBA-h=127.0.0.1 -innodb
搜集MySQL及Linux性能數據
./doDBA-h=127.0.0.1 -myall
類似Mytop的功能
./doDBA-h=127.0.0.1 -mytop
搜集到日志文件
./doDBA-h=127.0.0.1 -mytop -log
開啟Doing功能
./doDBA -h=127.0.0.1-myall -t=3 # 當有超過3個活躍線程時就自動執行show processlist 和show engine innodb status\G 並把采集到的信息存到dbdba.log
配合shell批量采集
cat ip.txt 內容如下:
192.168.2.11
192.168.2.12
cat ip.txt | while read ip; do echo $ip; ./doDBA -h=$ip -mysql -log
重磅推薦:my.cnf 參數計算器(推薦):
http://www.mysqlcalculator.com/
不同物理硬件的服務器,my.cnf 的部分參數需要調整,如果參數設置的太大,可能導致OOM。因此有必要用這個計算器算一下。
上文中部分內容參考自網易王洪權的ppt。