LINUX.ORG.RU

mysql: 1500 раз INSERT и segfault!

 ,


0

2

Делаю mysql_query() в цикле, надо вставить несколько тысяч строк. Где-то после 1500 запроса - падение. Запрос простейший - INSERT в таблицу из Id и Int. Закомментировал mysql_query() - все норм. Если делать 1, 10, 100 запросов - тоже норм. Если делать ничего не значащие запросы типа SET CHARSET … - работает. То есть падает именно когда много раз вызовешь mysql_query(INSERT…).

dmesg:

segfault at f365be85 ip 00000000f71a592e sp 00000000f63abd7c error 4 in libc-2.23.so[f712f000+1b0000]

libmysqlclient18. Все вызовы защищены мьютексами, да и работает пока только один поток. Это баг в либе, или что тут не так?

Собери с asan и посмотри.

xpahos ★★★★★
()
Ответ на: комментарий от WitcherGeralt

Ну хз, буквально вчера делал — надо было инсертить в цикле чтобы получить ласт инсерт айди сразу обратно и применить его в другом инсерте и всё это на каждую итерацию (хрен с ним, не каждую для всего массива, а каждую для тех элементов, которых ещё нет в бд, но их дохера). Правда это всё у меня в транзакцию обёрнуто и мускуль сам разгребает это после мега-коммита.

deep-purple ★★★★★
()
Ответ на: комментарий от WitcherGeralt

Обижаешь: https://www.php.net/manual/ru/function.mysql-query.php

Это конечно тот ещё зашквар — юзать старый пых ради старого мыскль-кверя, но, чего в жизни не бывает?

А, дочитал. Походу да — чота конпелируемое.

deep-purple ★★★★★
()
Последнее исправление: deep-purple (всего исправлений: 1)

google: libmysqlclient18 insert segfault

Дохрена чего пишут. Может и в либе беда.

Ну так правильно говорят — собери с отладкой. Под валгриндом запусти.

deep-purple ★★★★★
()

где-то течет, потом не может выделить память и сегфолтится.

invy ★★★★★
()
Последнее исправление: invy (всего исправлений: 1)
Ответ на: комментарий от deep-purple

получить ласт инсерт айди сразу обратно и применить его в другом инсерте

И почему нельзя вставить балком, получить последний id а остальные вычислить (они будут последовательные)? Или как вариант, bulk insert с последующими insert select чтобы подтянуть данные из вставленного.

no-such-file ★★★★★
()
Ответ на: комментарий от WitcherGeralt

В базу сохраняется лог от удаленного устройства. Мне приходит текст, я его разбираю по строкам. Может прийти 100 строк, а может 100 тыс., если устройство давно не выходило на связь. Поэтому с bulk insert не оч удобно, надо выделять память под запрос (возможно, много), а размер еще надо посчитать, исходя из кол-ва строк.

a400k4a
() автор топика
Ответ на: комментарий от a400k4a

В общем, транзакции спасли, в отладку пока не полезу.

a400k4a
() автор топика
Ответ на: комментарий от a400k4a

Так вставляй по 100 за раз хотя бы, не обязательно всё сразу.

WitcherGeralt ★★
()
Ответ на: комментарий от no-such-file

потому что в цикле есть те которые надо апдейт + инсерт для них - так уже не по порядку, можно конечно разделить на те которые апдейт и те которые инсерт

deep-purple ★★★★★
()
Ответ на: комментарий от WitcherGeralt

Сишечка же почти наверняка, а если не она, то плюсы.

Типичная сижка, лол. Утечки памяти, UB, сегфолты, memory leaks, неопределенное поведение – все, как любят лоровские ретрограды с Керниганом и Ритчи наперевес.

@a400k4a, мой тебе совет – перепиши ты все это дело на Расте, заодно устранишь ворох уязвимостей и логических ошибок в коде. Думаю, за недельку-другую управишься. Оно того стоит ОДНОЗНАЧНО.

Разорванный Флакон

anonymous
()
Ответ на: комментарий от a400k4a

Я понимаю, что у меня опыт питона с батарейками...
Но в такой ситуации легче (и лучше) написать библиотеку, в которой таки делается csv хоть в памяти, хоть во временном файле, а потом bulk insert. И, как я гуглил, так все делают, когда не г..окодят.

Shadow ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.