Сведения о вопросе

Solllo

03:07, 13th August, 2020

Теги

PHP   MySQL   SQL   Базы   данных    

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

Просмотров: 298   Ответов: 5

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

В чем может быть причина? Я с подобным никогда не сталкивался, никак не могу понять, что происходит.



  Сведения об ответе

ASER

01:49, 16th August, 2020

Too many connections — енто я объясню. На myisam нельзя делать так как вы описали. Активные селекты блокируют всю таблицу и инсерты ждут снятия блокировки. Получается, если ваш селект тормознул хотя бы на секунду, то по вашим данным в очереди набилось уже 1000 инсертов. Вот вам и too many connections.
Переключайтесь на иннодб, она помедленнее, но блокировки там на уровне строки и от сбоя она хорошо восстанавливается.
И лучше сделать один extended insert на 1000 строк, чем 1000 инсертов по одной строке. Подумайте над этим.


  Сведения об ответе

DO__IT

06:19, 13th August, 2020

FaceBook по вашему не серьёзный проект?


  Сведения об ответе

VERSUION

18:12, 6th August, 2020

Замечу для тех, кто люто срет кирпичами выше — 70 миллионов записей в самой большой таблице — это не так уж много. Совсем не много, чтобы заявлять — «Например, если в одной таблице очень много записей (70 млн.), то можно использовать партиции».

7 миллиардов — и десятки терабайт общего размера базы — вот это очень много.


  Сведения об ответе

PIRLO

02:37, 19th August, 2020

при большом количестве инсертов ваш выбор innodb


  Сведения об ответе

appple

07:38, 8th August, 2020

Надо смотреть блокировки в mysql и iostat и вообще что там может быть с диском связано.
А вообще как-то странно видеть MyISAM для таблиц в которые часто пишут.


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться