Гость
Форумы / SQLite [игнор отключен] [закрыт для гостей] / malformed database schema с неизвестно откуда взятым значением / 18 сообщений из 18, страница 1 из 1
28.04.2015, 09:22
    #38946825
alozovskoy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
malformed database schema с неизвестно откуда взятым значением
Добрый день!

Есть скрипт, который пишет лог-информацию в БД 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.
CREATE TABLE "tasks" (
	`id`	INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
	`rc`	INTEGER,
	`start`	INTEGER,
	`stop`	INTEGER,
	`logname`	TEXT,
	`ppid`	INTEGER,
	`maindata`	TEXT,
	`otherdata`	TEXT,
	`vars`	TEXT,
	`type`	INTEGER,
	`owner`	TEXT,
	`statuscode`	INTEGER
);
CREATE TABLE "steps" (
	`id`	INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
	`taskid`	INTEGER NOT NULL,
	`stepNumber`	INTEGER NOT NULL,
	`stepName`	INTEGER,
	`start`	INTEGER,
	`stop`	INTEGER,
	`hostname`	TEXT,
	`data`	INTEGER,
	`status`	INTEGER
);



Периодически при добавлении данных (в steps) получаю ошибку (скрипт на python):

Код: plaintext
DatabaseError: malformed database schema (1) - near "1430198728": syntax error

При том что в инсерте и в БД у меня вообще нет такого числа (это timestamp, который может попасть либо в steps.start, либо в steps.stop, но я проверил вообще всю БД). Проблема возникает действительно эпизодически - в скрипте меняется только время запуска и остановки действия (эти таймстампы), чаще инсерт проходит успешно, но периодически получаю такую ошибку. Плюс при том, что вставляемые временные метки все время меняются, в ошибке всегда одно и то же число.

Подскажите, пожалуйста, куда смотреть?

И, да, использую WAL, но никаких старых журналов нет на диске. Перед воспроизведением ошибки удалил БД и даже ребутнулся - timestamp в ошибке изменился, но остальные симптому остались прежними.

Заранее спасибо за ваши советы!
...
Рейтинг: 0 / 0
28.04.2015, 11:39
    #38946990
PPA
PPA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
malformed database schema с неизвестно откуда взятым значением
alozovskoy,

Ты ведь используешь везде bind переменные и не формируешь insert как строку?
можешь залогировать и показать последний глючный insert
это можно сделать с помощью sqlite3_trace
...
Рейтинг: 0 / 0
28.04.2015, 11:45
    #38947000
PPA
PPA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
malformed database schema с неизвестно откуда взятым значением
А еще проверь "холодную" базу на целостность через PRAGMA integrity_check;
в ней все хорошо?
...
Рейтинг: 0 / 0
28.04.2015, 12:22
    #38947072
alozovskoy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
malformed database schema с неизвестно откуда взятым значением
PPA,

Код: plaintext
1.
2.
sqlite> PRAGMA integrity_check;
ok

> Ты ведь используешь везде bind переменные и не формируешь insert как строку?

Я так понимаю что сама библиотека этим занимается, использую код такого вида

Код: plaintext
1.
cursor.execute("INSERT INTO table VALUES (?, ?, ?)", (var1, var2, var3))

> можешь залогировать и показать последний глючный insert

Сейчас пытаюсь разобраться как это делается (с БД на "ой, простите"). Выполнение такого-же инсерта (на котором получаю ошибку), собранного "руками", происходит без проблем, но думаю что из-за того что и при работе скрипта я ошибку получаю не постоянно.
...
Рейтинг: 0 / 0
28.04.2015, 12:56
    #38947164
alozovskoy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
malformed database schema с неизвестно откуда взятым значением
Сейчас поменял journal_mode с WAL на DELETE - ошибка поменялась на

Код: plaintext
database disk image is malformed

С sqlite вообще можно как-то без сложностей работать с несколькими одновременными изменяющими базу подключаениями?
...
Рейтинг: 0 / 0
28.04.2015, 14:10
    #38947288
PPA
PPA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
malformed database schema с неизвестно откуда взятым значением
alozovskoy,

А у тебя эти подключения работают в разных процессах на одном хосте
или файл базы лежит там-же?
я в питоне никогда не работал с sqlite
в гугле пишут что у него какие-то грабли при работе в нитках
может ты на них и наступил?
...
Рейтинг: 0 / 0
28.04.2015, 14:14
    #38947296
alozovskoy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
malformed database schema с неизвестно откуда взятым значением
PPA, да, подключаюсь из разных процессов, БД лежит рядом.

Сейчас немного изменил свой скрипт - раньше у меня в начале работы создавалось соединение к БД, и потом по ходу выполнения скрипта это соединение использовалось; сейчас на каждое действие я открываю соединение, выполняю insert, комичу и закрываю - проблем нет. В принципе это не критично (завернул в функцию), но как-то не очень "красиво" получается. Но нагрузки большой не придвидится, так что пока отсавил так - в таком случае оно хотя бы работает.
...
Рейтинг: 0 / 0
28.04.2015, 14:22
    #38947314
PPA
PPA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
malformed database schema с неизвестно откуда взятым значением
alozovskoy,

Точно процессов а не ниток?
если у тебя много процессов будут звать функцию ты ведь получишь аналогичную проблему?
или ты в функции синхронизируешься?
...
Рейтинг: 0 / 0
28.04.2015, 14:28
    #38947324
alozovskoy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
malformed database schema с неизвестно откуда взятым значением
PPA, точно процессов. В функции синхронизации никакой нет - просто открываю базу и добавляю туда строку, коммичу и закрываю, но почему-то при "постоянном" соединении для процесса (скрипта) ошибки есть, а при открытии нового соединения каждый раз - все ОК.
...
Рейтинг: 0 / 0
28.04.2015, 14:28
    #38947326
PPA
PPA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
malformed database schema с неизвестно откуда взятым значением
alozovskoy,

А почему для лога выбрал эту бд?
ты ведь потом эти логи будешь чем-то смотреть и что-то в них искать
т.е. будет ~один читатель-админ и много писателей
а как будешь делать ротацию - новые файлы бд создаешь?
WAL вернул назад? :)
...
Рейтинг: 0 / 0
28.04.2015, 14:39
    #38947348
alozovskoy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
malformed database schema с неизвестно откуда взятым значением
PPA, WAL не стал возвращать, и без него вроде нормально (но вообще верну как только удостоверюсь что "решение" действительно помогло, сейчас "тестирую").

Логика такая - скрипты пишут данные в БД, все это через вебморду показывается пользователям. БД взял в основном из-за простоты выборок, а именно sqlite потому что без сервера работает (у меня "проект" на пару экранов кода, тащить сервер смысла нет).

С ротацией пока не придумал, скорее всего буду удалять старые записи раз в день\неделю (смотря какой размер БД будет).
...
Рейтинг: 0 / 0
28.04.2015, 16:12
    #38947489
MrCat
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
malformed database schema с неизвестно откуда взятым значением
Насколько я понимаю, постоянное соединение должно держаться не процессом, а именно нитью. Т.е. работать с соединением можно только в той нити, в которой соединение было открыто. Если, к примеру, Ваш процесс создаёт соединение в главном потоке, а лог пишет в дочернем - огребёте undefined behavior.

Кроме того, обратите внимание на threading mode , который устанавливается как при подключении к БД, так и зависит от опций, с которыми скомпилирована библиотека. Если с БД работают несколько процессов, он должен быть Multi-thread или Serialized.
...
Рейтинг: 0 / 0
28.04.2015, 16:30
    #38947524
MrCat
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
malformed database schema с неизвестно откуда взятым значением
В FAQ говорится, что могут быть проблемы с запиранием файла . Раз такое дело, можно попробовать сериализовать запись в БД вручную - через глобальный мьютекс, например.
...
Рейтинг: 0 / 0
28.04.2015, 16:35
    #38947531
PPA
PPA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
malformed database schema с неизвестно откуда взятым значением
MrCatНасколько я понимаю, постоянное соединение должно держаться не процессом, а именно нитью. Т.е. работать с соединением можно только в той нити, в которой соединение было открыто. Если, к примеру, Ваш процесс создаёт соединение в главном потоке, а лог пишет в дочернем - огребёте undefined behavior.


хм. если Serialized разве будет UB?
...
Рейтинг: 0 / 0
28.04.2015, 16:45
    #38947561
alozovskoy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
malformed database schema с неизвестно откуда взятым значением
MrCat, да, я читал про эту особенность, но у меня локальный диск и нормальная ФС, не должно быть проблем.
...
Рейтинг: 0 / 0
28.04.2015, 16:50
    #38947570
alozovskoy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
malformed database schema с неизвестно откуда взятым значением
MrCat, у меня процесс по сути является нитью, то есть у меня однопоточное приложение, просто этих приложений запскаться может несколько одновременно.

> обратите внимание на threading mode

Посмотрю, спасибо вам!

А как-то можно узнать вообще "режимы", с которыми "собрана" БД из самой БД? Я нахожу какие-то функции для C, но ни в python, ни в CLI я не могу получить доступ к этим опциям.
...
Рейтинг: 0 / 0
28.04.2015, 16:57
    #38947589
PPA
PPA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
malformed database schema с неизвестно откуда взятым значением
alozovskoyА как-то можно узнать вообще "режимы", с которыми "собрана" БД из самой БД? Я нахожу какие-то функции для C, но ни в python, ни в CLI я не могу получить доступ к этим опциям.

Скажи в SQL так PRAGMA compile_options;
...
Рейтинг: 0 / 0
28.04.2015, 17:05
    #38947603
MrCat
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
malformed database schema с неизвестно откуда взятым значением
хм. если 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.", т.е. речь идёт про одно приложение.

А как-то можно узнать вообще "режимы", с которыми "собрана" БД из самой БД?
Да, можно
...
Рейтинг: 0 / 0
Форумы / SQLite [игнор отключен] [закрыт для гостей] / malformed database schema с неизвестно откуда взятым значением / 18 сообщений из 18, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]