Проблемы с MySQL MyISAM — дублирование записей и крэш больших таблиц

Совершенно внезапно на рабочем проекте стали твориться непонятные вещи:
  • отваливаются две самые большие таблицы — одна на гигабайт и порядка 70 миллионов записей, другая на 500 мегабайт и 700 000 записей. Примерно 100-1000 инсертов в секунду в первую и 2-5 во вторую. Из второй данные активно select'ятся
  • периодически по неизвестным причинам база начинает выдавать ошибку too many connections. Скрипты оптимизированы, один скрипт — один экземпляр соединения (класс БД — «одиночка»)
  • сегодня ни с того ни с сего данные начали дублироваться, один запрос проходил от двух до 13 раз. Причем не один какой-то запрос, а сразу несколько, которые идут друг за другом.
Скрипты проверил, всё в порядке, давно ничего не менялась, проект со средней посещаемостью. Никаких всплесков за сегодня нет.
Сервер выделенный, настройки стандартные, ОС — CentOS. Версия MySQL — 5.0.77

В чем может быть причина? Я с подобным никогда не сталкивался, никак не могу понять, что происходит.
  • Вопрос задан
  • 3934 просмотра
Пригласить эксперта
Ответы на вопрос 5
pentarh
@pentarh
Too many connections — енто я объясню. На myisam нельзя делать так как вы описали. Активные селекты блокируют всю таблицу и инсерты ждут снятия блокировки. Получается, если ваш селект тормознул хотя бы на секунду, то по вашим данным в очереди набилось уже 1000 инсертов. Вот вам и too many connections.
Переключайтесь на иннодб, она помедленнее, но блокировки там на уровне строки и от сбоя она хорошо восстанавливается.
И лучше сделать один extended insert на 1000 строк, чем 1000 инсертов по одной строке. Подумайте над этим.
Ответ написан
Комментировать
@resurection
FaceBook по вашему не серьёзный проект?
Ответ написан
Zorkus
@Zorkus
Замечу для тех, кто люто срет кирпичами выше — 70 миллионов записей в самой большой таблице — это не так уж много. Совсем не много, чтобы заявлять — «Например, если в одной таблице очень много записей (70 млн.), то можно использовать партиции».

7 миллиардов — и десятки терабайт общего размера базы — вот это очень много.
Ответ написан
Комментировать
при большом количестве инсертов ваш выбор innodb
Ответ написан
Комментировать
Wott
@Wott
Надо смотреть блокировки в mysql и iostat и вообще что там может быть с диском связано.
А вообще как-то странно видеть MyISAM для таблиц в которые часто пишут.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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