Форум программистов, компьютерный форум, киберфорум
PHP: базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/18: Рейтинг темы: голосов - 18, средняя оценка - 4.78
 Аватар для olimpikys
19 / 19 / 1
Регистрация: 03.04.2012
Сообщений: 182

Многопоточная запись в бд mysql

18.11.2015, 15:48. Показов 3666. Ответов 7

Студворк — интернет-сервис помощи студентам
Добрый день. Написал скрипты на php которые считывают информацию с коммутаторов, делают некие манипуляции с данными, и конечный результат записывают в бд mysql. Проблем, когда работает 1 скрипт, нету. Все данные успешно записываются. Но у меня более 500 таких скриптов, которые должны работать одновременно, таким образом, в бд может быть несколько сотен запросов одновременно. И вот когда я все скрипты запускаю одновременно, начинается беда. Некоторые данные просто не записываются. Не знаю почему. На каждый скрипт, при каждом инсерте стоит проверка, добавились данные или нет. Вот лог одного из скриптов.
Bash
1
2
3
4
5
6
7
8
9
10
11
12
Данные успешно добавлены!
Данные успешно добавлены!
Ошибка при добавлении данных!
Данные успешно добавлены!
Ошибка при добавлении данных!
Данные успешно добавлены!
Ошибка при добавлении данных!
Данные успешно добавлены!
Ошибка при добавлении данных!
Данные успешно добавлены!
Ошибка при добавлении данных!
Данные успешно добавлены!
Все данные пишутся в одну таблицу

Структура таблицы :
MySQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
mysql> SHOW CREATE TABLE totallog;
+----------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table    | Create Table                                                                                                                                                                                                                                                            |
+----------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| totallog | CREATE TABLE `totallog` (
  `idrow` int(11) NOT NULL AUTO_INCREMENT,
  `id` int(11) NOT NULL,
  `ip` varchar(255) NOT NULL,
  `log` longtext,
  PRIMARY KEY (`idrow`),
  UNIQUE KEY `UK_totallog` (`id`,`ip`)
) ENGINE=InnoDB AUTO_INCREMENT=42894 DEFAULT CHARSET=utf8 |
+----------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
 
mysql>
Одна из команд для записи данных в таблицу:
PHP
1
2
3
4
5
$message1 = "<span class=grey>$today</span> Проверка <span class=blue>$port</span> порта.";
$querymess1 = "INSERT INTO totallog (`id`, `ip`, `log`) SELECT MAX(id)+1,'{$ip}', '{$message1}' from totallog WHERE ip = '{$ip}'";
if(!mysql_query($querymess1)){
echo "Ошибка при добавлении данных! \n";}
else{echo "Данные успешно добавлены! \n";}
Таких команд в одном скрипте десяток. при выполнении одного скрипта в бд записывается 10 строк.
запустил все скрипты на выполнение каждые 5 минут, в бд уже 44 000 строк, но не все строки записываются. Из одного такого скрипта половина может записаться а вторая нет.
Может нужно что-то в мускуле сделать, что бы все потоки писались?
Спасибо за помощь.
P.S новичек в php и mysql.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
18.11.2015, 15:48
Ответы с готовыми решениями:

Многопоточная запись в файл
N1 потоков осуществляет запись в файл. Необходимо сделать N2 записей в файле (с этим возникла сложность). N2 может быть как больше, так и...

Многопоточная запись в TRichEdit
Доброго времени суток! Появилась проблема. Есть 2 потока и функция для записи текста в компонент TRichEdit. Все это работает в DLL. При...

Многопоточная запись в файл
Вечер добрый, форумчане! Есть два потока, с разной периодичностью записывающий данные в один файл. Синхронизация осуществляется через...

7
 Аватар для Laroux
172 / 167 / 75
Регистрация: 21.11.2014
Сообщений: 1,490
18.11.2015, 16:04
Попробуйте конструкцию, которая Вам покажет, что за ошибки, в не просто констатирует факт.. типа
PHP
1
2
3
mysql_query($querymess1)
        or trigger_error(mysql_errno() . ' ' . 
            mysql_error() . ' query: ' . $querymess1);
а успешный запрос вовсе необязательно "озвучивать"
1
 Аватар для olimpikys
