The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"Раздел полезных советов: Отладка долго выполняющихся транзак..."
Вариант для распечатки  
Пред. тема | След. тема 
Форум Разговоры, обсуждение новостей
Изначальное сообщение [ Отслеживать ]

"Раздел полезных советов: Отладка долго выполняющихся транзак..."  +/
Сообщение от auto_tips (??) on 03-Апр-11, 13:35 
Включение лога долго выполняющихся запросов в MySQL (настройка log-slow-queries) не спасает при необходимости выявления транзакций, находящихся длительное время в незакрытом состоянии. Транзакции, внутри которых были изменены данные, но которые остаются висеть без коммита, достаточно трудно выявить и сопоставить с источником (в списке активных запросов по "SHOW PROCESSLIST" они не видны), в то время как они могут привести к разнообразным проблемам с блокировками и неудачному завершению других операций после истечения таймаута.

Для отладки проблемы обычно определяют какая из транзакция блокирует остальные. Затем, определяется TCP-порт для проблемного соединения, запускается сниффер и используется утилита mk-query-digest для создания лога выполняемых запросов.

В MySQL 5.1, при использовании InnoDB plugin, блокирующую транзакцию выявить значительно проще - поддерживаются специальные INFORMATION_SCHEMA таблицы, запросив которые можно определить идентификатор нити, обрабатывающей висящую транзакцию, после чего найти этот идентификатор в выводе "SHOW PROCESSLIST" и увидеть имя хоста и номер порта инициатора проблемы.

В более ранних ветках MySQL и во встроенном движке  InnoDB (не InnoDB plugin) найти проблемное сетевое соединение не так просто, можно лишь субъективно оценить вывод "SHOW INNODB STATUS", выбрав старейшую транзакцию, находящуюся в статусе ожидания или блокировки. Иногда таким образом удается угадать проблемную транзакцию, а иногда - нет.

Чтобы автоматизировать выявление проблемных транзакций написан небольшой скрипт, который запускается каждые 30 секунд, смотрит статус и находит проблемные позиции в списке. Для проблемных транзакций выявляется номер порта, запускается сниффер и сохраняется лог.

   #!/bin/bash

   # Begin by deleting things more than 7 days old
   find /root/tcpdumps/ -type f -mtime +7 -exec rm -f '{}' \;

   # Bail out if the disk is more than this %full.
   PCT_THRESHOLD=95
   # Bail out if the disk has less than this many MB free.
   MB_THRESHOLD=100
   # Make sure the disk isn't getting too full.
   avail=$(df -m -P /root/tcpdumps/ | awk '/^\//{print $4}');
   full=$(df -m -P /root/tcpdumps/ | awk '/^\//{print $5}' | sed -e 's/%//g');
   if [ "${avail}" -le "${MB_THRESHOLD}" -o "${full}" -ge "${PCT_THRESHOLD}" ]; then
      echo "Exiting, not enough free space (${full}%, ${avail}MB free)">&2
      exit 1
   fi

   host=$(mysql -ss -e 'SELECT p.HOST FROM information_schema.innodb_lock_waits w INNER JOIN
      information_schema.innodb_trx b ON b.trx_id = w.blocking_trx_id INNER JOIN information_schema.processlist p
      on b.trx_mysql_thread_id = p.ID LIMIT 1')

   if [ "${host}" ]; then
      echo "Host ${host} is blocking"
      port=$(echo ${host} | cut -d: -f2)
      tcpdump -i eth0 -s 65535 -x -nn -q -tttt port 3306 and port ${port} > /root/tcpdumps/`date +%s`.tcpdump &
      mysql -e 'show innodb status\Gshow full processlist' > /root/tcpdumps/`date +%s`.innodbstatus
      pid=$!
      sleep 30
      kill ${pid}
   fi


Посмотрев лог ".innodbstatus" и убедившись, что это не ложное срабатывание, проанализировать активность связанного с незакрываемой транзакцией соединения можно выполнив команду:

  mk-query-digest --type=tcpdump --no-report --print файл.tcpdump

В  mk-query-digest также удобно использовать опцию --timeline, отображающую последовательность запросов в наглядном виде.


URL: http://www.mysqlperformanceblog.com/2011/03/08/how-to-debug-.../
Обсуждается: http://www.opennet.dev/tips/info/2557.shtml

Ответить | Правка | Cообщить модератору

Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "Отладка долго выполняющихся транзакций в MySQL"  +/
Сообщение от ibat email(??) on 03-Апр-11, 13:35 
спасибо. нашел новое, для себя, решение.
Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

2. "Отладка долго выполняющихся транзакций в MySQL"  +/
Сообщение от тигар (ok) on 04-Апр-11, 10:35 
не мешало бы указать что  mk-query-digest это кусок maatkit`a
Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

3. "Отладка долго выполняющихся транзакций в MySQL"  +/
Сообщение от userd (ok) on 14-Апр-11, 22:04 
Для обнаружения "зависших" транзакций можно использовать innotop ( http://code.google.com/p/innotop/ )

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру