亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > MySQL > 正文

利用MySQL系統數據庫做性能負載診斷的方法

2020-01-18 20:42:58
字體:
來源:轉載
供稿:網友

某大師曾說過,像了解自己的老婆 一樣了解自己管理的數據庫,個人認為包含了兩個方面的了解:

1,在穩定性層面來說,更多的是關注高可用、讀寫分離、負載均衡,災備管理等等high level層面的措施(就好比要保證生活的穩定性)

2,在實例級別的來說,需要關注內存、IO、網絡,熱點表,熱點索引,top sql,死鎖,阻塞,歷史上執行異常的SQL(好比生活品質細節)MySQL的performance_data庫和sys庫提供了非常豐富的系統日志數據,可以幫助我們更好地了解非常細節的,這里簡單地列舉出來了一些常用的數據。

sys庫是以較為可讀化的方式封裝了performance_data中的某些表,因此這些個數據來源還是performance_data庫中的數據。

這里粗略列舉出個人常用的一些系統數據,可以在實例級別更加清楚地了解MySQL的運行過程中資源分配情況。

Status中的信息

MySQL的status變量只是給出了一個總的信息,從status變量上無法得知詳細資源的消耗,比如IO或者內存的熱點在哪里,庫、表的熱點在哪里,如果想要知道具體的明細信息就需要系統庫中的數據。

前提要開啟performance_schema,因為sys庫的視圖是基于performance_schema的庫的。

內存使用:

內存/innodb_buffer_pool使用

概要innodb_buffer_pool的使用情況summary,已知當前實例262144*16/1024 = 4096MB buffer pool,已使用23260*16/1024 363MB

innodb_buffer_pool已占用內存的明細信息,可以按照庫/表的維度來統計

SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED ;SELECT   database_name,  SUM(compressed_size)/1024/1024 AS allocated_memory,  SUM(data_size)/1024/1024 AS data_memory,  SUM(is_hashed)*16/1024 AS is_hashed_memory,  SUM(is_old)*16/1024 AS is_old_memoryFROM ( SELECT   case when INSTR(TABLE_NAME,'.')>0 then replace(SUBSTRING(TABLE_NAME,1,INSTR(TABLE_NAME,'.')-1),'`','')  else  'system_database' end as database_name,  case when INSTR(TABLE_NAME,'.')>0 then replace(SUBSTRING(TABLE_NAME,INSTR(TABLE_NAME,'.')+1),'`','')  ELSE 'system_obj' END AS table_name,  if(compressed_size = 0, 16384, compressed_size) AS compressed_size,  data_size,  if(is_hashed = 'YES',1,0) is_hashed,  if(is_old = 'YES',1,0) is_old FROM information_schema.innodb_buffer_page WHERE TABLE_NAME IS NOT NULL) tGROUP BY database_nameORDER BY allocated_memory DESCLIMIT 10;

庫/表的讀寫統計,邏輯層面的熱點數據統計

目標表是performance_schema.table_io_waits_summary_by_table,某些文章上說是邏輯IO,其實這里跟邏輯IO并無關系,這個表中的字段含義是基于表,讀寫的到的行數的統計。至于真正的邏輯IO層面的統計,筆者目前還有不知道有哪個可用的系統表來查詢。這個庫可以很清楚地看到這個表中的統計結果是怎么計算出來的。

基于表的讀寫的行的次數統計,這是一個累計值,單純的看這個值本身,個人覺得意義不大,需要定時收集計算差值,才具備參考意義。

以下按照庫級別統計表的讀寫情況。

庫/表的讀寫統計,物理IO層面的熱點數據統計

按照物理IO的維度統計熱點數據,哪些庫/表消耗了多少物理IO。這里原始系統表中的數據是一個累計統計的值,最極端的情況就是一個表為0行,卻存在大量的物理讀寫IO。

SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED ;SELECT  database_name, IFNULL(cast(sum(total_read) as signed),0) AS total_read, IFNULL(cast(sum(total_written) as signed),0) AS total_written, IFNULL(cast(sum(total) AS SIGNED),0) AS total_read_writtenFROM( SELECT   substring(REPLACE(file, '@@datadir/', ''),1,instr(REPLACE(file, '@@datadir/', ''),'/')-1) AS database_name,  count_read,  case    when instr(total_read,'KiB')>0 then replace(total_read,'KiB','')/1024   when instr(total_read,'MiB')>0 then replace(total_read,'MiB','')/1024   when instr(total_read,'GiB')>0 then replace(total_read,'GiB','')*1024  END AS total_read,  case    when instr(total_written,'KiB')>0 then replace(total_written,'KiB','')/1024   when instr(total_written,'MiB')>0 then replace(total_written,'MiB','')   when instr(total_written,'GiB')>0 then replace(total_written,'GiB','')*1024  END AS total_written,  case    when instr(total,'KiB')>0 then replace(total,'KiB','')/1024   when instr(total,'MiB')>0 then replace(total,'MiB','')   when instr(total,'GiB')>0 then replace(total,'GiB','')*1024  END AS total from sys.io_global_by_file_by_bytes  WHERE FILE LIKE '%@@datadir%' AND instr(REPLACE(file, '@@datadir/', ''),'/')>0 )tGROUP BY database_nameORDER BY total_read_written DESC;

ps:個人不太喜歡MySQL自定義的format_***函數,這個函數的初衷是好的,把一些數據(時間,存儲空間)等格式化成更加可讀的模式。但是卻不支持單位的參數,更多的時候想以某個固定的單位來顯示,比如格式化一個的時間,格式化后根據單位大小可能會顯示微妙,或者是毫秒,或者是秒,或者分鐘,或者天。比如想把時間統一格式化成秒,對不起,不支持,某些個數據不僅僅是看一眼那么簡單,甚至是要讀出來存檔分析的,因此這里不建議也不會使用那些個format函數

TOP SQL 統計

可以按照執行時間,阻塞時間,返回行數等等維度統計top sql。
另外可以按照時間篩選last_seen,可以統計最近某一段時間出現過的top sql

SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED ;SELECT  schema_name, digest_text, count_star, avg_timer_wait/1000000000000 AS avg_timer_wait, max_timer_wait/1000000000000 AS max_timer_wait, sum_lock_time/count_star/1000000000000 AS avg_lock_time , sum_rows_affected/count_star AS avg_rows_affected, sum_rows_sent/count_star AS avg_rows_sent , sum_rows_examined/count_star AS avg_rows_examined, sum_created_tmp_disk_tables/count_star AS avg_create_tmp_disk_tables, sum_created_tmp_tables/count_star AS avg_create_tmp_tables, sum_select_full_join/count_star AS avg_select_full_join, sum_select_full_range_join/count_star AS avg_select_full_range_join, sum_select_range/count_star AS avg_select_range, sum_select_range_check/count_star AS avg_select_range, first_seen, last_seenFROM performance_schema.events_statements_summary_by_digestWHERE last_seen>date_add(NOW(), interval -1 HOUR)ORDER BY max_timer_wait-- avg_timer_wait-- sum_rows_affected/count_star -- sum_lock_time/count_star-- avg_lock_time-- avg_rows_sentDESClimit 10;

需要注意的是,這個統計是按照MySQL執行一個事務消耗的資源做統計的,而不是一個語句,筆者一開始懵逼了一陣子,舉個簡單的例子。

參考如下,這里是循環寫個數據的一個存儲過程,調用方式就是call create_test_data(N),寫入N條測試數據。
比如call create_test_data(1000000)就是寫入100W的測試數據,這個執行過程耗費了幾分鐘的時間,按照筆者的測試實例情況,avg_timer_wait的維度,絕對是一個TOP SQL。

但是在查詢的時候,始終沒有發現這個存儲過程的調用被列為TOP SQL,后面嘗試在存儲過程內部加了一個事物,然后就順利地收集到了整個TOP SQL.

因此說performance_schema.events_statements_summary_by_digest里面的統計,是基于事務的,而不是某一個批處理的執行時間的。

CREATE DEFINER=`root`@`%` PROCEDURE `create_test_data`( IN `loopcnt` INT)LANGUAGE SQLNOT DETERMINISTICCONTAINS SQLSQL SECURITY DEFINERCOMMENT ''BEGIN -- START TRANSACTION;   while loopcnt>0 do   insert into test_mrr(rand_id,create_date) values (RAND()*100000000,now(6));   set loopcnt=loopcnt-1;  end while; -- commit;END

另外一點比較有意思的是,這個系統表是為數不多的支持truncate的,當然它在內部,也是在不斷收集的一個過程。

執行失敗的SQL 統計

一直以為系統不會記錄執行失敗的/解析錯誤的SQL,比如想統計因為超時而執行失敗的語句,后面才發現,這些信息,MySQL會完整地記錄下來

這里會詳細記錄執行錯誤的語句,包括最終執行失敗(超時之類的),語法錯誤,執行過程中產生了警告之類的語句。用sum_errors>0 or sum_warnings>0去performance_schema.events_statements_summary_by_digest篩選一下即可。

SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED ;select  schema_name, digest_text, count_star, first_seen, last_seenfrom performance_schema.events_statements_summary_by_digestwhere sum_errors>0 or sum_warnings>0 order by last_seen desc;

Index使用情況統計

基于performance_schema.table_io_waits_summary_by_index_usage這個系統表,其統計的維度同樣是“按照某個索引查詢返回的行數的統計”。

可以按照哪些索引使用最多/最少等情況進行統計。

不過這個統計有一個給人潛在一個誤區:
count_read,count_write,count_fetch,count_insert,count_update,count_delete統計了某個索引上使用到索引的情況下,受影響的行數,sum_timer_wait是累計在該索引上等待的時間。

如果使用到了該索引,但是沒有數據受影響(就是沒有DML語句的條件沒有命中數據),將count_***不會統計進來,但是sum_timer_wait會統計進來
這就存在一個容易受到誤導的地方,這個索引明明沒有命中過很多次,但是卻產生了大量的timer_wait,索引看到類似的信息,也不能貿然刪除索引。

等待事件統計

MySQL數據庫中的任何一個動作,都需要等待(一定的時間來完成),一共有超過1000個等待事件,分屬不懂的類別,每個版本都不一樣,且默認不是所有的等待事件都啟用。

個人認為等待事件這個東西,僅做參考,不具備問題的診斷性,即便是再優化或者低負載的數據庫,累計一段時間,某些事件仍舊會積累大量的等待事件。

這些事件的等待事件,不一定都是負面性的,比如事物的鎖等待,是在并發執行過程中必然會生成的,這個等待事件的統計結果,也是累計的,單純的看一個直接的值,不具備任何參考意義。
除非定期收集,做差值計算,根據實際情況,才具備參考意義。

SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED ;SELECT SUBSTRING_INDEX(NAME, '/', 1) as wait_type,COUNT(1) FROM performance_schema.setup_instrumentsGROUP BY 1 ORDER BY 2 DESC;SELECTevent_name,count_star,sum_timer_waitFROM performance_schema.events_waits_summary_global_by_event_nameWHERE event_name != 'idle'order by sum_timer_wait desclimit 100;

最后,需要注意的是,

1,MySQL提供的諸多的系統表(視圖)中的數據,單純的看這個值本身,因為它是一個累計值,個人覺得意義不大,尤其是avg_***,需要結合多方面的綜合因素,做參考使用。
2,任何系統表的查詢,都可能對系統性能的本身造成一定的影響,不要再對系統可能產生較大負面影響的情況下做數據的統計收集。

總結

