Журнал регистрации 1С на SQLite - из-за чего возникают сбои? #759191


#0 by romix
Периодически журнал регистрации 1С 8.3 портится (неизвестно из-за чего), пишет сообщение, дескать, malformed, и всё. Перенос или удаление файлов журнала регистрации решает проблему, но ценой обнуления журнала. Читаю - вроде все в этой СУБД по теории - однако сбои-то налицо (я очень надеюсь, что сбоит не у всех). Есть умные настройки SQLite с выбором между скоростью и надежностью: интересно, каковы они в 1С.
#0 by romix
Периодически журнал регистрации 1С 8.3 портится (неизвестно из-за чего), пишет сообщение, дескать, malformed, и всё. Перенос или удаление файлов журнала регистрации решает проблему, но ценой обнуления журнала. Читаю - вроде все в этой СУБД по теории - однако сбои-то налицо (я очень надеюсь, что сбоит не у всех). Есть умные настройки SQLite с выбором между скоростью и надежностью: интересно, каковы они в 1С.
#1 by ЧеловекДуши
У 1С, как всегда. Рассчитано для ларька. :)
#2 by Провинциальный 1сник
Блин. Ну когда же 1с сделает хранение ЖР в основной базе, а не отдельно от неё? Это же напрашивается просто!
#3 by Провинциальный 1сник
+ для sql-версии, конечно же. В файловой пусть остается как есть.
#5 by Strogg
Трое суток журнал восстанавливал прошлый раз после сбоя. Слетел при обновлении платформы. Что-то они там недоперемудрили.
#6 by quit
Сделай свой журнал через регистры сведений
#8 by zak555
И не раз
#9 by nick_p-k
Вчера восстанавливал по инструкции, указанной в .
#10 by nick_p-k
Пардон
#11 by Sиlьver
тоже не раз сталкивался
#12 by romix
В backbas.dll в составе 1С:Предприятие 8.3 (8.3.6.2299) стоят такие прагмы: В sqlite.dll есть подстрока PRAGMA vacuum_db.synchronous=OFF
#13 by romix
Думаю надо заменить     PRAGMA journal_mode = OFF на The WAL journaling mode uses a write-ahead log instead of a rollback journal to implement transactions. The OFF journaling mode disables the rollback journal completely. No rollback journal is ever created and hence there is never a rollback journal to delete. The OFF journaling mode disables the atomic commit and rollback capabilities of SQLite.
#14 by zak555
где заменить ?
#15 by romix
Внутри DLL backbas.dll - хотя наверное правильнее 1С попросить, это только моя гипотеза. Или в настройку это вынести...
#16 by romix
Если я правильно понимаю, WAL применяется в MS-SQL и в других базах данных, чтобы при выключении питания и других сбоях можно было откатить неудачную транзакцию.
#17 by zak555
написал на v8@1c.ru ?
#18 by Гёдза
пока 1с НЕ РЕКОМЕНДУЕТ новый формат )))
#19 by zak555
где про это указано ?
#20 by Гёдза
на партнерском форуме было
#21 by Гёдза
на курсах по эксперту тоже самое говорят
#22 by Гёдза
Для высоконагруженных решений конечно же
#23 by Гёдза
#24 by Гёдза
в 8.3.7 может быть починили. МОЖЕТ БЫТЬ
#25 by Провинциальный 1сник
Для новых ИБ он ставится по умолчанию, и вернуть старый невозможно.
#26 by zak555
возможно
#27 by orefkov
Нет ничего лучше для записи логов, чем обычный текстовый файл.
#28 by Гёдза
... Если их перенести а в директории создать пустой файл 1Cv8.lgf
#29 by Гёдза
нет ничего хуже для ЧТЕНИЯ логов чем ...
#30 by Гёдза
Хотя если бы в 1с была встроена нормальная система версионирования, то лог файл был бы не нужен
#31 by Провинциальный 1сник
Да фиг с ним с версионированием. Почему просто не хранят лог внутри базы как таблицу?
#32 by orefkov
Для чтения тоже быстрее простого файла ничего нет. А вот для анализа... Во всем мире логи кидают в текстовые файлы, а потом конвертят их по мере надобности в любой приемлемый формат, одна 1С, как всегда, идёт поперёк. Я вообще не понимаю, как они умудряются запороть файл базы данных sqlite, который вообще-то один из самых надежнейших форматов.
#33 by igork1966
потому что при фатальной ошибке с базой, не почитаешь что случилось + бэкап растет
#34 by Провинциальный 1сник
Журнал регистрации для бэкапа не менее ценен, чем данные в базе. А при фатальной ошибке с базой смысла читать лог практически нет.
#35 by ptiz
Текстовый лог - хорошо и удобно. Одно непонятно - как 1С умудряется так медленно с ним работать?
#36 by romix
Видимо через прагму, которая запрещает журнал транзакций PRAGMA journal_mode = OFF см.
#37 by Мыш
Для чтение быстрее блочное чтение )
#38 by Гёдза
нельзя ибо транзакции
#39 by romix
Сейчас попробую написать. Частенько использую текстовый лог, но в 1С и с ним проблема (хотя можно извернуться через FileSystemObject). Требуется отбор по пользователям, кто чего менял, тут с базой, наверное, ловчее. Я бы завел по месяцам, 12 баз в год. Есть же версионирование как внешняя примочка? ВерсииОбъектов, ВерсионированиеОбъектов etc.
#40 by Провинциальный 1сник
То есть, нельзя на sql-сервере произвести запись в таблицу вне текущей транзакции? Если так, то да, проблема.
#41 by Гёдза
Хотя если отдельная очередь будет в отдельном сеансе, то можно
#42 by Гёдза
Это должно было быть сразу, и тогда бы никому журнал регистрации не нужен был, максимум - вход - выход фиксировать
#43 by romix
На отдельный сервер/БД же можно - там же свои транзакции.
#44 by romix
Можно в Медиавики отгружать :-)
#45 by Провинциальный 1сник
По идее да. Если клиент откроет два сеанса на sql-сервере, один для работы с данными, второй - для протоколирования, то транзакции мешать вести лог не будут.
#46 by romix
Готово, ушло. Предложил сделать или вынести это в административные настройки: тогда, я думаю, это обеспечит требуемую для высоко-нагруженных баз степень надежности - а для кого критична скорость, тот поставит PRAGMA journal_mode = OFF. И проблема SQLite, если я правильно ее вижу, будет решена.
#47 by Dmitrii
>> когда же 1с сделает хранение ЖР в основной базе, а не отдельно от неё? Это же напрашивается просто! Не моё мнение: СУБД не совсем подходит для ведения журнала. Используя ее мы платим за то что не будем использовать. Это связано с особенностями нагрузки, которая характеризуется огромным и последовательным по времени трафиком на запись, минимальными изменениями данных и сильно разреженными выборками. (SQLite был выбран в качестве компромисса между субд (клиент-серверной) и хранениями в файлах. Кроме того для файлового варианта использование СУБД вообще чуждо. Решение перехода на SQLite связано с фундаментальными проблемами в старом журнале регистрации. В частности долгие выборки по любым запросам.
#48 by romix
А интересно если разрезать журнал по месяцам - это же будет еще лучший компромисс. Например когда диск подойдет к заполнению, можно будет переместить старые месяцы. Не будет разрастания баз и их индексов.
#49 by Провинциальный 1сник
Для файловой sql-журнал вообще не уместен, особенно при многопользовательском доступе. Тут текстовые файлы рулят. А для клиент-серверной - почему бы и нет, если мощностей сервера хватает? Можно в конце концов сделать это опцией.
#50 by romix
А там же физически файл, SQL сервера как такового нет.
#51 by Провинциальный 1сник
Вот именно, и за этот файл конкурируют на запись куча клиентов, в каждом свой "встроенный сервер sqlite". Это такое же зло, как и 1cd по сети.
#52 by Гёдза
ты не прав. сервер сам пишет в эту базу. клиенты - нет
#53 by romix
SQLite ставит блокировку на файл. Блокировка может быть сделана корректно (с паузами) - думаю, что там это так и есть, и тогда не должно быть «плохой конкуренции» между клиентами, потоками сервера и т.д., которые одновременно пытаются что-то писать. Тут для 1С 7.7 я делал патч: А у сервера много потоков исполнения может быть, там тоже конкуренция (хочется надеяться, что там она корректная и, так сказать, честная).
#54 by romix
Текстовый лог бы тоже делали с блокировками на файл (обычно его называют *.lck, хотя может быть что-то еще). Сервер 1С может распедаливать ожидание конкурирующих потоков через другие механизмы, файлы блокировок - самый древний образец такого межпроцессного взаимодействия.
#55 by Провинциальный 1сник
Какой сервер в случае файловой базы?
#56 by Serg_1960
А почему бы не архивировать журнал в регистр сведений при выгрузке и обрезке?
#57 by Djelf
Ставит то оно ставит, но насколько оно работает создатели не проверяют т.к. это изначально не сетевая, а встраиваемая база данных. Но согласен насчет WAL, только лучше перебить на это не одну, а все прагмы journal_mode.
#58 by orefkov
Для чтения быстрее всего отобразить файл в память и работать с ним как с куском памяти.
#59 by Провинциальный 1сник
На 32-битных системах это ограничивает доступный размер файла 4 гб.
#60 by romix
Да, есть различные разработки, кто-то писал на .NET выгружалку и выложил с исходниками. Но она тоже ведь встанет при ошибке «malformed». Хотя, может быть, и с меньшей вероятностью, если SQLite-базу все время обнулять подчистую (она чистая и шевелиться будет в течение дня быстрее). С блокировкой файла трудно ошибиться, но я подозреваю, что в 1С еще какая-нибудь Прагма отключает еще и это. :-)
#61 by romix
Там еще несколько опций, насколько я понимаю, WAL - это то, что делает MS-SQL со своей базой (гарантируя при этом безошибочный откат транзакций). И там компромисс между двукратной записью и полным отсутствием защиты. :-) А это смотря с какой целью: если вы хотите отобрать события по объекту (документу, элементу справочника) или пользователю, то ничего быстрее СУБД с индексами придумать в принципе нельзя, даже при неограниченном ресурсе ОЗУ. АВЛ-деревья не спроста же придумали в далеком-далеком СССР.
#62 by ЧеловекДуши
Лучше бы 1С разрешила писать запросы на языке хранилища БД. если это SQL, то пишется на SQL, английскими буковками, используя только транскрипцию Реквизитов, как это было реализовано у 1С++ :)
#63 by ЧеловекДуши
Вот ты не поверишь. Но я столкнулся с системой, где вот такой подход приводит только к тому, что анализировать Лог просто нереально долго :) ... Идея от 1С писать в SQLlite приветствуется, но все же встает вопрос, почему не было реализовано в составе БД? Зачем было придумывать костыль? Да, может для файловой БД, это и приемлемо. А вот для других версий, SQL и .т.д. уже трагично глупо со стороны 1С :)
#64 by Strogg
Кстати, в своё время реализовал хранение жр в отдельной сиквельной базе. Прям все летало. Потом с переходами-переездами как-то потерялось. А насчёт хранения в БД - версионирование этож тот же лог изменений.
#65 by Провинциальный 1сник
Версионирование средствами прикладного решения - костыль. Это должна обеспечивать платформа независимо от прикладного решения.
#66 by romix
Логи разрастаются - это первое, что хочется куда-нибудь вынести, обрезать/сократить и так далее. Например, в ситуации когда на диске кончилось место и надо что-нибудь предпринять.
#67 by Провинциальный 1сник
Необходимость резать логи встречается не чаще, чем необходимость резать базу.
#68 by mikecool
а еще лучше 0 прямая печать на матричный принтер и не затрешь потом )
#69 by Провинциальный 1сник
Точно. Как в банковских калькуляторах у кассиров. Все расчеты печатаются на ленте. Что там умножал и делил - всё можно раскрутить потом.
#70 by romix
Потеря базы - это полный аншлаг и все бегают ищут копии, а за потерю логов на практике даже не журят. Ну вот потерялись у нас целых 3 раза, и вроде пока все тихо. То есть, у них ценность другая, а размеры при этом могут быть сопоставимы с основной базой, все эти десятки гигабайт не хочется ежедневно бэкапить. Хотя, в каких-то применениях эти данные могут быть важны, но в этих случаях почему бы не хранить полную историю важных документов через Версионирование 1С.
#71 by orefkov
С чего бы это? Никак это размер файла не ограничивает. Просто отображать будешь "скользящим окном". А вообще как и что с логами делается - во всём цивилизованном мире давно уже решили, одни одинэсники не знают, куда приткнуться, и пытаются велосипеды выдумывать.
#72 by romix
Кстати, да, можно писать в текст же, а отдельным приложением (например, второй базой 1С) тексты разбирать. А чтобы из основной базы 1С можно было кликать на документы и прочее - возможно веб-решение, у нас уже так сделано.   Я сейчас подумал, что таким же путем можно вести вообще полный архив версий документов, при этом не будет зас..ния основной базы версиями.
#73 by Serg_1960
У мня РИБ-база и мне проще - есть узел, база где не только полный архив базы на случай оперативного восстановления, но и версионирование документов. В этой базе пользователи не работают и проблема производительности меня не волнует.
#74 by milan
поделись с миром 1с-ников достижениями в области хранения логов, только чтобы начиная хотябы от 100М записей с возможностью отбора по объекту и пользователю.
#75 by romix
Видимо, быстрее всего писать лог в текст (при этом не выстраивается индекс и нет зависимости скорости записи от объема лога), а потом (например, ночью) его считывать второй БД, а текстовый лог обнулять или перемещать. Для многих внедрений SQLite может быть и оптимальный вариант, есть же всякие бухгалтерии и ларьки. Вообще эта часть разработки платформы может быть не самой трудоемкой: ну заменили DLL ту на эту, что-то изменилось к лучшему, а кому-то понравилась бы и другая опция, я думаю, что со временем и другое тоже разработают, когда дойдут руки/приоритеты. Москва же не сразу строилась.
#76 by orefkov
Вот, до romix'а вроде дошло уже. Что ПИСАТЬ в ЛОГ и АНАЛИЗИРОВАТЬ лог - две разные вещи. Поэтому во всём мире мире ЗАПИСЬ лога осуществляется в обычные текстовые файлы, из которых затем различными КОНВЕРТЕРАМИ информация преобразуется в вид, удобный для АНАЛИЗА. Самое простое средство из цивилизованного мира - logrotate. До его принципа в romix сам додумался. Поэтому на месте одинэсников я вместо ведения журнала в sqlite выпустил бы удобный конвертер, который бы с задаваемой пользователем периодичностью заводил новый файл журнала регистрации, а старый бы конвертил хоть в sqlite, хоть в чёрта лысого.
#77 by milan
ну дак до склайт так и было, решили совместить, потому как тормзоил ЖР.
#78 by DS
"до склайт" было не так. Журнал никуда не конвертировался, а читался из этого же файла.
#79 by denis_jj
Сбоит регулярно. Приходится удалять. До применения SQLite логи работали без сбоев, хотя и медленно. Не понятно для чего нужно было использовать SQLite когда есть сервер СУБД основной базы. Почему не использовать его для хранения отдельной базы логов.
#80 by ДенисЧ
Логи, как и бекапы, нужно хранить отдельно от основной базы. Это же азы безопасности. У меня даже роутер выкидывает свои логи на удалёнку...
#81 by Провинциальный 1сник
Зачем? Это не технологические логи, в отрыве от ИБ смысла в них мало.
#82 by denis_jj
сейчас эти логи тоже хранятся отдельно. Не понятно почему в формате SQLite а не в формате СУБД основной базы.
#83 by denis_jj
ничто не мешает настроить физически отдельное от основной базы место хранения базы логов. Не понятно для чего использовать формат SQLite когда есть формат и сервер СУБД основной базы.
#84 by romix
pragma journal_mode=wal приводит к частым непрогнозируемым зависаниям и деградации производительности на нагруженных базах или при достаточно большом периоде работы. В случае возникновения проблем мы рекомендуем использовать старый журнал регистрации. Для этого из каталога журнала регистрации следует перенести файлы 1Cv8.lgd, и создать пустой файл 1Cv8.lgf.
#85 by Гёдза
К сожалению ты не в 1С (((
#86 by romix
Я подозреваю, что все проблемы решит сочетание  journal_mode=wal и посуточного обрезания лога (365 файлов в год). Или то же самое - с текстом (если получится его методически корректно распарсить в стороннюю базу 1С или SQL).
#87 by Гёдза
ну текстовые резать вроде платформа сама умеет
#88 by romix
Отправил в 1С предложение добавить там мьютекс (скорее всего, транзакции SQLite не распараллеливаются, и это приводит к зависаниям серверных процессов) и посоветовать методически правильное средство для сбора информации из текстовых логов (может, уже есть готовое, или планируется к разработке).
#89 by Гёдза
журнал регистрации пишет 1 процесс. там нет никакой параллельности
#90 by Гёдза
а именно агент сервера rgmgr
#91 by romix
Потоки же там по числу пользователей, нет?
#92 by orefkov
Похоже они просто не умеют правильно работать с sqlite.
#93 by Гёдза
1 поток
#94 by romix
Там видимо надо поставить режим WAL и распараллелить потоки мьютексом (наверное сейчас долбятся повторами при ошибках SQLite). На нагруженных же базах лог собирать из текстов по ночам в, скажем, вторую базу 1С с логами в регистре сведений (без SQLite). Как-то так. Не верю (с) Станиславский. Если два пользователя одновременно записывают документы, то как там один поток может быть?...
#95 by Гёдза
в серверной пишет . В файловой не знаю
#96 by Кирпич
тебе же писали уже, что WAL глючит. Накой тебе этот WAL дался? Пускай тупо в текстовый файл пишут и все будут счастливы.
#97 by Гёдза
а поиск?
#98 by Кирпич
писали же уже. загружай куда хочешь и ищи сколько хочешь. в тот же SQLite.
#99 by orefkov
Ну, мьютексом потоки не распаралеливаются, а наоборот - выстраиваются в очередь. Писать в sqlite базу в один момент может только один писатель. Поэтому если всё-таки вести лог в sqlite - я бы выделил один специальный поток, в который все остальные асинхронно посылали сообщения, а он их выгребал из очереди и писал в базу. Деградация производительности в wal режиме возможна, если какой-либо из читателей не закрывает запрос на выборку. В этом случае sqlite считает, что есть активные читатели и не может сделать "чекпоинт" - скинуть содержимое из wal-журнала в основную базу данных. Из-за этого разрастается список страниц, размещенных в wal-журнале. А в wal-режиме при любом обращении к странице данных сначала проверяется этот список, чтобы узнать, в каком из файлов находится актуальная версия. Имхо, проблему можно решить и без 1С, если административно раз в сутки перезаводить текстовый ЖР, и конвертить прошлый в вид, удобный для анализа. Но при этом все штатные средства просмотра журнала пойдут лесом, а многих такой путь не устраивает, все хотят "vendor way".
#100 by Гёдза
Так это нужно самому все делать
Тэги: 1С 8
Ответить:
Комментарии доступны только авторизированным пользователям

В этой группе 1С