Задавайте вопросы, мы ответим
Вы не зашли.
Страниц: 1
Здравствуйте, all!
Подскажите пожалуйста, кто знает, по следующему вопросу:
Имеется приложение — типа коллектора траффика, оно ловит с циски пакеты, парсит их содержимое и пихает их в базу mysql. (mysql 5.0.45, приложение написано на VS 6.0, mysql находится на сервере с freebsd, для записи использую mysql API той же версии, что и сам mysql). Скорость запихивания — примерно 2000 записей/в секунду. тип таблицы — myisam, индекс один — primary key autoincrement, в таблице 15 полей по 4 байта. после суток работы — за это время записывается примерно 200 миллионов записей. Так вот — после суток работы mysql API отказывается выполнять mysql_query — говорит, что
MySQL server has gone away. Подскажите плиз кто знает, что с этим сделать можно и почему такое возникает.
Неактивен
Сам сервер при этом живет? Может быть, он перезагружается?
Если да - следите за ним. Возможно, он вылезает из памяти на 32-битной системе.
2к строк в секунду - это достаточно большой объем информации. Вы уверены, что
MyISAM - удачное решение?
Возможно, Вы также получаете ошибку из-за того, что пытаетесь сделать 2000
записей в секунду на таблице, которая сама по себе занимает ~12G
(=2*10^8 записей * 60 байт/запись = 12*10^9 байт) и на каждую вставку она
пытается обновить индекс.
Если Вам действительно нужно такое количество данных, можете разбить таблицу
на несколько кусков и подменять таблицы, например, раз в час по какому-то
хитрому алгоритму. Например, так:
CREATE TABLE t LIKE tablename; RENAME TABLE tablename TO tablename_14, t TO tablename;
Неактивен
Уважаемый paulus, спасибо за ответ.
>Cам сервер при этом живет? Может быть, он перезагружается?
Сам сервер при этом живет, не перезагружается...
>2к строк в секунду - это достаточно большой объем информации. Вы уверены, что
>MyISAM - удачное решение?
Будьте добры - предложите более удачное пожалуйста. Engine=Memory? или InnoDB? Просто с InnoDB получается куда медленнее писать в базу .
>Возможно, Вы также получаете ошибку из-за того, что пытаетесь сделать 2000
>записей в секунду на таблице, которая сама по себе занимает ~12G
>(=2*10^8 записей * 60 байт/запись = 12*10^9 байт) и на каждую вставку она
>пытается обновить индекс.
Вы имеете в виду, что нужно, когда количество записей в таблице превышает, допустим, сколько-то миллионов начинать писать в другую таблицу?
>Если Вам действительно нужно такое количество данных, можете разбить таблицу
>на несколько кусков и подменять таблицы, например, раз в час по какому-то
>хитрому алгоритму.
Понятно....
Неактивен
Server has gone away означает, что запрос клиент отправил, но соединение было разорвано.
Работающий сервер не убивает соединения просто так, тем более, если он выполняет запросы.
Вы уверены, что он не грузится? Перезагрузка mysqld - достаточное прозрачное для клиентов
дело, его можно поймать в журнале ошибок, например.
Более удачное решение - писать в файл. Обработка 12G данных сервером общего назначения
будет работать в любом случае долго, специализированное приложение может добиться большей
производительности над обычным файлом.
Если хочется писать в сервер SQL, то лучше избегать индексов на таких таблицах (все равно
Вы не будете их использовать в запросах) и бить их на куски (без индексов, кстати, можно не бить).
Неактивен
Сервер абсолютно точно не перезагружался - последняя его перезагрузка происошла 38 дней назад. Насчет файла я с вами согласен, но писать в файл, увы (исходя из ТЗ), нельзя, писать нужно именно в базу. К тому же с некоторой регулярностью все эти данные будут переписываться в другую базу - там уже и индексы будут к ним добавлены на все поля, и тип, видимо станет InnoDB и прочее...
К тому же уже несколько раз подряд именно это возникало - Server Has Gone Away возникал не сразу и не просто так, а когда в таблице шли сотни миллионов записей. Поэтому, видимо, придется писать в другие таблицы (допустим, менять таблицу раз в час). Если можете - прокомментируйте плиз решение, может в чем-то можно лучше сделать. Заранее спасибо.
Неактивен
Я имею в виду сервер mysqld, а не саму машинку.
Я подозреваю, что все-таки, сервер убивается по памяти в 32-битной системе, пытаясь
отсортировать очень большой индекс и вылезая из 2 гигабайт на процесс.
Сделать лучше - не делать индекс на этой мегатаблице. Ну и бить на кусочки - будет
проще администрировать.
Неактивен
Да я тоже имел в виду mysqld, а не машинку :-). Тогда разрешите уточнить - а как совсем без индекса? Ведь аутоинкремент сделать без primary key вроде невозможно , а ключ primary key - автоматически создает на себя индекс. Я привожу ниже создание таблицы - подскажите пожалуйста, можно ли сделать autoincrement (причем именно autoincrement, а не unique), но без primary key? Или в данном случае придется отказаться от autoincrement?
create table flowtest.nfpkt
(
incr integer primary key auto_increment,
srcaddr integer unsigned,
dstaddr integer unsigned,
nexthop integer unsigned,
input smallint unsigned,
output smallint unsigned,
dpkts integer unsigned,
dOctets integer unsigned,
tfirst integer unsigned,
tlast integer unsigned,
srcport smallint unsigned,
dstport smallint unsigned,
pad1 tinyint unsigned,
tcp_flags tinyint unsigned,
prot tinyint unsigned,
tos tinyint unsigned,
pointx smallint unsigned,
pointy smallint unsigned,
dbindex integer unsigned,
currenttime timestamp
) ENGINE = MyISAM
CHARACTER SET cp1250 COLLATE cp1250_general_ci;
Неактивен
Нельзя, а зачем он вам вообще? Данные хранятся в порядке добавления строк.
Вы ведь не удаляете оттуда строки.
Неактивен
Понял! Вопрос, видимо (надеюсь), исчерпан :-). Спасибо большое, Paulus, всего доброго!
Неактивен
Страниц: 1