Операции ввода / вывода блокируют транзакции mysql - PullRequest
2 голосов
/ 17 декабря 2010

здесь у нас есть x64 Debian Lenny с MySQL 5.1.47 и несколько баз данных InnoDB. Файлы ibdata и другие файлы находятся в одной файловой системе (ext3). Я заметил, что в некоторых ситуациях в списке процессов MySQL много процессов, которые висят в состоянии «освобождение элементов». Это происходит, когда я делаю следующее на оболочке (file1 и file2 - около 2,5 ГБ)

cat file1 file2 >new_file

или выполните следующую инструкцию SQL

SELECT 'name' AS col UNION SELECT col FROM db_name.table_name INTO OUTFILE ('/var/xxx/yyy')

Когда выполняется одна из этих двух вещей, я вижу, что многие процессы MySQL работают бесконечно с состоянием «освобождения элементов» (я использую innotop). При завершении этого процесса оболочки (или оператора SQL) эти заблокированные транзакции исчезают.

В интернете я нашел несколько подсказок для отключения адаптивного хеш-индекса InnoDB и общего кеша запросов, но это не помогает. Есть ли кто-то, кто имеет такой же опыт?

Привет

Ответы [ 3 ]

2 голосов
/ 17 декабря 2010

Мы обнаружили, что включение планировщика ввода-вывода крайнего срока очень помогает предотвратить голодание нашей БД во время внешней загрузки файловой системы.Попробуйте

 echo deadline > /sys/block/sda/queue/scheduler

и проверьте, не станет ли проблема меньше.(Замените sda на устройство, на котором включена ваша база данных)

1 голос
/ 17 декабря 2010

Просто немного отступив, вы выполнили базовую настройку InnoDB?По умолчанию MySQL может быть довольно ограниченным.Хороший обзор:

http://www.mysqlperformanceblog.com/2007/11/01/innodb-performance-optimization-basics/

0 голосов
/ 20 декабря 2010

Интересное есть:

  • все базы данных на этом сервере хранятся в одном файле InnoDB (one_file_per_table отключена)
  • мы написали небольшой скрипт оболочки, вставляющий 10 строк в секунду в новую таблицу в новую базу данных на этом сервере
  • затем мы скопировали несколько больших файлов через "cat" (как описано выше) параллельно ...
  • и: ничего не произошло, нет замков, нет бесконечных «освобождающих предметов»
  • поэтому мы изменили сценарий оболочки, чтобы вставить строки в новую таблицу в существующей базе данных, что вызывает эту проблему и снова скопировал файлы
  • и: замки вернулись! да?
  • последняя попытка: мы скопировали «ошибочную» базу данных на самом сервере в новую базу данных (с полной структурой и данными) и снова запустили скрипт оболочки
  • и: нет процессов "освобождения предметов"!?

Я не понимаю такого поведения: вставка в старую базу данных приводит к появлению процессов "освобождения элементов", но вставка в новую базу данных (полная копия старой базы данных) - это нормально?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...