以上所述是小編給大家介紹的利用MySQL系統數據庫做性能負載診斷的方法,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對武林網網站的支持!
如果你覺得本文對你有幫助,歡迎轉載,煩請注明出處,謝謝!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91牛牛免费视频| 国产成人黄色av| 日本成人黄色片| 日韩免费高清在线观看| 亚洲国产精品va| 97碰碰碰免费色视频| 另类少妇人与禽zozz0性伦| 国语自产精品视频在线看抢先版图片| 久久成年人免费电影| 国产99久久精品一区二区| 在线视频欧美日韩精品| 欧美在线激情视频| 日韩精品在线免费观看视频| 欧美精品成人91久久久久久久| 亚洲毛片在线观看.| 精品中文字幕视频| 久久人体大胆视频| 福利一区视频在线观看| 国精产品一区一区三区有限在线| 91久久久精品| 国产精品欧美日韩一区二区| 亚洲精品wwww| 国产亚洲精品久久久久久| 日韩免费观看网站| 国产欧美日韩精品专区| 国产精品爱啪在线线免费观看| 日韩av123| 粗暴蹂躏中文一区二区三区| 国产精品第10页| 国产综合视频在线观看| 日韩欧美一区二区三区| 亚洲精品wwww| 国产一区二区三区高清在线观看| 亚洲第一男人天堂| 亚洲三级免费看| 亚洲成人精品在线| 国产精品揄拍500视频| 亚洲美女www午夜| 亚洲欧美中文日韩v在线观看| 亚洲伊人一本大道中文字幕| 欧美日韩中文字幕在线视频| 日韩视频在线免费观看| 91网站在线免费观看| 久久精品亚洲精品| 亚洲香蕉av在线一区二区三区| 日本不卡视频在线播放| 欧美一级成年大片在线观看| 97视频在线观看网址| 77777亚洲午夜久久多人| 欧美一级大片在线免费观看| 国产丝袜一区二区三区免费视频| 国产高清视频一区三区| 亚州av一区二区| 国产精品久久91| 久久久久亚洲精品国产| 亚洲国产私拍精品国模在线观看| 亚洲色图35p| 亚洲精品女av网站| 97国产真实伦对白精彩视频8| 中文字幕v亚洲ⅴv天堂| 国产精品十八以下禁看| 国产亚洲精品美女| 欧美一级免费视频| 国产激情视频一区| 欧美国产精品va在线观看| 亚洲字幕在线观看| 日韩av电影免费观看高清| 亚洲自拍欧美另类| 欧美寡妇偷汉性猛交| 91国产中文字幕| www.亚洲人.com| 国产日本欧美一区二区三区| 欧美日韩亚洲91| 国产精品老牛影院在线观看| 亚洲精品国产成人| 国产精品高潮呻吟久久av黑人| 国产精品影片在线观看| 伊人久久大香线蕉av一区二区| 岛国av在线不卡| 日韩动漫免费观看电视剧高清| 欧美激情一区二区三区高清视频| 亚洲美女又黄又爽在线观看| 亚洲国产精品久久| 精品国产老师黑色丝袜高跟鞋| 欧美激情喷水视频| 日韩在线观看免费网站| 欧美日韩在线视频首页| 成人久久一区二区| 国产一区二区三区在线免费观看| 欧美香蕉大胸在线视频观看| 亚洲网在线观看| 欧美电影《睫毛膏》| 亚洲国产天堂久久综合网| 成人av.网址在线网站| 亚洲午夜精品视频| 亚洲国产精彩中文乱码av在线播放| 韩国精品美女www爽爽爽视频| 成人av在线网址| 日韩在线高清视频| 日韩av在线资源| 成人亚洲欧美一区二区三区| 亚洲欧洲在线看| 秋霞成人午夜鲁丝一区二区三区| 亚洲黄色免费三级| 久久91亚洲人成电影网站| 久久久亚洲欧洲日产国码aⅴ| 亚洲人成在线播放| xx视频.9999.com| 91香蕉亚洲精品| 国产精品男女猛烈高潮激情| 欧美一级在线亚洲天堂| 亚洲国产精品小视频| 国产精品美女呻吟| www.日韩不卡电影av| 欧美xxxx做受欧美| 精品福利在线看| 成人精品视频久久久久| 日韩成人久久久| 91免费视频网站| 国产精品老女人视频| 日韩精品高清视频| 亚洲视频在线观看免费| 久久久免费精品| 欧美日韩国产页| 久久精品精品电影网| 2025国产精品视频| 国产精品亚洲欧美导航| 久久天天躁夜夜躁狠狠躁2022| 亚洲电影免费观看| 精品精品国产国产自在线| 国产在线观看精品一区二区三区| 精品久久久在线观看| 欧美视频在线看| 一本一本久久a久久精品综合小说| 福利一区福利二区微拍刺激| 中文字幕av一区二区三区谷原希美| 久久99精品久久久久久青青91| 欧美日韩亚洲视频一区| 一本一本久久a久久精品牛牛影视| www.日韩免费| 色综合视频一区中文字幕| 亚洲一区二区免费| 中文字幕亚洲自拍| 久久久视频在线| 亚洲图片制服诱惑| 91成人福利在线| 亚洲精品白浆高清久久久久久| 国产欧美日韩免费看aⅴ视频| 国产精品视频久| 中文字幕一精品亚洲无线一区| 视频在线观看99| 欧美黑人性猛交| 欧美午夜视频在线观看| 久久免费视频网站| 97视频在线观看免费高清完整版在线观看| 91国在线精品国内播放| 亚洲欧美综合图区| 91亚洲精品一区| 海角国产乱辈乱精品视频| 欧美有码在线观看| 日本不卡免费高清视频| 欧美成人免费全部观看天天性色| 久久久精品网站| 91精品国产综合久久久久久久久|