SQLinfo.ru - Все о MySQL Webew.ru: теория и практика веб-технологий

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 14.11.2007 16:41:20

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2419

MySQL server has gone away после суток сплошных insert'ов

Здравствуйте, 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. Подскажите плиз кто знает, что с этим сделать можно и почему такое возникает.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#2 14.11.2007 16:51:07

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: MySQL server has gone away после суток сплошных insert'ов

Сам сервер при этом живет? Может быть, он перезагружается?
Если да - следите за ним. Возможно, он вылезает из памяти на 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;

Неактивен

 

#3 15.11.2007 11:49:19

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2419

Re: MySQL server has gone away после суток сплошных insert'ов

Уважаемый paulus, спасибо за ответ.

>Cам сервер при этом живет? Может быть, он перезагружается?
Сам сервер при этом живет, не перезагружается...

>2к строк в секунду - это достаточно большой объем информации. Вы уверены, что
>MyISAM - удачное решение?

Будьте добры - предложите более удачное пожалуйста. Engine=Memory? или InnoDB? Просто с InnoDB получается куда медленнее  писать в базу sad.

>Возможно, Вы также получаете ошибку из-за того, что пытаетесь сделать 2000
>записей в секунду на таблице, которая сама по себе занимает ~12G
>(=2*10^8 записей * 60 байт/запись = 12*10^9 байт) и на каждую вставку она
>пытается обновить индекс.

Вы имеете в виду, что нужно, когда количество записей в таблице превышает, допустим, сколько-то миллионов начинать писать в другую таблицу?

>Если Вам действительно нужно такое количество данных, можете разбить таблицу
>на несколько кусков и подменять таблицы, например, раз в час по какому-то
>хитрому алгоритму.

Понятно....


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#4 15.11.2007 13:08:45

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: MySQL server has gone away после суток сплошных insert'ов

Server has gone away означает, что запрос клиент отправил, но соединение было разорвано.
Работающий сервер не убивает соединения просто так, тем более, если он выполняет запросы.
Вы уверены, что он не грузится? Перезагрузка mysqld - достаточное прозрачное для клиентов
дело, его можно поймать в журнале ошибок, например.

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

Если хочется писать в сервер SQL, то лучше избегать индексов на таких таблицах (все равно
Вы не будете их использовать в запросах) и бить их на куски (без индексов, кстати, можно не бить).

Неактивен

 

#5 15.11.2007 13:54:15

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2419

Re: MySQL server has gone away после суток сплошных insert'ов

Сервер абсолютно точно не перезагружался - последняя его перезагрузка происошла 38 дней назад. Насчет файла я с вами согласен, но писать в файл, увы (исходя из ТЗ), нельзя, писать нужно именно в базу. К тому же с некоторой регулярностью все эти данные будут переписываться в другую базу - там уже и индексы будут к ним добавлены на все поля, и тип, видимо станет InnoDB и прочее...

К тому же уже несколько раз подряд именно это возникало - Server Has Gone Away возникал не сразу и не просто так, а когда в таблице шли сотни миллионов записей. Поэтому, видимо, придется писать в другие таблицы (допустим, менять таблицу раз в час). Если можете - прокомментируйте плиз решение, может в чем-то можно лучше сделать. Заранее спасибо.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#6 15.11.2007 14:47:49

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: MySQL server has gone away после суток сплошных insert'ов

Я имею в виду сервер mysqld, а не саму машинку.

Я подозреваю, что все-таки, сервер убивается по памяти в 32-битной системе, пытаясь
отсортировать очень большой индекс и вылезая из 2 гигабайт на процесс.

Сделать лучше - не делать индекс на этой мегатаблице. Ну и бить на кусочки - будет
проще администрировать.

Неактивен

 

#7 15.11.2007 15:29:00

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2419

Re: MySQL server has gone away после суток сплошных insert'ов

Да я тоже имел в виду mysqld, а не машинку :-). Тогда разрешите уточнить  - а как совсем без индекса? Ведь аутоинкремент сделать без primary key вроде невозможно sad, а ключ 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;


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#8 15.11.2007 15:37:57

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: MySQL server has gone away после суток сплошных insert'ов

Нельзя, а зачем он вам вообще? Данные хранятся в порядке добавления строк.
Вы ведь не удаляете оттуда строки.

Неактивен

 

#9 15.11.2007 15:47:29

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2419

Re: MySQL server has gone away после суток сплошных insert'ов

Понял! Вопрос, видимо (надеюсь), исчерпан :-). Спасибо большое, Paulus, всего доброго!


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson