|
malformed database schema с неизвестно откуда взятым значением
|
|||
---|---|---|---|
#18+
Добрый день! Есть скрипт, который пишет лог-информацию в БД sqlite. Структура базы: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25.
Периодически при добавлении данных (в steps) получаю ошибку (скрипт на python): Код: plaintext
При том что в инсерте и в БД у меня вообще нет такого числа (это timestamp, который может попасть либо в steps.start, либо в steps.stop, но я проверил вообще всю БД). Проблема возникает действительно эпизодически - в скрипте меняется только время запуска и остановки действия (эти таймстампы), чаще инсерт проходит успешно, но периодически получаю такую ошибку. Плюс при том, что вставляемые временные метки все время меняются, в ошибке всегда одно и то же число. Подскажите, пожалуйста, куда смотреть? И, да, использую WAL, но никаких старых журналов нет на диске. Перед воспроизведением ошибки удалил БД и даже ребутнулся - timestamp в ошибке изменился, но остальные симптому остались прежними. Заранее спасибо за ваши советы! ... |
|||
:
Нравится:
Не нравится:
|
|||
28.04.2015, 09:22 |
|
malformed database schema с неизвестно откуда взятым значением
|
|||
---|---|---|---|
#18+
alozovskoy, Ты ведь используешь везде bind переменные и не формируешь insert как строку? можешь залогировать и показать последний глючный insert это можно сделать с помощью sqlite3_trace ... |
|||
:
Нравится:
Не нравится:
|
|||
28.04.2015, 11:39 |
|
malformed database schema с неизвестно откуда взятым значением
|
|||
---|---|---|---|
#18+
А еще проверь "холодную" базу на целостность через PRAGMA integrity_check; в ней все хорошо? ... |
|||
:
Нравится:
Не нравится:
|
|||
28.04.2015, 11:45 |
|
malformed database schema с неизвестно откуда взятым значением
|
|||
---|---|---|---|
#18+
PPA, Код: plaintext 1. 2.
> Ты ведь используешь везде bind переменные и не формируешь insert как строку? Я так понимаю что сама библиотека этим занимается, использую код такого вида Код: plaintext 1.
> можешь залогировать и показать последний глючный insert Сейчас пытаюсь разобраться как это делается (с БД на "ой, простите"). Выполнение такого-же инсерта (на котором получаю ошибку), собранного "руками", происходит без проблем, но думаю что из-за того что и при работе скрипта я ошибку получаю не постоянно. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.04.2015, 12:22 |
|
malformed database schema с неизвестно откуда взятым значением
|
|||
---|---|---|---|
#18+
Сейчас поменял journal_mode с WAL на DELETE - ошибка поменялась на Код: plaintext
С sqlite вообще можно как-то без сложностей работать с несколькими одновременными изменяющими базу подключаениями? ... |
|||
:
Нравится:
Не нравится:
|
|||
28.04.2015, 12:56 |
|
malformed database schema с неизвестно откуда взятым значением
|
|||
---|---|---|---|
#18+
alozovskoy, А у тебя эти подключения работают в разных процессах на одном хосте или файл базы лежит там-же? я в питоне никогда не работал с sqlite в гугле пишут что у него какие-то грабли при работе в нитках может ты на них и наступил? ... |
|||
:
Нравится:
Не нравится:
|
|||
28.04.2015, 14:10 |
|
malformed database schema с неизвестно откуда взятым значением
|
|||
---|---|---|---|
#18+
PPA, да, подключаюсь из разных процессов, БД лежит рядом. Сейчас немного изменил свой скрипт - раньше у меня в начале работы создавалось соединение к БД, и потом по ходу выполнения скрипта это соединение использовалось; сейчас на каждое действие я открываю соединение, выполняю insert, комичу и закрываю - проблем нет. В принципе это не критично (завернул в функцию), но как-то не очень "красиво" получается. Но нагрузки большой не придвидится, так что пока отсавил так - в таком случае оно хотя бы работает. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.04.2015, 14:14 |
|
malformed database schema с неизвестно откуда взятым значением
|
|||
---|---|---|---|
#18+
alozovskoy, Точно процессов а не ниток? если у тебя много процессов будут звать функцию ты ведь получишь аналогичную проблему? или ты в функции синхронизируешься? ... |
|||
:
Нравится:
Не нравится:
|
|||
28.04.2015, 14:22 |
|
malformed database schema с неизвестно откуда взятым значением
|
|||
---|---|---|---|
#18+
PPA, точно процессов. В функции синхронизации никакой нет - просто открываю базу и добавляю туда строку, коммичу и закрываю, но почему-то при "постоянном" соединении для процесса (скрипта) ошибки есть, а при открытии нового соединения каждый раз - все ОК. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.04.2015, 14:28 |
|
malformed database schema с неизвестно откуда взятым значением
|
|||
---|---|---|---|
#18+
alozovskoy, А почему для лога выбрал эту бд? ты ведь потом эти логи будешь чем-то смотреть и что-то в них искать т.е. будет ~один читатель-админ и много писателей а как будешь делать ротацию - новые файлы бд создаешь? WAL вернул назад? :) ... |
|||
:
Нравится:
Не нравится:
|
|||
28.04.2015, 14:28 |
|
malformed database schema с неизвестно откуда взятым значением
|
|||
---|---|---|---|
#18+
PPA, WAL не стал возвращать, и без него вроде нормально (но вообще верну как только удостоверюсь что "решение" действительно помогло, сейчас "тестирую"). Логика такая - скрипты пишут данные в БД, все это через вебморду показывается пользователям. БД взял в основном из-за простоты выборок, а именно sqlite потому что без сервера работает (у меня "проект" на пару экранов кода, тащить сервер смысла нет). С ротацией пока не придумал, скорее всего буду удалять старые записи раз в день\неделю (смотря какой размер БД будет). ... |
|||
:
Нравится:
Не нравится:
|
|||
28.04.2015, 14:39 |
|
malformed database schema с неизвестно откуда взятым значением
|
|||
---|---|---|---|
#18+
Насколько я понимаю, постоянное соединение должно держаться не процессом, а именно нитью. Т.е. работать с соединением можно только в той нити, в которой соединение было открыто. Если, к примеру, Ваш процесс создаёт соединение в главном потоке, а лог пишет в дочернем - огребёте undefined behavior. Кроме того, обратите внимание на threading mode , который устанавливается как при подключении к БД, так и зависит от опций, с которыми скомпилирована библиотека. Если с БД работают несколько процессов, он должен быть Multi-thread или Serialized. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.04.2015, 16:12 |
|
malformed database schema с неизвестно откуда взятым значением
|
|||
---|---|---|---|
#18+
В FAQ говорится, что могут быть проблемы с запиранием файла . Раз такое дело, можно попробовать сериализовать запись в БД вручную - через глобальный мьютекс, например. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.04.2015, 16:30 |
|
malformed database schema с неизвестно откуда взятым значением
|
|||
---|---|---|---|
#18+
MrCatНасколько я понимаю, постоянное соединение должно держаться не процессом, а именно нитью. Т.е. работать с соединением можно только в той нити, в которой соединение было открыто. Если, к примеру, Ваш процесс создаёт соединение в главном потоке, а лог пишет в дочернем - огребёте undefined behavior. хм. если Serialized разве будет UB? ... |
|||
:
Нравится:
Не нравится:
|
|||
28.04.2015, 16:35 |
|
malformed database schema с неизвестно откуда взятым значением
|
|||
---|---|---|---|
#18+
MrCat, да, я читал про эту особенность, но у меня локальный диск и нормальная ФС, не должно быть проблем. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.04.2015, 16:45 |
|
malformed database schema с неизвестно откуда взятым значением
|
|||
---|---|---|---|
#18+
MrCat, у меня процесс по сути является нитью, то есть у меня однопоточное приложение, просто этих приложений запскаться может несколько одновременно. > обратите внимание на threading mode Посмотрю, спасибо вам! А как-то можно узнать вообще "режимы", с которыми "собрана" БД из самой БД? Я нахожу какие-то функции для C, но ни в python, ни в CLI я не могу получить доступ к этим опциям. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.04.2015, 16:50 |
|
malformed database schema с неизвестно откуда взятым значением
|
|||
---|---|---|---|
#18+
alozovskoyА как-то можно узнать вообще "режимы", с которыми "собрана" БД из самой БД? Я нахожу какие-то функции для C, но ни в python, ни в CLI я не могу получить доступ к этим опциям. Скажи в SQL так PRAGMA compile_options; ... |
|||
:
Нравится:
Не нравится:
|
|||
28.04.2015, 16:57 |
|
malformed database schema с неизвестно откуда взятым значением
|
|||
---|---|---|---|
#18+
хм. если Serialized разве будет UB? Библиотека может не поддерживать сериализацию в принципе. Если при соединении такая библиотека не ругнётся - будут проблемы. Документация говорит, что сериализуется доступ к хэндлам соединения и запроса, но не понятно - используются глобальные мьютексы или локальные. Т.е. сериализация достигается в рамках одного или нескольких процессов? Сказано так: " the SQLite library will itself serialize access to database connections and prepared statements so that the application is free to use the same database connection or the same prepared statement in different threads at the same time.", т.е. речь идёт про одно приложение. А как-то можно узнать вообще "режимы", с которыми "собрана" БД из самой БД? Да, можно ... |
|||
:
Нравится:
Не нравится:
|
|||
28.04.2015, 17:05 |
|
|
start [/forum/topic.php?fid=54&fpage=10&tid=2008681]: |
0ms |
get settings: |
12ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
26ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
49ms |
get tp. blocked users: |
2ms |
others: | 262ms |
total: | 382ms |
0 / 0 |