Есть ли такой инструмент, как Microsoft Profiler для SQL Server для MySQL? [закрыто]

При разработке на MySQL я действительно пропускаю возможность запуска профилировщика. Я нахожу SQLyog - достаточно хорошая замена для Query Analyzer, но не нашел инструмент, который работает как профилировщик SQL ,

Для пользователей MySQL, которые не видели Microsoft SQL Profiler , вот скриншот

profiler sql

На моей предыдущей работе у нас был инструмент, который перегруженный SQL-профайлер и даже дал нам трассировки стека

altiris profiler

Кто-нибудь знает о каких-либо инструментах, подобных тем, которые я упоминал, которые работают с MySQL.

(FYI, я могу заставить Altiris Profiler работать с MySQL, но он будет включать запуск Windows, а также не Symantec sku, поэтому лицензирование действительно сложно)

41 голос | спросил Sam Saffron 24 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowWed, 24 Sep 2008 05:40:48 +0400 2008, 05:40:48

9 ответов


4

Нет, такого инструмента нет.

ответил Sam Saffron 23 PM00000040000002731 2009, 16:45:27
15

MySQL никогда не сталкивался с Query Profiling. Теперь, когда MySQL является grandfathered от Oracle, я знаю, что это будет продолжаться.

Тем не менее, всякая надежда не потеряна.

Начиная с 2007 года, Percona придумала некоторые удивительные инструменты для всего, что хотел бы Разработчик и DBA, включая Query Profiling.

Первый набор инструментов Percona, известный как MAATKIT , создал сферу для серьезного пользователя MySQL , В нем много вещей , например:

  • Профилирование запросов
  • Сердцебиение репликации
  • Управление ведомыми устройствами репликации
  • Контрольная сумма и синхронизация таблиц

Percona недавно превратила MAATKIT в более современный набор инструментов, известный сегодня как Percona Инструментарий . Эти инструменты собрались там, где MAATKIT остановился, расширив сферу деятельности, чтобы серьезный пользователь MySQL включил такие вещи:

  • Проверка ошибок внешнего ключа
  • Изменение схемы сети
  • Планы визуального объяснения
  • и многое другое ...

Возвращаясь к исходному вопросу, инструменты для профилирования запросов

Вот пример такой богатой информации, которая может исходить от использования одного из этих инструментов:

Я помог клиенту реализовать mk-query-digest, чтобы сообщать 20 наихудших запросов каждые 20 минут. У меня появилась идея с этого видео YouTube . Клиент будет перемещать вывод любого плохого запроса в memcached, тем самым снижая частоту возникновения запроса в базе данных.

Вот сценарий, который я сделал для вызова mk-query-digest (только для проверки списка процессов)

#!/bin/sh

RUNFILE=/tmp/QueriesAreBeingDigested.txt
if [ -f ${RUNFILE} ] ; then exit ; fi

MKDQ=/usr/local/sbin/mk-query-digest
RUNTIME=${1}
COPIES_TO_KEEP=${2}
DBVIP=${3}

WHICH=/usr/bin/which
DATE=`${WHICH} date`
ECHO=`${WHICH} echo`
HEAD=`${WHICH} head`
TAIL=`${WHICH} tail`
AWK=`${WHICH} awk`
SED=`${WHICH} sed`
CAT=`${WHICH} cat`
WC=`${WHICH} wc`
RM=`${WHICH} rm | ${TAIL} -1 | ${AWK} '{print $1}'`
LS=`${WHICH} ls | ${TAIL} -1 | ${AWK} '{print $1}'`

HAS_THE_DBVIP=`/sbin/ip addr show | grep "scope global secondary" | grep -c "${DBVIP}"`
if [ ${HAS_THE_DBVIP} -eq 1 ] ; then exit ; fi

DT=`${DATE} +"%Y%m%d_%H%M%S"`
UNIQUETAG=`${ECHO} ${SSH_CLIENT}_${SSH_CONNECTION}_${DT} | ${SED} 's/\./ /g' | ${SED} 's/ //g'`

cd /root/QueryDigest
OUTFILE=QP_${DT}.txt
HOSTADDR=${DBVIP}
${MKDQ} --processlist h=${HOSTADDR},u=queryprofiler,p=queryprofiler --run-time=${RUNTIME} > ${OUTFILE}

#
# Rotate out Old Copies
#

QPFILES=QPFiles.txt
QPFILES2ZAP=QPFiles2Zap.txt
${LS} QP_[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]_[0-9][0-9][0-9][0-9][0-9][0-9].txt > ${QPFILES}

LINECOUNT=`${WC} -l < ${QPFILES}`
if [ ${LINECOUNT} -gt ${COPIES_TO_KEEP} ]
then
        (( DIFF = LINECOUNT - COPIES_TO_KEEP ))
        ${HEAD} -${DIFF} < ${QPFILES} > ${QPFILES2ZAP}
        for QPFILETOZAP in `${CAT} ${QPFILES2ZAP}`
        do
                ${RM} ${QPFILETOZAP}
        done
fi

rm -f ${QPFILES2ZAP}
rm -f ${QPFILES}
rm -f ${RUNFILE}

Вот пользователь, который я сделал для подключения к mysql, используя mk-query-digest

GRANT PROCESS ON *.* TO 'queryprofiler'@'%' IDENTIFIED BY 'queryprofiler';

Вот crontab, который я запускал каждые 20 минут (менее 10 секунд), сохраняя последние 144 копии (это 48 часов профилирования)

*/20 * * * * /root/QueryDigest/ExecQueryDigest.sh 1190s 144 10.1.1.8

Невероятная часть: вывод mk-query-digest

Вот профиль, который запускался 2011-12-28 11:20:00 за 1190 секунд (20 минут меньше 10 секунд)

Последние 22 строки

# Rank Query ID           Response time    Calls   R/Call     Item
# ==== ================== ================ ======= ========== ====
#    1 0x5E994008E9543B29    40.3255 11.2%     101   0.399263 SELECT schedule_occurrence schedule_eventschedule schedule_event schedule_eventtype schedule_event schedule_eventtype schedule_occurrence.start
#    2 0x392F6DA628C7FEBD    33.9181  9.4%      17   1.995184 SELECT mt_entry mt_objecttag
#    3 0x6C6318E56E149036    26.4695  7.3%     102   0.259505 SELECT schedule_occurrence schedule_eventschedule schedule_event schedule_eventtype schedule_event schedule_eventtype schedule_occurrence.start
#    4 0x00F66961DAE6FFB2    25.5472  7.1%      55   0.464495 SELECT mt_entry mt_placement mt_category
#    5 0x99E13015BFF1E75E    22.3618  6.2%     199   0.112371 SELECT mt_entry mt_objecttag
#    6 0x84DD09F0FC444677    22.3516  6.2%      39   0.573118 SELECT mt_entry
#    7 0x440EBDBCEDB88725    21.1817  5.9%      36   0.588380 SELECT mt_entry
#    8 0x8D258C584B858811    17.2402  4.8%      37   0.465951 SELECT mt_entry mt_placement mt_category
#    9 0x4E2CB0F4CAFD1400    16.9768  4.7%      40   0.424419 SELECT mt_entry mt_placement mt_category
#   10 0x377E0D0898266FDD    16.6979  4.6%     150   0.111319 SELECT polls_pollquestion mt_category
#   11 0x3B9686D98BB8E054    16.2089  4.5%      32   0.506529 SELECT mt_entry mt_objecttag mt_tag
#   12 0x97F670B604A85608    15.6158  4.3%      34   0.459287 SELECT mt_entry mt_placement mt_category
#   13 0x3F5557DA231225EB    14.4309  4.0%      36   0.400859 SELECT mt_entry mt_placement mt_category
#   14 0x191D660A10738896    13.1220  3.6%      31   0.423290 SELECT mt_entry mt_placement mt_category
#   15 0xF88F7421DD88036D    12.1261  3.4%      61   0.198788 SELECT mt_entry mt_blog mt_objecttag mt_tag mt_author
#   16 0xA909BF76E7051792    10.3971  2.9%      53   0.196172 SELECT mt_entry mt_objecttag mt_tag
#   17 0x3D42D07A335ED983     9.1424  2.5%      20   0.457121 SELECT mt_entry mt_placement mt_category
#   18 0x59F43B57DD43F2BD     9.0533  2.5%      21   0.431111 SELECT mt_entry mt_placement mt_category
#   19 0x7961BD4C76277EB7     8.5564  2.4%      47   0.182052 INSERT UNION UPDATE UNION mt_session
#   20 0x173EB4903F3B6DAC     8.5394  2.4%      22   0.388153 SELECT mt_entry mt_placement mt_category

Обратите внимание, что это список из 20 наихудших запросов на основе Query Response Time, разделенных на количество раз, когда запрос был вызван.

Глядя на идентификатор запроса №1, который является 0x5E994008E9543B29, мы определяем этот идентификатор запроса в выходном файле и вот отчет для этого конкретного запроса:

# Query 1: 0.09 QPS, 0.03x concurrency, ID 0x5E994008E9543B29 at byte 0 __
# This item is included in the report because it matches --limit.
#              pct   total     min     max     avg     95%  stddev  median
# Count          4     101
# Exec time      7     40s   303ms      1s   399ms   992ms   198ms   293ms
# Lock time      0       0       0       0       0       0       0       0
# Users                  1      mt
# Hosts                101 10.64.95.73:33750 (1), 10.64.95.73:34452 (1), 10.64.95.73:38440 (1)... 97 more
# Databases              1     mt1
# Time range 1325089201 to 1325090385
# bytes          0 273.60k   2.71k   2.71k   2.71k   2.62k       0   2.62k
# id             4 765.11M   7.57M   7.58M   7.58M   7.29M    0.12   7.29M
# Query_time distribution
#   1us
#  10us
# 100us
#   1ms
#  10ms
# 100ms  ################################################################
#    1s  ######
#  10s+
# Tables
#    SHOW TABLE STATUS FROM `mt1` LIKE 'schedule_occurrence'\G
#    SHOW CREATE TABLE `mt1`.`schedule_occurrence`\G
#    SHOW TABLE STATUS FROM `mt1` LIKE 'schedule_eventschedule'\G
#    SHOW CREATE TABLE `mt1`.`schedule_eventschedule`\G
#    SHOW TABLE STATUS FROM `mt1` LIKE 'schedule_event'\G
#    SHOW CREATE TABLE `mt1`.`schedule_event`\G
#    SHOW TABLE STATUS FROM `mt1` LIKE 'schedule_eventtype'\G
#    SHOW CREATE TABLE `mt1`.`schedule_eventtype`\G
#    SHOW TABLE STATUS FROM `schedule_occurrence` LIKE 'start'\G
#    SHOW CREATE TABLE `schedule_occurrence`.`start`\G
# EXPLAIN
SELECT `schedule_occurrence`.`id`, `schedule_occurrence`.`schedule_id`, `schedule_occurrence`.`event_id`, `schedule_occurrence`.`start`, `schedule_occurrence`.`end`, `schedule_occurrence`.`cancelled`, `schedule_occurrence`.`original_start`, `schedule_occurrence`.`original_end`, `schedule_occurrence`.`all_day`, `schedule_occurrence`.`ongoing`, `schedule_occurrence`.`featured`, `schedule_eventschedule`.`id`, `schedule_eventschedule`.`event_id`, `schedule_eventschedule`.`start`, `schedule_eventschedule`.`end`, `schedule_eventschedule`.`all_day`, `schedule_eventschedule`.`ongoing`, `schedule_eventschedule`.`min_date_calculated`, `schedule_eventschedule`.`max_date_calculated`, `schedule_eventschedule`.`rule`, `schedule_eventschedule`.`end_recurring_period`, `schedule_eventschedule`.`textual_description`, `schedule_event`.`id`, `schedule_event`.`title`, `schedule_event`.`slug`, `schedule_event`.`description`, `schedule_event`.`host_id`, `schedule_event`.`cost`, `schedule_event`.`age_restrictions`, `schedule_event`.`more_info`, `schedule_event`.`photo_id`, `schedule_event`.`contact_email`, `schedule_event`.`event_type_id`, `schedule_event`.`featured`, `schedule_event`.`staff_pick`, `schedule_event`.`futuremost`, `schedule_event`.`creator_id`, `schedule_event`.`created_on`, `schedule_event`.`allow_comments`, `schedule_event`.`mt_entry`, `schedule_eventtype`.`id`, `schedule_eventtype`.`parent_id`, `schedule_eventtype`.`name`, `schedule_eventtype`.`slug`, `schedule_eventtype`.`lft`, `schedule_eventtype`.`rght`, `schedule_eventtype`.`tree_id`, `schedule_eventtype`.`level`, T5.`id`, T5.`title`, T5.`slug`, T5.`description`, T5.`host_id`, T5.`cost`, T5.`age_restrictions`, T5.`more_info`, T5.`photo_id`, T5.`contact_email`, T5.`event_type_id`, T5.`featured`, T5.`staff_pick`, T5.`futuremost`, T5.`creator_id`, T5.`created_on`, T5.`allow_comments`, T5.`mt_entry`, T6.`id`, T6.`parent_id`, T6.`name`, T6.`slug`, T6.`lft`, T6.`rght`, T6.`tree_id`, T6.`level` FROM `schedule_occurrence` INNER JOIN `schedule_eventschedule` ON (`schedule_occurrence`.`schedule_id` = `schedule_eventschedule`.`id`) INNER JOIN `schedule_event` ON (`schedule_eventschedule`.`event_id` = `schedule_event`.`id`) INNER JOIN `schedule_eventtype` ON (`schedule_event`.`event_type_id` = `schedule_eventtype`.`id`) INNER JOIN `schedule_event` T5 ON (`schedule_occurrence`.`event_id` = T5.`id`) INNER JOIN `schedule_eventtype` T6 ON (T5.`event_type_id` = T6.`id`) WHERE (EXTRACT(MONTH FROM `schedule_occurrence`.`start`) = 8 AND EXTRACT(DAY FROM `schedule_occurrence`.`start`) = 6 AND `schedule_occurrence`.`start` BETWEEN '2011-01-01 00:00:00' and '2011-12-31 23:59:59.99') ORDER BY `schedule_occurrence`.`ongoing` ASC, `schedule_occurrence`.`all_day` DESC, `schedule_occurrence`.`start` ASC\G

