日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > 数据库 >内容正文

数据库

anemometer mysql_MySQL慢日志简介及Anemometer工具介绍 | | For DBA

發(fā)布時(shí)間:2025/3/20 数据库 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 anemometer mysql_MySQL慢日志简介及Anemometer工具介绍 | | For DBA 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

原標(biāo)題:MySQL慢日志簡(jiǎn)介及Anemometer工具介紹 | | For DBA

作者:王航威 - fordba.com

來源:http://fordba.com/box-anemometer-visual-mysql-slow.html,葉師傅對(duì)原文內(nèi)容略有調(diào)整

備注:王航威是知數(shù)堂第8期同學(xué),現(xiàn)任職有贊DBA

MySQL 慢日志簡(jiǎn)介

MySQL慢日志(slow query log)想必大家都有聽說,它是用來記錄MySQL中的慢SQL(執(zhí)行耗時(shí)超過 long_query_time 預(yù)設(shè)時(shí)間的SQL),并且掃描的行數(shù)超過min_examined_row_limit(如果也設(shè)置了這個(gè)選項(xiàng)的話),或者需要全表/全索引掃描的SQL(如果設(shè)置了 log_queries_not_using_indexes 選項(xiàng)的話,并不是指所有沒使用索引的SQL),這些SQL效率通常較低,是可能影響MySQL的性能,DBA需要定期優(yōu)化這些SQL。

在MySQL中,如果一個(gè)SQL需要長(zhǎng)時(shí)間等待獲取鎖資源,那么這段獲取鎖的等待時(shí)間并不算執(zhí)行時(shí)間,當(dāng)SQL執(zhí)行完成,釋放相應(yīng)的鎖,才會(huì)記錄到慢日志中,所以MySQL的慢日志中記錄的順序和實(shí)際的執(zhí)行順序可能不一樣。

在默認(rèn)情況下,MySQL的慢日志記錄是關(guān)閉的,我們可以通過將設(shè)置slow_query_log=1來打開MySQL的慢查詢?nèi)罩?#xff0c;通過slow_query_log_file=file_name來設(shè)置慢查詢的文件名,如果文件名沒有設(shè)置,他的默認(rèn)名字為 host_name-slow.log。同時(shí),我們也可以設(shè)置 log-output={FILE|TABLE}來指定慢日志是寫到文件還是數(shù)據(jù)庫(kù)里面(如果設(shè)置log-output=NONE,將不進(jìn)行慢日志記錄,即使slow_query_log=1)。

默認(rèn)地,MySQL的管理維護(hù)命令的慢SQL并不會(huì)被記錄到MySQL慢日志中。常見的管理維護(hù)命令包括ALTER TABLE,ANALYZE TABLE, CHECK TABLE, CREATE INDEX, DROP INDEX, OPTIMIZE TABLE, 和REPAIR TABLE。如果希望MySQL的慢日志記錄這類長(zhǎng)時(shí)間執(zhí)行的命令,可以設(shè)置log_slow_admin_statements = 1。

通過設(shè)置log_queries_not_using_indexes=1,MySQL的慢日志也能記錄那些沒使用索引的SQL(并不需要超過long_query_time,兩者條件滿足一個(gè)即可)。但打開該選項(xiàng)的時(shí)候,如果你的數(shù)據(jù)庫(kù)中存在大量沒有使用索引的SQL,那么MySQL慢日志的記錄量將非常大,所以通常還需要設(shè)置參數(shù)log_throttle_queries_not_using_indexes 。默認(rèn)情況下,該參數(shù)為0,表示不限制,當(dāng)設(shè)置改參數(shù)為大于0的值的時(shí)候,表示MySQL在一分鐘內(nèi)記錄的沒使用索引的SQL的數(shù)量,來避免慢日志記錄過多的該類SQL。

在MySQL 5.7.2 之后,如果設(shè)置了慢日志是寫到文件里,需要設(shè)置log_timestamps 來控制寫入到慢日志文件里面的時(shí)區(qū)(該參數(shù)同時(shí)影響general日志和err日志),不設(shè)置的話,log文件中的記錄采用UTC時(shí)間,而非本地時(shí)間。如果設(shè)置慢日志是寫入到數(shù)據(jù)庫(kù)中,該參數(shù)將不產(chǎn)生作用。

所以,總結(jié)下哪些SQL能被MySQL慢日志記錄:

不會(huì)記錄MySQL中的管理維護(hù)命令,除非明確設(shè)置log_slow_admin_statements=1;

SQL執(zhí)行時(shí)間必須超過long_query_time,(不包括鎖等待時(shí)間)

參數(shù)log_queries_not_using_indexes設(shè)置為1,且SQL沒有用到索引,同時(shí)沒有超過log_throttle_queries_not_using_indexes 參數(shù)的設(shè)定。

查詢examine的行數(shù)必須超過min_examined_row_limit

注1:如果表沒有數(shù)據(jù)或者只有1條數(shù)據(jù),優(yōu)化器覺得即便走索引對(duì)效率并沒幫助,哪怕 log_queries_not_using_indexes=1 也不會(huì)記錄到慢日志中。

注2:如果SQL在QC命中了,也不會(huì)記錄到慢日志中。

注3:修改密碼之類的維護(hù)操作,密碼部分將會(huì)被星號(hào)代替,避免明文顯示。

Anemometer 簡(jiǎn)介

項(xiàng)目地址:https://github.com/box/Anemometer

演示地址:http://lab.fordba.com/anemometer/

Anemometer 是一個(gè)圖形化顯示從MySQL慢日志的工具。結(jié)合pt-query-digest,Anemometer可以很輕松的幫你去分析慢查詢?nèi)罩?#xff0c;讓你很容易就能找到哪些SQL需要優(yōu)化。

如果你想要使用Anemometer這個(gè)工具,那么你需要準(zhǔn)備以下環(huán)境:

一個(gè)用來存儲(chǔ)分析數(shù)據(jù)的MySQL數(shù)據(jù)庫(kù)

pt-query-digest. (doc: Percona Toolkit )

MySQL數(shù)據(jù)庫(kù)的慢查詢?nèi)罩?(doc: The Slow Query Log )

PHP版本為 5.5+,apache或者nginx等web服務(wù)器均可。

安裝

下載Anemometer

git clone git://github.com/box/Anemometer.git anemometer

載入數(shù)據(jù)

首先創(chuàng)建表結(jié)構(gòu),將global_query_review 以及global_query_review_history 創(chuàng)建出來。由于表定義中存在0000-00-00 00:00:00 的日期默認(rèn)值,需要修改sql_mode,將其zero_date的sql_mode 關(guān)閉,同時(shí)關(guān)閉only_full_group_by

cd /www/lab/anemometermysql -f < ./install.sql

現(xiàn)在需要使用pt-query-digest 抓取MySQL的慢查詢?nèi)罩?#xff0c;然后將數(shù)據(jù)插入到slow_query_log 數(shù)據(jù)庫(kù)的相應(yīng)表中。

使用如下方式載入數(shù)據(jù),h表示主機(jī)名或者ip地址,D表示database,t表示表名,再最后面跟上慢日志路徑。

如果 pt-query-digest version > 2.2:

$ pt-query-digest --user=anemometer --password=superSecurePass --review h=127.0.0.1,D=slow_query_log,t=global_query_review --review-history h=127.0.0.1,D=slow_query_log,t=global_query_review_history --no-report --limit=0% --filter=" $event->{Bytes} = length($event->{arg}) and $event->{hostname}="$HOSTNAME"" /data/mysql/slow-query.log

如果 pt-query-digest version <= 2.2

$ pt-query-digest --user=root --password=root --review h=127.0.0.1,D=slow_query_log,t=global_query_review --history h=127.0.0.1,D=slow_query_log,t=global_query_review_history --no-report --limit=0% --filter=" $event->{Bytes} = length($event->{arg}) and $event->{hostname}="$HOSTNAME"" /data/mysql/slow-query.logPipeline process 11 (aggregate fingerprint) caused an error: Argument "57A" isn't numeric in numeric gt (>) at (eval 40) line 6, <>; line 27.Pipeline process 11 (aggregate fingerprint) caused an error: Argument "57B" isn't numeric in numeric gt (>) at (eval 40) line 6, <> line 28.Pipeline process 11 (aggregate fingerprint) caused an error: Argument "57C" isn't numeric in numeric gt (>) at (eval 40) line 6, <> line 29.

如果你看到一些報(bào)錯(cuò)如上面例子所示,腳本并沒有出現(xiàn)問題,他只是輸出當(dāng)前的操作。

配置Anemometer

修改Anemometer配置文件

$ cd anemometer/conf$ cp sample.config.inc.php config.inc.php

示例的配置文件中,你需要進(jìn)行部分修改,用來連接數(shù)據(jù)庫(kù)獲取慢查詢的分析數(shù)據(jù)。

修改 datasource_localhost.inc.php 文件中的配置,主要為主機(jī)

$conf['datasources']['localhost'] = array( 'host' => '127.0.0.1', 'port' => 3306, 'db' => 'slow_query_log', 'user' => 'root', 'password' => 'root', 'tables' => array( 'global_query_review' => 'fact', 'global_query_review_history' => 'dimension' ), 'source_type' => 'slow_query_log');

然后訪問127.0.0.1/anemometer 的時(shí)候出現(xiàn)

Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'slow_query_log.dimension.sample' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by (1055)

需要將sql_mode 中only_full_group_by 關(guān)閉。

如果你想利用Anemometer 的explain功能來獲取執(zhí)行計(jì)劃,修改配置文件的以下部分。

$conf['plugins'] = array( 'visual_explain' => '/usr/local/bin/pt-visual-explain', --這里需要修改為正確的路徑 ... 'explain' => function ($sample) { $conn['user'] = 'anemometer'; $conn['password'] = 'superSecurePass'; return $conn; },);

結(jié)果展示

在5.7中,默認(rèn)SQL_MODE是啟用ONLY_FULL_GROUP_BY的,需要將其關(guān)閉,否則Anemometer將報(bào)錯(cuò)。

選擇相應(yīng)的列,然后點(diǎn)擊search,就可以顯示結(jié)果

sql執(zhí)行計(jì)劃查看以及歷史

當(dāng)我們選擇一個(gè)sql的hash值的時(shí)候,能看到他的一個(gè)具體的執(zhí)行計(jì)劃,同時(shí)也能看到匹配該sql的歷史sql,消耗,表的統(tǒng)計(jì)信息,建表語(yǔ)句等。

同時(shí)也能針對(duì)sql進(jìn)行評(píng)論,為sql優(yōu)化提交建議等。

創(chuàng)建自動(dòng)收集慢日志腳本

在anemometer下面的文件中有個(gè)收集腳本,可以通過crontab進(jìn)行定時(shí)收集慢日志,語(yǔ)法如下:

Usage: ./s/anemometer_collect.sh --interval Options: --socket -S The mysql socket to use --defaults-file The defaults file to use for the client --interval -i The collection duration --rate Set log_slow_rate_limit (For Percona MySQL Only) --history-db-host Hostname of anemometer database server --history-db-port Port of anemometer database server --history-db-name Database name of anemometer database server (Default slow_query_log) --history-defaults-file Defaults file to pass to pt-query-digest for connecting to the remote anemometer database

示例腳本:

cd anemometer mkdir etccd etcvi anemometer.local.cnf --這里創(chuàng)建配置文件,添加用戶名密碼[client]user=anemometer_localpassword=superSecurePass./s/anemometer_collect.sh --interval 30 --history-db-host=127.0.0.1

葉師傅補(bǔ)充

我以前的Anemometer玩法是這樣的。

把多個(gè)主機(jī)的slow log匯聚到一起,調(diào)用pt-query-digest解析并寫入db,方便slow log的統(tǒng)一管理、解析、展示,而不是每個(gè)實(shí)例都單獨(dú)部署一套;

每個(gè)主機(jī)上可能會(huì)跑多實(shí)例,其slow log的文件命名,會(huì)至少體現(xiàn)IP、端口、業(yè)務(wù)名,比如:slowquery-192.168.0.1:3306-yejr.log;

調(diào)用pt-query-digest解析時(shí),傳遞給 hostname 參數(shù)的值為 "192.168.0.1:3306",這樣一來,每個(gè)實(shí)例都可以被單獨(dú)處理列出,更加直觀;

通常,每個(gè)實(shí)例都有統(tǒng)一的監(jiān)控賬號(hào),Anemometer可以利用這個(gè)賬號(hào)來連接遠(yuǎn)程實(shí)例,查看解析SQL執(zhí)行計(jì)劃。

您可能感興趣的文章:返回搜狐,查看更多

責(zé)任編輯:

總結(jié)

以上是生活随笔為你收集整理的anemometer mysql_MySQL慢日志简介及Anemometer工具介绍 | | For DBA的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。