SlideShare a Scribd company logo
●
SHOW PROCESSLIST, mytop/innotop
●
slow log, query log, pt-query-digest, mysqldumpslow
●
co jeszcze da się wyciągnąć, czyli nieoczywiste zastosowania powyższych narzędzi
2
3 3
4
5
Pokazuje procesy połączone do MySQL
Aby wyświetlić wszystkie procesy wymaga uprawnienia
W przeciwnym wypadku pokazuje tylko procesy aktualnie połączonego usera
6
mysql> show processlist;
+------+-------------+-------------------+----------------+---------+-------+----------+------------------+-----------+---------------+
| Id | User | Host | db | Command | Time | State | Info | Rows_sent | Rows_examined |
+------+-------------+-------------------+----------------+---------+-------+----------+------------------+-----------+---------------+
| 2 | sprytnyzbys | application:49914 | freshmail_utf8 | Sleep | 42256 | | NULL | 0 | 0 |
| 7 | sprytnyzbys | application:49996 | freshmail_utf8 | Sleep | 0 | | NULL | 0 | 0 |
| 619 | root | localhost | freshmail_utf8 | Sleep | 27245 | | NULL | 4 | 4 |
| 5502 | tasks | application:54980 | freshmail_utf8 | Sleep | 2241 | | NULL | 84 | 168 |
| 6196 | root | localhost | freshmail_utf8 | Query | 0 | starting | show processlist | 0 | 0 |
| 6250 | tasks | application:48422 | freshmail_utf8 | Sleep | 1 | | NULL | 0 | 0 |
| 6307 | tasks | application:49524 | freshmail_utf8 | Sleep | 3 | | NULL | 0 | 0 |
| 6317 | sprytnyzbys | application:49648 | freshmail_utf8 | Sleep | 0 | | NULL | 0 | 0 |
+------+-------------+-------------------+----------------+---------+-------+----------+------------------+-----------+---------------+
8 rows in set (0.00 sec)
mysql> show processlist;
+------+-------------+-------------------+----------------+---------+-------+------------+------------------------------------------------------
------------------------------------------------+-----------+---------------+
| Id | User | Host | db | Command | Time | State | Info
| Rows_sent | Rows_examined |
+------+-------------+-------------------+----------------+---------+-------+------------+------------------------------------------------------
------------------------------------------------+-----------+---------------+
| 2 | sprytnyzbys | application:49914 | freshmail_utf8 | Sleep | 42241 | | NULL
| 0 | 0 |
| 7 | sprytnyzbys | application:49996 | freshmail_utf8 | Sleep | 0 | | NULL
| 0 | 0 |
| 619 | root | localhost | freshmail_utf8 | Sleep | 27230 | | NULL
| 4 | 4 |
| 5502 | tasks | application:54980 | freshmail_utf8 | Sleep | 2226 | | NULL
| 84 | 168 |
| 6196 | root | localhost | freshmail_utf8 | Query | 0 | starting | show processlist
| 0 | 0 |
| 6250 | tasks | application:48422 | freshmail_utf8 | Sleep | 1 | | NULL
| 0 | 0 |
| 6259 | tasks | application:48818 | freshmail_utf8 | Sleep | 3 | | NULL
| 0 | 0 |
| 6263 | sprytnyzbys | application:48914 | freshmail_utf8 | Query | 0 | statistics | SELECT
`state`,
MAX(`added_on`) AS `max_added_on`,
count(id_subscribers) AS `count`
FROM
`subscribers`
WHERE
`id_subscribe | 0 | 0 |
+------+-------------+-------------------+----------------+---------+-------+------------+------------------------------------------------------
------------------------------------------------+-----------+---------------+
8 rows in set (0.00 sec)
mysql> show full processlist;
+------+-------------+-------------------+----------------+---------+-------+------------+------------------------------------------------------
------------------------------------------------+-----------+---------------+
| Id | User | Host | db | Command | Time | State | Info
| Rows_sent | Rows_examined |
+------+-------------+-------------------+----------------+---------+-------+------------+------------------------------------------------------
------------------------------------------------+-----------+---------------+
| 2 | sprytnyzbys | application:49914 | freshmail_utf8 | Sleep | 42241 | | NULL
| 0 | 0 |
| 7 | sprytnyzbys | application:49996 | freshmail_utf8 | Sleep | 0 | | NULL
| 0 | 0 |
| 619 | root | localhost | freshmail_utf8 | Sleep | 27230 | | NULL
| 4 | 4 |
| 5502 | tasks | application:54980 | freshmail_utf8 | Sleep | 2226 | | NULL
| 84 | 168 |
| 6196 | root | localhost | freshmail_utf8 | Query | 0 | starting | show processlist
| 0 | 0 |
| 6250 | tasks | application:48422 | freshmail_utf8 | Sleep | 1 | | NULL
| 0 | 0 |
| 6259 | tasks | application:48818 | freshmail_utf8 | Sleep | 3 | | NULL
| 0 | 0 |
| 6263 | sprytnyzbys | application:48914 | freshmail_utf8 | Query | 0 | statistics | SELECT
`state`,
MAX(`added_on`) AS `max_added_on`,
count(id_subscribers) AS `count`
FROM
`subscribers`
WHERE
`id_subscribers_list = 1448 AND
`id_clients` = 338 | 0 | 0 |
+------+-------------+-------------------+----------------+---------+-------+------------+------------------------------------------------------
------------------------------------------------+-----------+---------------+
8 rows in set (0.00 sec)
SELECT * FROM information_schema.processlist;
10
SELECT * FROM information_schema.processlist WHERE
Time > 10 AND Command != “Sleep”;
SELECT User, COUNT(*) FROM information_schema.processlist
GROUP BY User WITH ROLLUP;
11
Konsolowe narzędzie do monitorowania procesów podłączonych do MySQL.
Wymaga uprawnienia
Wyświetla stan procesów podłączonych do bazy danych.
12
MySQL on localhost (5.7.23-23-log)
up 40+12:49:58 [23:38:16]
Queries: 604.1M qps: 181 Slow: 281.8k Se/In/Up/De(%): 57/21/19/00
qps now: 306 Slow qps: 0.0 Threads: 70 ( 4/ 0) 73/03/00/00
Key Efficiency: 99.6% Bps in/out: 327.5k/725.6k Now in/out: 95.7k/235.8k
Id User Host/IP DB Time Cmd Query or State
-- ---- ------- -- ---- --- ----------
3957188 replicati mysql-9a29ec6a 838841 Binlog Master has sent all binlog to slave; waiting
for more updates
4145537 system us 830507 Connec Waiting for master to send event
4145780 system us 830495 Connec Waiting for an event from Coordinator
4145781 system us 830495 Connec Waiting for an event from Coordinator
4145782 system us 830495 Connec Waiting for an event from Coordinator
4145783 system us 830495 Connec Waiting for an event from Coordinator
4145784 system us 830495 Connec Waiting for an event from Coordinator
4145785 system us 830495 Connec Waiting for an event from Coordinator
4145786 system us 830495 Connec Waiting for an event from Coordinator
36561637 replicati 10.2.88.181 39996 Binlog Master has sent all binlog to slave; waiting
for more updates
4145778 system us 0 Connec Slave has read all relay log; waiting for
more updates
4145779 system us 0 Connec Waiting for an event from Coordinator
36948802 tasks app-b67c5b76 freshmail_ 0 Query INSERT INTO
`geo_subscribers`(`id_subscriber`,`id_campaign`,`id_geo_city`,`subscriber_opens`) VALUES (5
38005252 psuszalsk localhost test 0 Query show full processlist
13
Queries:
qps:
Slow:
Se/In/Up/De(%):
14
qps now:
Slow qps:
Threads:
15
Key Efficiency:
Bps in/out:
Now in/out:
16
wyświetla help
zmienia interwał czasowy wyświetlania (domyślnie 5 sekund)
włącza/wyłącza pokazywanie procesów w stanie “sleep”
wykonuje explain na zapytaniu
pokazuje pełne zapytanie
zabija podłączony process/zapytanie
17
● Możemy łatwo sprawdzić co aktualnie dzieje się na bazie danych
● Możliwość szybkiego wyłapania “zawieszonych” SQL
● Możliwość zabicia (kill) procesu
● Musimy “patrzeć” na output, żeby zobaczyć jakieś anomalie
● Nie wyłapiemy w ten sposób rzeczy które dzieją się poza “godzinami pracy”
19
Log zawierający “ ” zapytania
Log zawierający wszystko co dzieje się na styku oraz połączonego klienta
Nie do wykorzystania w środowisku produkcyjnym (nie zoptymalizowany)
21
domyślnie slow log jest wyłączony
jeśli go włączymy będzie logował zapytania których czas wykonania wynosi
slow_query_log
long_query_time
min_examined_row_limit
log_slow_admin_statements
log_queries_not_using_indexes
22
włącza lub wyłącza logowanie
default = 0, dynamic = Yes, scope = Global
czas jaki musi wykonywać się SQL aby trafiłą do slow loga
default = 10, dynamic = Yes, scope = Global, Session
ile rekordów musi przejrzeć SQL podczas wykonywania zapytania żeby zwrócić wynik
default = 0, dynamic = Yes, scope = Global, Session
czy zapytania administracyjne mają się logować do loga
default = OFF, dynamic = Yes, scope = Global
czy zapytania które nie korzystają z indeksów mają się logować do loga
default = OFF, dynamic = Yes, scope = Global
24
Zmienne to takie które można zmieniać w trakcie działania . Można to wykorzystać
do płynnego włączania/wyłączania slow query log w dowolnym momencie lub zmiany parametrów:
SET GLOBAL long_query_time = 1
SET GLOBAL log_queries_not_using_indexes = ON
Można to wykorzystać do selektywnego ustawiania parametrów, np. jeśli mamy cykliczne skrypty
generujące raporty (np. w środku nocy), można ustawić:
SET SESSION long_query_time = 5
25
Query_time czas wykonania zapytania
Lock_time czas na jaki został założony lock na rekordach
Rows_sent liczba zwróconych rekordów przez zapytanie
Rows_examined liczba rekordów które musiały zostały przeskanowane
Rows_affected liczba rekordów która uległa zmianie
Tmp_tables liczba stworzonych tabel tymczasowych w pamięci
Tmp_disk_tables liczba stworzonych tabel tymczasowych w pamięci
Tmp_table_sizes wielkość danych w tabelach tymczasowych
QC_Hit czy zapytanie zostało znalezione w Query Cache
Full_scan zapytanie wykonało Full Table Scan
Full_join zapytanie wykonały Full Join (join bez indexów)
Filesort czy zapytanie wymagało dodatkowego sortowania w pamięci
Filesort_on_disk czy sortowanie odbyło się na dysku
26
# Time: 2019-04-05T04:31:20.572573Z
# User@Host: tepsa[tepsa] @ [10.2.80.158] Id: 1930254
# Schema: freshmail_utf8 Last_errno: 0 Killed: 0
# Lock_time: 0.000340 Rows_affected:0
# Bytes_sent: 95
# InnoDB_trx_id: 0
#
# Merge_passes: 0
# InnoDB_IO_r_ops: 0 InnoDB_IO_r_bytes: 0 InnoDB_IO_r_wait: 0.000000
# InnoDB_rec_lock_wait: 0.000000 InnoDB_queue_wait: 0.000000
# InnoDB_pages_distinct: 7059
# Log_slow_rate_type: query Log_slow_rate_limit: 100
SET timestamp=1554438680;
SELECT `ca`.`id_campaign`
FROM `campaign` AS `ca`
JOIN `clients` ON (`ca`.`id_sub_clients` = `clients`.`id_clients`)
WHERE `ca`.`active`= 1 [...]
# Time: 2019-04-05T01:53:39.001288Z
# User@Host: sprytnyzbys[sprytnyzbys] @ [10.2.80.163] Id: 38277430
# Schema: freshmail_utf8 Last_errno: 0 Killed: 0
# Lock_time: 0.000263 Rows_affected:0
# Bytes_sent: 2973
# InnoDB_trx_id: 0
#
# Merge_passes: 0
# InnoDB_IO_r_ops: 0 InnoDB_IO_r_bytes: 0 InnoDB_IO_r_wait: 0.000000
# InnoDB_rec_lock_wait: 0.000000 InnoDB_queue_wait: 0.000000
# InnoDB_pages_distinct: 239
# Log_slow_rate_type: query Log_slow_rate_limit: 100
SET timestamp=1554429219;
SELECT * FROM
`promo`
JOIN `clients_prices_list_modifications` USING (`id_promo`)
JOIN `prices_list_modifications` USING (`id_prices_list_modifications`) [...]
# Time: 2019-04-05T12:03:37.723459Z
# User@Host: sprytnyzbys[sprytnyzbys] @ [10.2.80.163] Id: 39498862
# Schema: freshmail_utf8 Last_errno: 0 Killed: 0
# Lock_time: 0.000322 Rows_affected: 0
# Bytes_sent: 1739
# InnoDB_trx_id: 0
#
# Merge_passes: 0
# InnoDB_IO_r_ops: 0 InnoDB_IO_r_bytes: 0 InnoDB_IO_r_wait: 0.000000
# InnoDB_rec_lock_wait: 0.000000 InnoDB_queue_wait: 0.000000
# InnoDB_pages_distinct: 241
# Log_slow_rate_type: query Log_slow_rate_limit: 100
SET timestamp=1554465817;
SELECT p.`type` `type`, p.lump_amount p_no_limit_amount, p.lump_limit p_no_limit_limit,
p.lump_monthly_limit p_no_limit_monthly_limit, p.lump_period p_no_limit_period, p.prepaid_amount
p_prepaid_amount [...]
30
● Narzędzie od MySQL
● Grupuje SQLki tego samego typu “mock’ując” zmienne
● Nie pokazuje przykładowego zapytania
● Bardzo podstawowe narzędzie
● Narzędzie udostępnione w pakiecie Percona Toolkit
● Zapewnia bogatą analizę zapytań (histogram, sumaryczne czasy odpowiedzi)
● Może analizować zapytania z różnych źródeł (slow, general, binary log, tcpdump data)
31
# Overall: 18.11k total, 279 unique, 0.47 QPS, 0.98x concurrency _________
# Time range: 2019-04-05T01:47:23 to 2019-04-05T12:27:29
# Attribute total min max avg 95% stddev median
# ============ ======= ======= ======= ======= ======= ======= =======
# Exec time 37775s 362us 254s 2s 5s 4s 1s
# Lock time 12s 31us 218ms 641us 1ms 3ms 273us
# Rows sent 13.71M 0 108.22k 793.83 1.86k 4.75k 0.99
# Rows examine 5.44G 1000 4.47M 314.94k 961.27k 410.83k 245.21k
# Rows affecte 81.35M 0 1.01M 4.60k 9.33k 31.95k 0
# Bytes sent 1.61G 11 22.59M 93.33k 462.39k 529.92k 202.40
# Merge passes 4.30k 0 280 0.24 0 5.15 0
# Tmp tables 18.83k 0 492 1.06 2.90 11.27 0.99
# Tmp disk tbl 3.24k 0 171 0.18 1.96 3.33 0
# Tmp tbl size 7.43G 0 667.12M 430.22k 123.85k 11.51M 0
# Query size 67.13M 21 127.21k 3.80k 20.37k 15.75k 563.87
# Boolean:
# Filesort 42% yes, 57% no
# Filesort on 4% yes, 95% no
# Full join 0% yes, 99% no
# Full scan 14% yes, 85% no
# Tmp table 63% yes, 36% no
# Tmp table on 5% yes, 94% no
# Profile
# Rank Query ID Response time Calls R/Call V/M Item
# ==== ================== ================ ===== ======= ===== ===========
# 1 0xBF4E72ED91D75562 10946.9709 29.0% 4362 2.5096 0.45 SELECT campaign clients
campaign
# 2 0x5BEB7856C24D4756 5412.6546 14.3% 752 7.1977 8.47 SELECT campaign emails
ab_test_campaign
# 3 0xE98014575D3A5DB4 4744.8662 12.6% 3846 1.2337 0.12 SELECT subscribers_list
subscribers_group subscribers_list_visibility
# 4 0x8E5D739B4C326A9A 2046.5944 5.4% 677 3.0230 1.43 SELECT campaign
campaign_open
# 5 0xD46B2563438C3586 1550.8857 4.1% 143 10.8454 3.54 INSERT SELECT export_report
resign_why custom_fields_value subscribers
# 6 0xF85A87664B959053 1332.7157 3.5% 545 2.4453 0.98 SELECT campaign_open
# 7 0xDC7974965D34F622 1013.6093 2.7% 110 9.2146 85.92 SELECT UNION links
link_clicks subscribers subscribers_list campaign_open campaign_time_opened subscribers
subscribers_list subscribers subscribers_list
# 8 0x416B46394CC405E7 736.0859 1.9% 241 3.0543 2.14 UPDATE SELECT
subscribers_send_tmp_final_?
# Profile
# Rank Query ID Response time Calls R/Call V/M Item
# ==== ================== ================ ===== ======= ===== ===========
# 1 0xBF4E72ED91D75562 10946.9709 29.0% 4362 2.5096 0.45 SELECT campaign clients campaign
# 2 0x5BEB7856C24D4756 5412.6546 14.3% 752 7.1977 8.47 SELECT campaign emails ab_test_campaign
# 3 0xE98014575D3A5DB4 4744.8662 12.6% 3846 1.2337 0.12 SELECT subscribers_list subscribers_group
subscribers_list_visibility
# 4 0x8E5D739B4C326A9A 2046.5944 5.4% 677 3.0230 1.43 SELECT campaign campaign_open
# 5 0xD46B2563438C3586 1550.8857 4.1% 143 10.8454 3.54 INSERT SELECT export_report resign_why
custom_fields_value subscribers
# 6 0xF85A87664B959053 1332.7157 3.5% 545 2.4453 0.98 SELECT campaign_open
# 7 0xDC7974965D34F622 1013.6093 2.7% 110 9.2146 85.92 SELECT UNION links link_clicks subscribers
subscribers_list campaign_open campaign_time_opened subscribers subscribers_list subscribers subscribers_list
Rank numer porządkowy
Query ID fingerprint zapytania
Response time całkowity czas odpowiedzi, procentowy udział w przeanalizowanym logu
Calls liczba wykonanych zapytań
R/Call średni czas wykonania zapytania
V/M variance-to-mean ratio / index of dispersion
Item informacje o zapytaniu
# Query 1: 0.11 QPS, 0.29x concurrency, ID 0xBF4E72ED91D75562 at byte 59360468
# This item is included in the report because it matches --limit.
# Scores: V/M = 0.45
# Time range: 2019-04-05T01:47:23 to 2019-04-05T12:26:03
# Attribute pct total min max avg 95% stddev median
# ============ === ======= ======= ======= ======= ======= ======= =======
# Count 24 4362
# Exec time 28 10947s 6ms 10s 3s 4s 1s 2s
# Lock time 13 2s 171us 3ms 356us 541us 107us 332us
# Rows sent 0 459 0 1 0.11 0.99 0.30 0
# Rows examine 44 2.44G 1.37k 1.26M 586.02k 961.27k 236.29k 535.27k
# Rows affecte 0 0 0 0 0 0 0 0
[...]
# Boolean:
# Filesort 100% yes, 0% no
# Tmp table 100% yes, 0% no
# Query 7: 0.01 QPS, 0.05x concurrency, ID 0xDC7974965D34F622 at byte 14516565
# This item is included in the report because it matches --limit.
# Scores: V/M = 85.92
# Time range: 2019-04-05T06:36:20 to 2019-04-05T12:25:22
# Attribute pct total min max avg 95% stddev median
# ============ === ======= ======= ======= ======= ======= ======= =======
# Count 0 110
# Exec time 2 1014s 7ms 254s 9s 17s 28s 2s
# Lock time 0 113ms 394us 24ms 1ms 2ms 2ms 761us
# Rows sent 0 79 0 9 0.72 5.75 1.88 0
# Rows examine 1 74.79M 1.14k 2.20M 696.24k 2.15M 701.36k 462.39k
# Rows affecte 0 0 0 0 0 0 0 0
[...]
# Filesort 100% yes, 0% no
# Full scan 100% yes, 0% no
# Tmp table 100% yes, 0% no
# Tmp table on 100% yes, 0% no
# Query_time distribution
# 1us
# 10us
# 100us
# 1ms #
# 10ms #
# 100ms #
# 1s ################################################################
# 10s+
# Tables
# SHOW TABLE STATUS FROM `freshmail_utf8` LIKE 'campaign'G
# SHOW CREATE TABLE `freshmail_utf8`.`campaign`G
# SHOW TABLE STATUS FROM `freshmail_utf8` LIKE 'clients'G
# SHOW CREATE TABLE `freshmail_utf8`.`clients`G
# EXPLAIN /*!50100 PARTITIONS*/
SELECT `ca`.`id_campaign`
FROM `campaign` AS `ca`
JOIN `clients` ON (`ca`.`id_sub_clients` = `clients`.`id_clients`)
WHERE `ca`.`active`= 1
AND `ca`.`state` = 4 [...]
● Mamy historię najcięższych/niepoprawnych zapytań
● W dowolnym momencie możemy przeanalizować slow loga i znaleźć najcięższe zapytania
● Analiza post factum
● Wyłapujemy “tylko” najgorsze SQLki
● Brak kontekstu
38
#grep -A9 Query_time slow.log | grep SET | awk -F "=" '{ print $2 }' | uniq -c
5 1554458273;
3 1554458275;
3 1554458277;
1 1554458278;
2 1554458280;
2 1554458281;
1 1554458282;
4 1554458283;
2 1554458285;
3 1554458286;
6 1554458287;
2 1554458288;
6 1554458289;
pt-query-digest --filter '$event->{arg} =~ m/^(insert|update|delete)/i'
slow.log
pt-query-digest --filter '$event->{db} =~ m/^my_db_name/i' slow.log
SET GLOBAL slow_query_log_file = ‘/my/new/file’;
SET GLOBAL long_query_time = 0;
SET GLOBAL min_examined_row_limit = 0;
● Dodatkowe obciążenie I/O co może skutkować spowolnieniem działania aplikacji
● Szybki przyrost slow loga na dysku
● Nie zaleca się pozostawiania w takim stanie na dłuższy okres czasu
● Należy przywrócić stare ustawienia po czasie
tcpdump -s 65535 -x -nn -q -tttt -i any -c 400000 port 3306 > tcpdump.log
cat tcpdump.log > pt-query-digest --type tcpdump
● Dodatkowe obciążenie I/O co może skutkować spowolnieniem działania serwera
● Szybki przyrost zajętego miejsca na dysku
● Nie jest to format slow loga, jest nieczytelne dla człowieka
● Dane oparte tylko na analizie SQL, brak informacji o wykonaniu zapytania z silnika bazy danych
● Nadaje się tylko do pobieżnej analizy ruchu ad hoc
pt-query-digest slow.log
# Rank Query ID Response time Calls R/Call V/M Item
# ==== ================== ================ ===== ======= ===== ===========
# 1 0xBF4E72ED91D75562 10946.9709 29.0% 4362 2.5096 0.45 SELECT campaign clients campaign
# 2 0x5BEB7856C24D4756 5412.6546 14.3% 752 7.1977 8.47 SELECT campaign emails ab_test_campaign
# 3 0xE98014575D3A5DB4 4744.8662 12.6% 3846 1.2337 0.12 SELECT subscribers_list subscribers_group
subscribers_list_visibility
# 4 0x8E5D739B4C326A9A 2046.5944 5.4% 677 3.0230 1.43 SELECT campaign campaign_open
# 5 0xD46B2563438C3586 1550.8857 4.1% 143 10.8454 3.54 INSERT SELECT export_report resign_why
custom_fields_value subscribers
# 6 0xF85A87664B959053 1332.7157 3.5% 545 2.4453 0.98 SELECT campaign_open
# 7 0xDC7974965D34F622 1013.6093 2.7% 110 9.2146 85.92 SELECT UNION links link_clicks subscribers
subscribers_list campaign_open campaign_time_opened subscribers subscribers_list subscribers subscribers_list
# 8 0x416B46394CC405E7 736.0859 1.9% 241 3.0543 2.14 UPDATE SELECT subscribers_send_tmp_final_?
pt-query-digest --order-by cnt slow.log
# Rank Query ID Response time Calls R/Call V/M Item
# ==== ================== ================ ===== ======= ===== ===========
# 1 0xBF4E72ED91D75562 10946.9709 29.0% 4362 2.5096 0.45 SELECT campaign clients campaign
# 2 0xE98014575D3A5DB4 4744.8662 12.6% 3846 1.2337 0.12 SELECT subscribers_list subscribers_group
subscribers_list_visibility
# 3 0x5BEB7856C24D4756 5412.6546 14.3% 752 7.1977 8.47 SELECT campaign emails ab_test_campaign
# 4 0x8B1145225A468BE0 176.7579 0.5% 720 0.2455 1.23 SELECT campaign_open campaign
# 5 0x8E5D739B4C326A9A 2046.5944 5.4% 677 3.0230 1.43 SELECT campaign campaign_open
# 6 0xF85A87664B959053 1332.7157 3.5% 545 2.4453 0.98 SELECT campaign_open
# 7 0x4DE4C9D22E2E8E62 457.6944 1.2% 414 1.1055 0.91 SELECT custom_fields_value
# 8 0x0D8AB7748BD1DA96 35.5994 0.1% 331 0.1076 1.49 SELECT custom_fields_value
● Bardzo przydatne przy analizie slow loga ze wszystkimi zapytaniami
● Niemożliwe do analizy przy tcpdump
Mysql - bad queries, find them all

More Related Content

Similar to Mysql - bad queries, find them all

Krytyczne błędy konfiguracji
Krytyczne błędy konfiguracjiKrytyczne błędy konfiguracji
Krytyczne błędy konfiguracji
Logicaltrust pl
 
PLNOG22: Tomasz Jarlaczyk & Tomasz Ludwiczak - DNSv6 i SSL - historie z życia...
PLNOG22: Tomasz Jarlaczyk & Tomasz Ludwiczak - DNSv6 i SSL - historie z życia...PLNOG22: Tomasz Jarlaczyk & Tomasz Ludwiczak - DNSv6 i SSL - historie z życia...
PLNOG22: Tomasz Jarlaczyk & Tomasz Ludwiczak - DNSv6 i SSL - historie z życia...
PROIDEA
 
PLNOG 8: Jacek Skowyra - Zabezpieczenie routerów Juniper przed światem zewnę...
PLNOG 8: Jacek Skowyra  - Zabezpieczenie routerów Juniper przed światem zewnę...PLNOG 8: Jacek Skowyra  - Zabezpieczenie routerów Juniper przed światem zewnę...
PLNOG 8: Jacek Skowyra - Zabezpieczenie routerów Juniper przed światem zewnę...
PROIDEA
 
Devops/Sysops security
Devops/Sysops securityDevops/Sysops security
Devops/Sysops security
Logicaltrust pl
 
PLNOG16: Nowe założenia dla zbieranie logów, statystyk i alertów, Maciej Kałk...
PLNOG16: Nowe założenia dla zbieranie logów, statystyk i alertów, Maciej Kałk...PLNOG16: Nowe założenia dla zbieranie logów, statystyk i alertów, Maciej Kałk...
PLNOG16: Nowe założenia dla zbieranie logów, statystyk i alertów, Maciej Kałk...
PROIDEA
 
ASP.NET MVC - najważniejsze założenia
ASP.NET MVC - najważniejsze założeniaASP.NET MVC - najważniejsze założenia
ASP.NET MVC - najważniejsze założenia
Bartlomiej Zass
 
PLNOG22 - Piotr Stolarek - Bezpieczeństwo użytkowania platform usługowych Tel...
PLNOG22 - Piotr Stolarek - Bezpieczeństwo użytkowania platform usługowych Tel...PLNOG22 - Piotr Stolarek - Bezpieczeństwo użytkowania platform usługowych Tel...
PLNOG22 - Piotr Stolarek - Bezpieczeństwo użytkowania platform usługowych Tel...
PROIDEA
 
Allegro Tech Talks Poznań #4: Jak przyspieszyć SOLRa w kilku prostych krokach.
Allegro Tech Talks Poznań #4: Jak przyspieszyć SOLRa w kilku prostych krokach. Allegro Tech Talks Poznań #4: Jak przyspieszyć SOLRa w kilku prostych krokach.
Allegro Tech Talks Poznań #4: Jak przyspieszyć SOLRa w kilku prostych krokach.
allegro.tech
 
DATA CENTER CONVERGED 2012 WARSAW
DATA CENTER CONVERGED 2012 WARSAWDATA CENTER CONVERGED 2012 WARSAW
DATA CENTER CONVERGED 2012 WARSAW
Pawel Wawrzyniak
 
SQL Server 2008 Tips & tricks administracji
SQL Server 2008 Tips & tricks administracjiSQL Server 2008 Tips & tricks administracji
SQL Server 2008 Tips & tricks administracji
SQLExpert.pl
 
Apache http server - proste i zaawansowane przypadki użycia
Apache http server - proste i zaawansowane przypadki użyciaApache http server - proste i zaawansowane przypadki użycia
Apache http server - proste i zaawansowane przypadki użyciaWojciech Lichota
 
DBPLUS Performance Monitor dla PostgeSQL
DBPLUS Performance Monitor dla PostgeSQLDBPLUS Performance Monitor dla PostgeSQL
DBPLUS Performance Monitor dla PostgeSQL
DBPLUS
 
PLNOG 6: Łukasz Jagiełło - Wdrożenie skalowalnego systemu plików GlusterFS w ...
PLNOG 6: Łukasz Jagiełło - Wdrożenie skalowalnego systemu plików GlusterFS w ...PLNOG 6: Łukasz Jagiełło - Wdrożenie skalowalnego systemu plików GlusterFS w ...
PLNOG 6: Łukasz Jagiełło - Wdrożenie skalowalnego systemu plików GlusterFS w ...
PROIDEA
 
Monitoring sieci
Monitoring sieciMonitoring sieci
Monitoring sieci
Kamil Grabowski
 
SELinux, czyli zero-zero-day exploits - DWO 2013
SELinux, czyli zero-zero-day exploits - DWO 2013SELinux, czyli zero-zero-day exploits - DWO 2013
SELinux, czyli zero-zero-day exploits - DWO 2013
Adam Przybyła
 

Similar to Mysql - bad queries, find them all (15)

Krytyczne błędy konfiguracji
Krytyczne błędy konfiguracjiKrytyczne błędy konfiguracji
Krytyczne błędy konfiguracji
 
PLNOG22: Tomasz Jarlaczyk & Tomasz Ludwiczak - DNSv6 i SSL - historie z życia...
PLNOG22: Tomasz Jarlaczyk & Tomasz Ludwiczak - DNSv6 i SSL - historie z życia...PLNOG22: Tomasz Jarlaczyk & Tomasz Ludwiczak - DNSv6 i SSL - historie z życia...
PLNOG22: Tomasz Jarlaczyk & Tomasz Ludwiczak - DNSv6 i SSL - historie z życia...
 
PLNOG 8: Jacek Skowyra - Zabezpieczenie routerów Juniper przed światem zewnę...
PLNOG 8: Jacek Skowyra  - Zabezpieczenie routerów Juniper przed światem zewnę...PLNOG 8: Jacek Skowyra  - Zabezpieczenie routerów Juniper przed światem zewnę...
PLNOG 8: Jacek Skowyra - Zabezpieczenie routerów Juniper przed światem zewnę...
 
Devops/Sysops security
Devops/Sysops securityDevops/Sysops security
Devops/Sysops security
 
PLNOG16: Nowe założenia dla zbieranie logów, statystyk i alertów, Maciej Kałk...
PLNOG16: Nowe założenia dla zbieranie logów, statystyk i alertów, Maciej Kałk...PLNOG16: Nowe założenia dla zbieranie logów, statystyk i alertów, Maciej Kałk...
PLNOG16: Nowe założenia dla zbieranie logów, statystyk i alertów, Maciej Kałk...
 
ASP.NET MVC - najważniejsze założenia
ASP.NET MVC - najważniejsze założeniaASP.NET MVC - najważniejsze założenia
ASP.NET MVC - najważniejsze założenia
 
PLNOG22 - Piotr Stolarek - Bezpieczeństwo użytkowania platform usługowych Tel...
PLNOG22 - Piotr Stolarek - Bezpieczeństwo użytkowania platform usługowych Tel...PLNOG22 - Piotr Stolarek - Bezpieczeństwo użytkowania platform usługowych Tel...
PLNOG22 - Piotr Stolarek - Bezpieczeństwo użytkowania platform usługowych Tel...
 
Allegro Tech Talks Poznań #4: Jak przyspieszyć SOLRa w kilku prostych krokach.
Allegro Tech Talks Poznań #4: Jak przyspieszyć SOLRa w kilku prostych krokach. Allegro Tech Talks Poznań #4: Jak przyspieszyć SOLRa w kilku prostych krokach.
Allegro Tech Talks Poznań #4: Jak przyspieszyć SOLRa w kilku prostych krokach.
 
DATA CENTER CONVERGED 2012 WARSAW
DATA CENTER CONVERGED 2012 WARSAWDATA CENTER CONVERGED 2012 WARSAW
DATA CENTER CONVERGED 2012 WARSAW
 
SQL Server 2008 Tips & tricks administracji
SQL Server 2008 Tips & tricks administracjiSQL Server 2008 Tips & tricks administracji
SQL Server 2008 Tips & tricks administracji
 
Apache http server - proste i zaawansowane przypadki użycia
Apache http server - proste i zaawansowane przypadki użyciaApache http server - proste i zaawansowane przypadki użycia
Apache http server - proste i zaawansowane przypadki użycia
 
DBPLUS Performance Monitor dla PostgeSQL
DBPLUS Performance Monitor dla PostgeSQLDBPLUS Performance Monitor dla PostgeSQL
DBPLUS Performance Monitor dla PostgeSQL
 
PLNOG 6: Łukasz Jagiełło - Wdrożenie skalowalnego systemu plików GlusterFS w ...
PLNOG 6: Łukasz Jagiełło - Wdrożenie skalowalnego systemu plików GlusterFS w ...PLNOG 6: Łukasz Jagiełło - Wdrożenie skalowalnego systemu plików GlusterFS w ...
PLNOG 6: Łukasz Jagiełło - Wdrożenie skalowalnego systemu plików GlusterFS w ...
 
Monitoring sieci
Monitoring sieciMonitoring sieci
Monitoring sieci
 
SELinux, czyli zero-zero-day exploits - DWO 2013
SELinux, czyli zero-zero-day exploits - DWO 2013SELinux, czyli zero-zero-day exploits - DWO 2013
SELinux, czyli zero-zero-day exploits - DWO 2013
 

Mysql - bad queries, find them all

  • 1.
  • 2. ● SHOW PROCESSLIST, mytop/innotop ● slow log, query log, pt-query-digest, mysqldumpslow ● co jeszcze da się wyciągnąć, czyli nieoczywiste zastosowania powyższych narzędzi 2
  • 3. 3 3
  • 4. 4
  • 5. 5
  • 6. Pokazuje procesy połączone do MySQL Aby wyświetlić wszystkie procesy wymaga uprawnienia W przeciwnym wypadku pokazuje tylko procesy aktualnie połączonego usera 6
  • 7. mysql> show processlist; +------+-------------+-------------------+----------------+---------+-------+----------+------------------+-----------+---------------+ | Id | User | Host | db | Command | Time | State | Info | Rows_sent | Rows_examined | +------+-------------+-------------------+----------------+---------+-------+----------+------------------+-----------+---------------+ | 2 | sprytnyzbys | application:49914 | freshmail_utf8 | Sleep | 42256 | | NULL | 0 | 0 | | 7 | sprytnyzbys | application:49996 | freshmail_utf8 | Sleep | 0 | | NULL | 0 | 0 | | 619 | root | localhost | freshmail_utf8 | Sleep | 27245 | | NULL | 4 | 4 | | 5502 | tasks | application:54980 | freshmail_utf8 | Sleep | 2241 | | NULL | 84 | 168 | | 6196 | root | localhost | freshmail_utf8 | Query | 0 | starting | show processlist | 0 | 0 | | 6250 | tasks | application:48422 | freshmail_utf8 | Sleep | 1 | | NULL | 0 | 0 | | 6307 | tasks | application:49524 | freshmail_utf8 | Sleep | 3 | | NULL | 0 | 0 | | 6317 | sprytnyzbys | application:49648 | freshmail_utf8 | Sleep | 0 | | NULL | 0 | 0 | +------+-------------+-------------------+----------------+---------+-------+----------+------------------+-----------+---------------+ 8 rows in set (0.00 sec)
  • 8. mysql> show processlist; +------+-------------+-------------------+----------------+---------+-------+------------+------------------------------------------------------ ------------------------------------------------+-----------+---------------+ | Id | User | Host | db | Command | Time | State | Info | Rows_sent | Rows_examined | +------+-------------+-------------------+----------------+---------+-------+------------+------------------------------------------------------ ------------------------------------------------+-----------+---------------+ | 2 | sprytnyzbys | application:49914 | freshmail_utf8 | Sleep | 42241 | | NULL | 0 | 0 | | 7 | sprytnyzbys | application:49996 | freshmail_utf8 | Sleep | 0 | | NULL | 0 | 0 | | 619 | root | localhost | freshmail_utf8 | Sleep | 27230 | | NULL | 4 | 4 | | 5502 | tasks | application:54980 | freshmail_utf8 | Sleep | 2226 | | NULL | 84 | 168 | | 6196 | root | localhost | freshmail_utf8 | Query | 0 | starting | show processlist | 0 | 0 | | 6250 | tasks | application:48422 | freshmail_utf8 | Sleep | 1 | | NULL | 0 | 0 | | 6259 | tasks | application:48818 | freshmail_utf8 | Sleep | 3 | | NULL | 0 | 0 | | 6263 | sprytnyzbys | application:48914 | freshmail_utf8 | Query | 0 | statistics | SELECT `state`, MAX(`added_on`) AS `max_added_on`, count(id_subscribers) AS `count` FROM `subscribers` WHERE `id_subscribe | 0 | 0 | +------+-------------+-------------------+----------------+---------+-------+------------+------------------------------------------------------ ------------------------------------------------+-----------+---------------+ 8 rows in set (0.00 sec)
  • 9. mysql> show full processlist; +------+-------------+-------------------+----------------+---------+-------+------------+------------------------------------------------------ ------------------------------------------------+-----------+---------------+ | Id | User | Host | db | Command | Time | State | Info | Rows_sent | Rows_examined | +------+-------------+-------------------+----------------+---------+-------+------------+------------------------------------------------------ ------------------------------------------------+-----------+---------------+ | 2 | sprytnyzbys | application:49914 | freshmail_utf8 | Sleep | 42241 | | NULL | 0 | 0 | | 7 | sprytnyzbys | application:49996 | freshmail_utf8 | Sleep | 0 | | NULL | 0 | 0 | | 619 | root | localhost | freshmail_utf8 | Sleep | 27230 | | NULL | 4 | 4 | | 5502 | tasks | application:54980 | freshmail_utf8 | Sleep | 2226 | | NULL | 84 | 168 | | 6196 | root | localhost | freshmail_utf8 | Query | 0 | starting | show processlist | 0 | 0 | | 6250 | tasks | application:48422 | freshmail_utf8 | Sleep | 1 | | NULL | 0 | 0 | | 6259 | tasks | application:48818 | freshmail_utf8 | Sleep | 3 | | NULL | 0 | 0 | | 6263 | sprytnyzbys | application:48914 | freshmail_utf8 | Query | 0 | statistics | SELECT `state`, MAX(`added_on`) AS `max_added_on`, count(id_subscribers) AS `count` FROM `subscribers` WHERE `id_subscribers_list = 1448 AND `id_clients` = 338 | 0 | 0 | +------+-------------+-------------------+----------------+---------+-------+------------+------------------------------------------------------ ------------------------------------------------+-----------+---------------+ 8 rows in set (0.00 sec)
  • 10. SELECT * FROM information_schema.processlist; 10
  • 11. SELECT * FROM information_schema.processlist WHERE Time > 10 AND Command != “Sleep”; SELECT User, COUNT(*) FROM information_schema.processlist GROUP BY User WITH ROLLUP; 11
  • 12. Konsolowe narzędzie do monitorowania procesów podłączonych do MySQL. Wymaga uprawnienia Wyświetla stan procesów podłączonych do bazy danych. 12
  • 13. MySQL on localhost (5.7.23-23-log) up 40+12:49:58 [23:38:16] Queries: 604.1M qps: 181 Slow: 281.8k Se/In/Up/De(%): 57/21/19/00 qps now: 306 Slow qps: 0.0 Threads: 70 ( 4/ 0) 73/03/00/00 Key Efficiency: 99.6% Bps in/out: 327.5k/725.6k Now in/out: 95.7k/235.8k Id User Host/IP DB Time Cmd Query or State -- ---- ------- -- ---- --- ---------- 3957188 replicati mysql-9a29ec6a 838841 Binlog Master has sent all binlog to slave; waiting for more updates 4145537 system us 830507 Connec Waiting for master to send event 4145780 system us 830495 Connec Waiting for an event from Coordinator 4145781 system us 830495 Connec Waiting for an event from Coordinator 4145782 system us 830495 Connec Waiting for an event from Coordinator 4145783 system us 830495 Connec Waiting for an event from Coordinator 4145784 system us 830495 Connec Waiting for an event from Coordinator 4145785 system us 830495 Connec Waiting for an event from Coordinator 4145786 system us 830495 Connec Waiting for an event from Coordinator 36561637 replicati 10.2.88.181 39996 Binlog Master has sent all binlog to slave; waiting for more updates 4145778 system us 0 Connec Slave has read all relay log; waiting for more updates 4145779 system us 0 Connec Waiting for an event from Coordinator 36948802 tasks app-b67c5b76 freshmail_ 0 Query INSERT INTO `geo_subscribers`(`id_subscriber`,`id_campaign`,`id_geo_city`,`subscriber_opens`) VALUES (5 38005252 psuszalsk localhost test 0 Query show full processlist 13
  • 17. wyświetla help zmienia interwał czasowy wyświetlania (domyślnie 5 sekund) włącza/wyłącza pokazywanie procesów w stanie “sleep” wykonuje explain na zapytaniu pokazuje pełne zapytanie zabija podłączony process/zapytanie 17
  • 18.
  • 19. ● Możemy łatwo sprawdzić co aktualnie dzieje się na bazie danych ● Możliwość szybkiego wyłapania “zawieszonych” SQL ● Możliwość zabicia (kill) procesu ● Musimy “patrzeć” na output, żeby zobaczyć jakieś anomalie ● Nie wyłapiemy w ten sposób rzeczy które dzieją się poza “godzinami pracy” 19
  • 20.
  • 21. Log zawierający “ ” zapytania Log zawierający wszystko co dzieje się na styku oraz połączonego klienta Nie do wykorzystania w środowisku produkcyjnym (nie zoptymalizowany) 21
  • 22. domyślnie slow log jest wyłączony jeśli go włączymy będzie logował zapytania których czas wykonania wynosi slow_query_log long_query_time min_examined_row_limit log_slow_admin_statements log_queries_not_using_indexes 22
  • 23. włącza lub wyłącza logowanie default = 0, dynamic = Yes, scope = Global czas jaki musi wykonywać się SQL aby trafiłą do slow loga default = 10, dynamic = Yes, scope = Global, Session ile rekordów musi przejrzeć SQL podczas wykonywania zapytania żeby zwrócić wynik default = 0, dynamic = Yes, scope = Global, Session
  • 24. czy zapytania administracyjne mają się logować do loga default = OFF, dynamic = Yes, scope = Global czy zapytania które nie korzystają z indeksów mają się logować do loga default = OFF, dynamic = Yes, scope = Global 24
  • 25. Zmienne to takie które można zmieniać w trakcie działania . Można to wykorzystać do płynnego włączania/wyłączania slow query log w dowolnym momencie lub zmiany parametrów: SET GLOBAL long_query_time = 1 SET GLOBAL log_queries_not_using_indexes = ON Można to wykorzystać do selektywnego ustawiania parametrów, np. jeśli mamy cykliczne skrypty generujące raporty (np. w środku nocy), można ustawić: SET SESSION long_query_time = 5 25
  • 26. Query_time czas wykonania zapytania Lock_time czas na jaki został założony lock na rekordach Rows_sent liczba zwróconych rekordów przez zapytanie Rows_examined liczba rekordów które musiały zostały przeskanowane Rows_affected liczba rekordów która uległa zmianie Tmp_tables liczba stworzonych tabel tymczasowych w pamięci Tmp_disk_tables liczba stworzonych tabel tymczasowych w pamięci Tmp_table_sizes wielkość danych w tabelach tymczasowych QC_Hit czy zapytanie zostało znalezione w Query Cache Full_scan zapytanie wykonało Full Table Scan Full_join zapytanie wykonały Full Join (join bez indexów) Filesort czy zapytanie wymagało dodatkowego sortowania w pamięci Filesort_on_disk czy sortowanie odbyło się na dysku 26
  • 27. # Time: 2019-04-05T04:31:20.572573Z # User@Host: tepsa[tepsa] @ [10.2.80.158] Id: 1930254 # Schema: freshmail_utf8 Last_errno: 0 Killed: 0 # Lock_time: 0.000340 Rows_affected:0 # Bytes_sent: 95 # InnoDB_trx_id: 0 # # Merge_passes: 0 # InnoDB_IO_r_ops: 0 InnoDB_IO_r_bytes: 0 InnoDB_IO_r_wait: 0.000000 # InnoDB_rec_lock_wait: 0.000000 InnoDB_queue_wait: 0.000000 # InnoDB_pages_distinct: 7059 # Log_slow_rate_type: query Log_slow_rate_limit: 100 SET timestamp=1554438680; SELECT `ca`.`id_campaign` FROM `campaign` AS `ca` JOIN `clients` ON (`ca`.`id_sub_clients` = `clients`.`id_clients`) WHERE `ca`.`active`= 1 [...]
  • 28. # Time: 2019-04-05T01:53:39.001288Z # User@Host: sprytnyzbys[sprytnyzbys] @ [10.2.80.163] Id: 38277430 # Schema: freshmail_utf8 Last_errno: 0 Killed: 0 # Lock_time: 0.000263 Rows_affected:0 # Bytes_sent: 2973 # InnoDB_trx_id: 0 # # Merge_passes: 0 # InnoDB_IO_r_ops: 0 InnoDB_IO_r_bytes: 0 InnoDB_IO_r_wait: 0.000000 # InnoDB_rec_lock_wait: 0.000000 InnoDB_queue_wait: 0.000000 # InnoDB_pages_distinct: 239 # Log_slow_rate_type: query Log_slow_rate_limit: 100 SET timestamp=1554429219; SELECT * FROM `promo` JOIN `clients_prices_list_modifications` USING (`id_promo`) JOIN `prices_list_modifications` USING (`id_prices_list_modifications`) [...]
  • 29. # Time: 2019-04-05T12:03:37.723459Z # User@Host: sprytnyzbys[sprytnyzbys] @ [10.2.80.163] Id: 39498862 # Schema: freshmail_utf8 Last_errno: 0 Killed: 0 # Lock_time: 0.000322 Rows_affected: 0 # Bytes_sent: 1739 # InnoDB_trx_id: 0 # # Merge_passes: 0 # InnoDB_IO_r_ops: 0 InnoDB_IO_r_bytes: 0 InnoDB_IO_r_wait: 0.000000 # InnoDB_rec_lock_wait: 0.000000 InnoDB_queue_wait: 0.000000 # InnoDB_pages_distinct: 241 # Log_slow_rate_type: query Log_slow_rate_limit: 100 SET timestamp=1554465817; SELECT p.`type` `type`, p.lump_amount p_no_limit_amount, p.lump_limit p_no_limit_limit, p.lump_monthly_limit p_no_limit_monthly_limit, p.lump_period p_no_limit_period, p.prepaid_amount p_prepaid_amount [...]
  • 30. 30
  • 31. ● Narzędzie od MySQL ● Grupuje SQLki tego samego typu “mock’ując” zmienne ● Nie pokazuje przykładowego zapytania ● Bardzo podstawowe narzędzie ● Narzędzie udostępnione w pakiecie Percona Toolkit ● Zapewnia bogatą analizę zapytań (histogram, sumaryczne czasy odpowiedzi) ● Może analizować zapytania z różnych źródeł (slow, general, binary log, tcpdump data) 31
  • 32. # Overall: 18.11k total, 279 unique, 0.47 QPS, 0.98x concurrency _________ # Time range: 2019-04-05T01:47:23 to 2019-04-05T12:27:29 # Attribute total min max avg 95% stddev median # ============ ======= ======= ======= ======= ======= ======= ======= # Exec time 37775s 362us 254s 2s 5s 4s 1s # Lock time 12s 31us 218ms 641us 1ms 3ms 273us # Rows sent 13.71M 0 108.22k 793.83 1.86k 4.75k 0.99 # Rows examine 5.44G 1000 4.47M 314.94k 961.27k 410.83k 245.21k # Rows affecte 81.35M 0 1.01M 4.60k 9.33k 31.95k 0 # Bytes sent 1.61G 11 22.59M 93.33k 462.39k 529.92k 202.40 # Merge passes 4.30k 0 280 0.24 0 5.15 0 # Tmp tables 18.83k 0 492 1.06 2.90 11.27 0.99 # Tmp disk tbl 3.24k 0 171 0.18 1.96 3.33 0 # Tmp tbl size 7.43G 0 667.12M 430.22k 123.85k 11.51M 0 # Query size 67.13M 21 127.21k 3.80k 20.37k 15.75k 563.87 # Boolean: # Filesort 42% yes, 57% no # Filesort on 4% yes, 95% no # Full join 0% yes, 99% no # Full scan 14% yes, 85% no # Tmp table 63% yes, 36% no # Tmp table on 5% yes, 94% no
  • 33. # Profile # Rank Query ID Response time Calls R/Call V/M Item # ==== ================== ================ ===== ======= ===== =========== # 1 0xBF4E72ED91D75562 10946.9709 29.0% 4362 2.5096 0.45 SELECT campaign clients campaign # 2 0x5BEB7856C24D4756 5412.6546 14.3% 752 7.1977 8.47 SELECT campaign emails ab_test_campaign # 3 0xE98014575D3A5DB4 4744.8662 12.6% 3846 1.2337 0.12 SELECT subscribers_list subscribers_group subscribers_list_visibility # 4 0x8E5D739B4C326A9A 2046.5944 5.4% 677 3.0230 1.43 SELECT campaign campaign_open # 5 0xD46B2563438C3586 1550.8857 4.1% 143 10.8454 3.54 INSERT SELECT export_report resign_why custom_fields_value subscribers # 6 0xF85A87664B959053 1332.7157 3.5% 545 2.4453 0.98 SELECT campaign_open # 7 0xDC7974965D34F622 1013.6093 2.7% 110 9.2146 85.92 SELECT UNION links link_clicks subscribers subscribers_list campaign_open campaign_time_opened subscribers subscribers_list subscribers subscribers_list # 8 0x416B46394CC405E7 736.0859 1.9% 241 3.0543 2.14 UPDATE SELECT subscribers_send_tmp_final_?
  • 34. # Profile # Rank Query ID Response time Calls R/Call V/M Item # ==== ================== ================ ===== ======= ===== =========== # 1 0xBF4E72ED91D75562 10946.9709 29.0% 4362 2.5096 0.45 SELECT campaign clients campaign # 2 0x5BEB7856C24D4756 5412.6546 14.3% 752 7.1977 8.47 SELECT campaign emails ab_test_campaign # 3 0xE98014575D3A5DB4 4744.8662 12.6% 3846 1.2337 0.12 SELECT subscribers_list subscribers_group subscribers_list_visibility # 4 0x8E5D739B4C326A9A 2046.5944 5.4% 677 3.0230 1.43 SELECT campaign campaign_open # 5 0xD46B2563438C3586 1550.8857 4.1% 143 10.8454 3.54 INSERT SELECT export_report resign_why custom_fields_value subscribers # 6 0xF85A87664B959053 1332.7157 3.5% 545 2.4453 0.98 SELECT campaign_open # 7 0xDC7974965D34F622 1013.6093 2.7% 110 9.2146 85.92 SELECT UNION links link_clicks subscribers subscribers_list campaign_open campaign_time_opened subscribers subscribers_list subscribers subscribers_list Rank numer porządkowy Query ID fingerprint zapytania Response time całkowity czas odpowiedzi, procentowy udział w przeanalizowanym logu Calls liczba wykonanych zapytań R/Call średni czas wykonania zapytania V/M variance-to-mean ratio / index of dispersion Item informacje o zapytaniu
  • 35. # Query 1: 0.11 QPS, 0.29x concurrency, ID 0xBF4E72ED91D75562 at byte 59360468 # This item is included in the report because it matches --limit. # Scores: V/M = 0.45 # Time range: 2019-04-05T01:47:23 to 2019-04-05T12:26:03 # Attribute pct total min max avg 95% stddev median # ============ === ======= ======= ======= ======= ======= ======= ======= # Count 24 4362 # Exec time 28 10947s 6ms 10s 3s 4s 1s 2s # Lock time 13 2s 171us 3ms 356us 541us 107us 332us # Rows sent 0 459 0 1 0.11 0.99 0.30 0 # Rows examine 44 2.44G 1.37k 1.26M 586.02k 961.27k 236.29k 535.27k # Rows affecte 0 0 0 0 0 0 0 0 [...] # Boolean: # Filesort 100% yes, 0% no # Tmp table 100% yes, 0% no
  • 36. # Query 7: 0.01 QPS, 0.05x concurrency, ID 0xDC7974965D34F622 at byte 14516565 # This item is included in the report because it matches --limit. # Scores: V/M = 85.92 # Time range: 2019-04-05T06:36:20 to 2019-04-05T12:25:22 # Attribute pct total min max avg 95% stddev median # ============ === ======= ======= ======= ======= ======= ======= ======= # Count 0 110 # Exec time 2 1014s 7ms 254s 9s 17s 28s 2s # Lock time 0 113ms 394us 24ms 1ms 2ms 2ms 761us # Rows sent 0 79 0 9 0.72 5.75 1.88 0 # Rows examine 1 74.79M 1.14k 2.20M 696.24k 2.15M 701.36k 462.39k # Rows affecte 0 0 0 0 0 0 0 0 [...] # Filesort 100% yes, 0% no # Full scan 100% yes, 0% no # Tmp table 100% yes, 0% no # Tmp table on 100% yes, 0% no
  • 37. # Query_time distribution # 1us # 10us # 100us # 1ms # # 10ms # # 100ms # # 1s ################################################################ # 10s+ # Tables # SHOW TABLE STATUS FROM `freshmail_utf8` LIKE 'campaign'G # SHOW CREATE TABLE `freshmail_utf8`.`campaign`G # SHOW TABLE STATUS FROM `freshmail_utf8` LIKE 'clients'G # SHOW CREATE TABLE `freshmail_utf8`.`clients`G # EXPLAIN /*!50100 PARTITIONS*/ SELECT `ca`.`id_campaign` FROM `campaign` AS `ca` JOIN `clients` ON (`ca`.`id_sub_clients` = `clients`.`id_clients`) WHERE `ca`.`active`= 1 AND `ca`.`state` = 4 [...]
  • 38. ● Mamy historię najcięższych/niepoprawnych zapytań ● W dowolnym momencie możemy przeanalizować slow loga i znaleźć najcięższe zapytania ● Analiza post factum ● Wyłapujemy “tylko” najgorsze SQLki ● Brak kontekstu 38
  • 39.
  • 40. #grep -A9 Query_time slow.log | grep SET | awk -F "=" '{ print $2 }' | uniq -c 5 1554458273; 3 1554458275; 3 1554458277; 1 1554458278; 2 1554458280; 2 1554458281; 1 1554458282; 4 1554458283; 2 1554458285; 3 1554458286; 6 1554458287; 2 1554458288; 6 1554458289;
  • 41.
  • 42. pt-query-digest --filter '$event->{arg} =~ m/^(insert|update|delete)/i' slow.log pt-query-digest --filter '$event->{db} =~ m/^my_db_name/i' slow.log
  • 43. SET GLOBAL slow_query_log_file = ‘/my/new/file’; SET GLOBAL long_query_time = 0; SET GLOBAL min_examined_row_limit = 0; ● Dodatkowe obciążenie I/O co może skutkować spowolnieniem działania aplikacji ● Szybki przyrost slow loga na dysku ● Nie zaleca się pozostawiania w takim stanie na dłuższy okres czasu ● Należy przywrócić stare ustawienia po czasie
  • 44. tcpdump -s 65535 -x -nn -q -tttt -i any -c 400000 port 3306 > tcpdump.log cat tcpdump.log > pt-query-digest --type tcpdump ● Dodatkowe obciążenie I/O co może skutkować spowolnieniem działania serwera ● Szybki przyrost zajętego miejsca na dysku ● Nie jest to format slow loga, jest nieczytelne dla człowieka ● Dane oparte tylko na analizie SQL, brak informacji o wykonaniu zapytania z silnika bazy danych ● Nadaje się tylko do pobieżnej analizy ruchu ad hoc
  • 45. pt-query-digest slow.log # Rank Query ID Response time Calls R/Call V/M Item # ==== ================== ================ ===== ======= ===== =========== # 1 0xBF4E72ED91D75562 10946.9709 29.0% 4362 2.5096 0.45 SELECT campaign clients campaign # 2 0x5BEB7856C24D4756 5412.6546 14.3% 752 7.1977 8.47 SELECT campaign emails ab_test_campaign # 3 0xE98014575D3A5DB4 4744.8662 12.6% 3846 1.2337 0.12 SELECT subscribers_list subscribers_group subscribers_list_visibility # 4 0x8E5D739B4C326A9A 2046.5944 5.4% 677 3.0230 1.43 SELECT campaign campaign_open # 5 0xD46B2563438C3586 1550.8857 4.1% 143 10.8454 3.54 INSERT SELECT export_report resign_why custom_fields_value subscribers # 6 0xF85A87664B959053 1332.7157 3.5% 545 2.4453 0.98 SELECT campaign_open # 7 0xDC7974965D34F622 1013.6093 2.7% 110 9.2146 85.92 SELECT UNION links link_clicks subscribers subscribers_list campaign_open campaign_time_opened subscribers subscribers_list subscribers subscribers_list # 8 0x416B46394CC405E7 736.0859 1.9% 241 3.0543 2.14 UPDATE SELECT subscribers_send_tmp_final_?
  • 46. pt-query-digest --order-by cnt slow.log # Rank Query ID Response time Calls R/Call V/M Item # ==== ================== ================ ===== ======= ===== =========== # 1 0xBF4E72ED91D75562 10946.9709 29.0% 4362 2.5096 0.45 SELECT campaign clients campaign # 2 0xE98014575D3A5DB4 4744.8662 12.6% 3846 1.2337 0.12 SELECT subscribers_list subscribers_group subscribers_list_visibility # 3 0x5BEB7856C24D4756 5412.6546 14.3% 752 7.1977 8.47 SELECT campaign emails ab_test_campaign # 4 0x8B1145225A468BE0 176.7579 0.5% 720 0.2455 1.23 SELECT campaign_open campaign # 5 0x8E5D739B4C326A9A 2046.5944 5.4% 677 3.0230 1.43 SELECT campaign campaign_open # 6 0xF85A87664B959053 1332.7157 3.5% 545 2.4453 0.98 SELECT campaign_open # 7 0x4DE4C9D22E2E8E62 457.6944 1.2% 414 1.1055 0.91 SELECT custom_fields_value # 8 0x0D8AB7748BD1DA96 35.5994 0.1% 331 0.1076 1.49 SELECT custom_fields_value ● Bardzo przydatne przy analizie slow loga ze wszystkimi zapytaniami ● Niemożliwe do analizy przy tcpdump