Хотя гистограмма основана на тексте, она дает точную картину общей производительности запроса, иногда работает более 1 секунды и большую часть времени составляет от 0,01 до 0,1 секунды. Отсюда можно продолжить настройку производительности путем рефакторинга запроса, размещения результатов запроса в memcached, добавления отсутствующих или охватывающих индексов и т. Д.

Заключение

IMHO Если Percona когда-либо размещала инструменты профилировщика в графическом интерфейсе Windows, она легко конкурировала с Microsoft SQL Server Profiler.

Защитники останутся !!!

ответил RolandoMySQLDBA 28 WedEurope/Moscow2011-12-28T21:04:42+04:00Europe/Moscow12bEurope/MoscowWed, 28 Dec 2011 21:04:42 +0400 2011, 21:04:42
7
ответил 4 ThuEurope/Moscow2008-12-04T12:49:47+03:00Europe/Moscow12bEurope/MoscowThu, 04 Dec 2008 12:49:47 +0300 2008, 12:49:47
4

Если вам нужно профилировать одно приложение, а не все базы данных, имеющиеся в MySQL, вы найдете Neor Profile SQL полезно.

ответил Nikl 21 stEurope/Moscowp30Europe/Moscow09bEurope/MoscowFri, 21 Sep 2012 17:15:13 +0400 2012, 17:15:13
3

MySQL Query Profiler в сочетании с Инструменты GUI MySQL , вероятно, примерно так же близко, как вы можете добраться до SQL Инструмент профайлера сервера

ответил 24 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowWed, 24 Sep 2008 05:43:18 +0400 2008, 05:43:18
3

Лучшие из готовых решений, которые я нашел, это использование комбинации медленного журнала запросов (что отстойно по сравнению с Profiler) и просто запуск Wireshark на порту 3306 (который действительно отстой по сравнению с Profiler и не будет работать, если вы шифруете соединения).

Существует также SHOW FULL PROCESSLIST, который похож на уменьшенную комбинацию sys.dm_exec_sessions и sys.dm_exec_requests (с небольшим количеством sys.dm_exec_sql_text).

ответил db2 28 WedEurope/Moscow2011-12-28T17:11:13+04:00Europe/Moscow12bEurope/MoscowWed, 28 Dec 2011 17:11:13 +0400 2011, 17:11:13
2

У нас есть 6 больших серверов с различными версиями MySQL от 4.1.22 до 5.1. Jet profiler хороший инструмент, который позволяет нам наглядно увидеть состояние всех серверов с первого взгляда. Визуальный профилировщик http://tinyurl.com/profiler-png

ответил 18 Jpm1000000pmTue, 18 Jan 2011 19:59:38 +030011 2011, 19:59:38
2

Я бы сказал, что самое близкое к этому: Оптимизатор Трассировка (новая в 5.6).

Другим примером может быть SHOW PROFILES (5.1+) или performance_schema , который содержит анализ уровня инструкций от MySQL 5.6 +.

ответил Morgan Tocker 18 WedEurope/Moscow2013-12-18T08:48:22+04:00Europe/Moscow12bEurope/MoscowWed, 18 Dec 2013 08:48:22 +0400 2013, 08:48:22
1

Смотрите ответ о профилировщике MySql LogMonitor

ответил 12 32008vEurope/Moscow11bEurope/MoscowWed, 12 Nov 2008 20:12:03 +0300 2008, 20:12:03

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132