19 / 19 / 1
Регистрация: 03.04.2012
Сообщений: 182
18.11.2015, 17:12  [ТС]
PHP
1
2
3
PHP Notice:  1213 Deadlock found when trying to get lock; try restarting transaction query: INSERT INTO totallog (`id`, `ip`, `log`) SELECT MAX(id)+1,'10.41.251.143', '<span class=grey>18 Wed 17:06:36</span> Проверка<span class=blue>e2</span>.' from totallog WHERE ip = '10.41.251.143' in ../sverka.php on line 303
 
PHP Notice:  1213 Deadlock found when trying to get lock; try restarting transaction query: INSERT INTO totallog (`id`, `ip`, `log`) SELECT MAX(id)+1,'10.41.251.143', '<span class=grey>18 Wed 17:06:36</span> Все ок на порту <span class=blue>e4</span>.' from totallog WHERE ip = '10.41.251.143' in ../sverka.php on line 68
Как побороть эти деадлоки?
0
 Аватар для Laroux
172 / 167 / 75
Регистрация: 21.11.2014
Сообщений: 1,490
18.11.2015, 17:21
попробовал погуглить.. говорят о двух моментах вроде:
1) типы блокировок;
2) режим работы БД. Я бы сначала этот вариант попробовал: посмотрел, в каком режиме работает БД и переключил ее на InnoDB, если это не так
1
 Аватар для olimpikys
19 / 19 / 1
Регистрация: 03.04.2012
Сообщений: 182
18.11.2015, 17:28  [ТС]
Спасибо, но если я не ошибся то таблица работает в режиме InnoDB.
Цитата Сообщение от olimpikys Посмотреть сообщение
) ENGINE=InnoDB AUTO_INCREMENT=42894 DEFAULT CHARSET=utf8 |
0
 Аватар для Laroux
172 / 167 / 75
Регистрация: 21.11.2014
Сообщений: 1,490
18.11.2015, 17:39
может поможет

чо-то ссылку не пропускает. Вот что нашел
Проблема решена отчасти обработкой дедлоков в приложении, работающим с БД (оно пытается повторить последний запрос и продолжить работу в транзакции), и в наибольшей степени — отказом от UNIQUE KEY `UK_country_date` (`country_id`,`date`)
в пользу PRIMARY KEY (`country_id`,`date`).
Добавлено через 7 минут
И еще, как мне кажется, надо бы проверить наполнение таблиц.. по сколько там у Вас записей уже? Всему же есть предел
1
 Аватар для olimpikys
19 / 19 / 1
Регистрация: 03.04.2012
Сообщений: 182
19.11.2015, 14:49  [ТС]
за 10 минут таблица наполняется 50 000 строками, при этом это с дедлоками (т.е не все строки записываются). Как вариант можно на каждый скрипт создать отдельную таблицу, тогда скрипты будут все данные успешно записывать, каждый в свою таблицу.
И еще такой вопрос. У меня сейчас 800 главных скриптов, в каждом 2 дочерних. Когда запускаю все, система очень сильно чихает. Процы в 100 (2 штуки), оперативка на месте, не куда не уходит (4 гига). Можно как-то сделать что бы скрипты использовали оперативку, а не грузили процы?
0
 Аватар для Laroux
172 / 167 / 75
Регистрация: 21.11.2014
Сообщений: 1,490
20.11.2015, 09:37
Блин.. надо курить мануал по высоконагруженным системам + может подумать о том, чтобы как-то всю Вашу кухню оптимизировать
Я вот слабо верю в то, что Вы каким-то образом будете действительно как-то юзать такие дикие объемы данных. Даже в статистических целях.. может, конечно, я и не прав, но все же
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
20.11.2015, 09:37
Помогаю со студенческими работами здесь

Многопоточная работа с MySql. Слишко много соединений
Добрый день! В приложении, которое работает с базой данных MySql имеется функционал по считыванию данных из базы в отдельных потоках. Для...

Не работает многопоточная запись в файл.
Подскажите пожалуйста, после компиляции и запуска программы ни при каких условиях не выводится сообщение &quot;THIS IS CHILD!! file...

Многопоточная запись byte[] в файл
Добрый день, столкнулся с проблемой, массив байт имеет очень большой размер и пишется в файл в данном формате: for(int i = 0;...

Многопоточная запись в базу данных access
друзья столкнулся с такой ситуацией пишу в потоках данные в таблицу через adoquery. В итоге данные в таблице перемешаны, есть ли способ...

Запись в MySQL
Добрый день, народ! У меня вот такая проблема, вручную все работает, но при использовании крона сервис КронДжоб(http://cronjob.ru/),...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru