Имя: Пароль:
1C
1С v8
Журнал регистрации 1С на SQLite - из-за чего возникают сбои?
0 romix
 
26.11.15
04:08
1. сбоит 100% (6)
2. не сбоит 0% (0)
Всего мнений: 6

Периодически журнал регистрации 1С 8.3 портится (неизвестно из-за чего), пишет сообщение, дескать, malformed, и всё. Перенос или удаление файлов журнала регистрации решает проблему, но ценой обнуления журнала.

Читаю http://habrahabr.ru/post/181584/ - вроде все в этой СУБД по теории - однако сбои-то налицо (я очень надеюсь, что сбоит не у всех).

Есть умные настройки SQLite с выбором между скоростью и надежностью: интересно, каковы они в 1С.
http://www.sqlite.org/draft/pragma.html#pragma_synchronous
1 ЧеловекДуши
 
26.11.15
06:33
(0) У 1С, как всегда. Рассчитано для ларька. :)
2 Провинциальный 1сник
 
26.11.15
07:38
Блин. Ну когда же 1с сделает хранение ЖР в основной базе, а не отдельно от неё? Это же напрашивается просто!
3 Провинциальный 1сник
 
26.11.15
07:40
+(2) для sql-версии, конечно же. В файловой пусть остается как есть.
5 Strogg
 
26.11.15
08:22
Трое суток журнал восстанавливал прошлый раз после сбоя. Слетел при обновлении платформы. Что-то они там недоперемудрили.
6 quit
 
26.11.15
08:23
(2) Сделай свой журнал через регистры сведений
8 zak555
 
26.11.15
08:28
И не раз

сбоит
9 nick_p-k
 
26.11.15
08:33
Вчера восстанавливал по инструкции, указанной в http://catalog.mista.ru/public/402536/.

сбоит
10 nick_p-k
 
26.11.15
08:33
11 Sиlьver
 
26.11.15
08:45
тоже не раз сталкивался

сбоит
12 romix
 
26.11.15
14:16
В backbas.dll в составе 1С:Предприятие 8.3 (8.3.6.2299) стоят такие прагмы:

PRAGMA secure_delete = ON
PRAGMA journal_mode = memory
PRAGMA journal_mode = delete
PRAGMA journal_mode = OFF
PRAGMA read_uncommitted = yes

В sqlite.dll есть подстрока
PRAGMA vacuum_db.synchronous=OFF

сбоит
13 romix
 
26.11.15
14:30
Думаю надо заменить
    PRAGMA journal_mode = OFF
на
    PRAGMA journal_mode = WAL

http://www.sqlite.org/draft/pragma.html#pragma_journal_mode

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 zak555
 
26.11.15
14:32
(13) где заменить ?
15 romix
 
26.11.15
14:36
(14) Внутри DLL backbas.dll - хотя наверное правильнее 1С попросить, это только моя гипотеза. Или в настройку это вынести...
16 romix
 
26.11.15
14:47
Если я правильно понимаю, WAL применяется в MS-SQL и в других базах данных, чтобы при выключении питания и других сбоях можно было откатить неудачную транзакцию.
17 zak555
 
26.11.15
16:47
(15) написал на [email protected] ?
18 Гёдза
 
26.11.15
16:50
пока 1с НЕ РЕКОМЕНДУЕТ новый формат )))
19 zak555
 
26.11.15
16:52
(18) где про это указано ?
20 Гёдза
 
26.11.15
16:53
(19) на партнерском форуме было
21 Гёдза
 
26.11.15
16:54
на курсах по эксперту тоже самое говорят
22 Гёдза
 
26.11.15
16:54
Для высоконагруженных решений конечно же
23 Гёдза
 
26.11.15
16:55
24 Гёдза
 
26.11.15
16:56
в 8.3.7 может быть починили. МОЖЕТ БЫТЬ
25 Провинциальный 1сник
 
26.11.15
17:00
(18) Для новых ИБ он ставится по умолчанию, и вернуть старый невозможно.
26 zak555
 
26.11.15
17:05
(25) возможно
27 orefkov
 
26.11.15
17:12
Нет ничего лучше для записи логов, чем обычный текстовый файл.
28 Гёдза
 
26.11.15
17:13
(25) ... Если их перенести а в директории создать пустой файл 1Cv8.lgf
29 Гёдза
 
26.11.15
17:13
(27) нет ничего хуже для ЧТЕНИЯ логов чем ...
30 Гёдза
 
26.11.15
17:14
Хотя если бы в 1с была встроена нормальная система версионирования, то лог файл был бы не нужен
31 Провинциальный 1сник
 
26.11.15
17:18
(30) Да фиг с ним с версионированием. Почему просто не хранят лог внутри базы как таблицу?
32 orefkov
 
26.11.15
17:18
(29)
Для чтения тоже быстрее простого файла ничего нет. А вот для анализа...
Во всем мире логи кидают в текстовые файлы, а потом конвертят их по мере надобности в любой приемлемый формат, одна 1С, как всегда, идёт поперёк.
Я вообще не понимаю, как они умудряются запороть файл базы данных sqlite, который вообще-то один из самых надежнейших форматов.
33 igork1966
 
26.11.15
17:20
(31) потому что при фатальной ошибке с базой, не почитаешь что случилось + бэкап растет
34 Провинциальный 1сник
 
26.11.15
17:26
(33) Журнал регистрации для бэкапа не менее ценен, чем данные в базе. А при фатальной ошибке с базой смысла читать лог практически нет.
35 ptiz
 
26.11.15
17:47
Текстовый лог - хорошо и удобно.
Одно непонятно - как 1С умудряется так медленно с ним работать?
36 romix
 
26.11.15
18:16
(32) Видимо через прагму, которая запрещает журнал транзакций
PRAGMA journal_mode = OFF
см. (13)
37 Мыш
 
26.11.15
18:18
(32) Для чтение быстрее блочное чтение )
38 Гёдза
 
26.11.15
18:27
(31) нельзя ибо транзакции
39 romix
 
26.11.15
18:35
(17) Сейчас попробую написать.

(27) Частенько использую текстовый лог, но в 1С и с ним проблема (хотя можно извернуться через FileSystemObject).
Требуется отбор по пользователям, кто чего менял, тут с базой, наверное, ловчее. Я бы завел по месяцам, 12 баз в год.

(30) Есть же версионирование как внешняя примочка? ВерсииОбъектов, ВерсионированиеОбъектов etc.
40 Провинциальный 1сник
 
26.11.15
18:39
(38) То есть, нельзя на sql-сервере произвести запись в таблицу вне текущей транзакции? Если так, то да, проблема.
41 Гёдза
 
26.11.15
18:41
(40) Хотя если отдельная очередь будет в отдельном сеансе, то можно
42 Гёдза
 
26.11.15
18:42
(39) Это должно было быть сразу, и тогда бы никому журнал регистрации не нужен был, максимум - вход - выход фиксировать
43 romix
 
26.11.15
18:43
(40) На отдельный сервер/БД же можно - там же свои транзакции.
44 romix
 
26.11.15
18:44
(42) Можно в Медиавики отгружать :-)
45 Провинциальный 1сник
 
26.11.15
18:45
(41) По идее да. Если клиент откроет два сеанса на sql-сервере, один для работы с данными, второй - для протоколирования, то транзакции мешать вести лог не будут.
46 romix
 
26.11.15
19:10
(17) Готово, ушло.

Предложил сделать (13) или вынести это в административные настройки: тогда, я думаю, это обеспечит требуемую для высоко-нагруженных баз степень надежности - а для кого критична скорость, тот поставит PRAGMA journal_mode = OFF. И проблема SQLite, если я правильно ее вижу, будет решена.
47 Dmitrii
 
гуру
26.11.15
19:25
(2) >> когда же 1с сделает хранение ЖР в основной базе, а не отдельно от неё? Это же напрашивается просто!

Не моё мнение:

СУБД не совсем подходит для ведения журнала. Используя ее мы платим за то что не будем использовать. Это связано с особенностями нагрузки, которая характеризуется огромным и последовательным по времени трафиком на запись, минимальными изменениями данных и сильно разреженными выборками. (SQLite был выбран в качестве компромисса между субд (клиент-серверной) и хранениями в файлах. Кроме того для файлового варианта использование СУБД вообще чуждо.

Решение перехода на SQLite связано с фундаментальными проблемами в старом журнале регистрации. В частности долгие выборки по любым запросам.
48 romix
 
26.11.15
19:34
(47) А интересно если разрезать журнал по месяцам - это же будет еще лучший компромисс. Например когда диск подойдет к заполнению, можно будет переместить старые месяцы. Не будет разрастания баз и их индексов.
49 Провинциальный 1сник
 
26.11.15
19:41
(47) Для файловой sql-журнал вообще не уместен, особенно при многопользовательском доступе. Тут текстовые файлы рулят. А для клиент-серверной - почему бы и нет, если мощностей сервера хватает? Можно в конце концов сделать это опцией.
50 romix
 
26.11.15
19:45
(49) А там же физически файл, SQL сервера как такового нет.
51 Провинциальный 1сник
 
26.11.15
20:52
(50) Вот именно, и за этот файл конкурируют на запись куча клиентов, в каждом свой "встроенный сервер sqlite". Это такое же зло, как и 1cd по сети.
52 Гёдза
 
26.11.15
21:15
(51) ты не прав. сервер сам пишет в эту базу. клиенты - нет
53 romix
 
26.11.15
22:18
(51) SQLite ставит блокировку на файл. Блокировка может быть сделана корректно (с паузами) - думаю, что там это так и есть, и тогда не должно быть «плохой конкуренции» между клиентами, потоками сервера и т.д., которые одновременно пытаются что-то писать. Тут для 1С 7.7 я делал патч:
Книга знаний: Исправление ошибки 1С:Предприятие 7.7/8.0 - 100% загрузка процессора при ожидании блокировки

(52) А у сервера много потоков исполнения может быть, там тоже конкуренция (хочется надеяться, что там она корректная и, так сказать, честная).
54 romix
 
26.11.15
22:24
Текстовый лог бы тоже делали с блокировками на файл (обычно его называют *.lck, хотя может быть что-то еще). Сервер 1С может распедаливать ожидание конкурирующих потоков через другие механизмы, файлы блокировок - самый древний образец такого межпроцессного взаимодействия.
55 Провинциальный 1сник
 
26.11.15
23:52
(52) Какой сервер в случае файловой базы?
56 Serg_1960
 
26.11.15
23:58
А почему бы не архивировать журнал в регистр сведений при выгрузке и обрезке?
57 Djelf
 
27.11.15
00:29
(53) Ставит то оно ставит, но насколько оно работает создатели не проверяют т.к. это изначально не сетевая, а встраиваемая база данных.
http://sqlite.1065341.n5.nabble.com/AGAIN-SQLite-on-network-share-td85552.html
Но согласен насчет WAL, только лучше перебить на это не одну, а все прагмы journal_mode.
58 orefkov
 
27.11.15
00:55
(37)
Для чтения быстрее всего отобразить файл в память и работать с ним как с куском памяти.
59 Провинциальный 1сник
 
27.11.15
00:56
(58) На 32-битных системах это ограничивает доступный размер файла 4 гб.
60 romix
 
27.11.15
01:03
(56) Да, есть различные разработки, кто-то писал на .NET выгружалку и выложил с исходниками. Но она тоже ведь встанет при ошибке «malformed». Хотя, может быть, и с меньшей вероятностью, если SQLite-базу все время обнулять подчистую (она чистая и шевелиться будет в течение дня быстрее).

(57) С блокировкой файла трудно ошибиться, но я подозреваю, что в 1С еще какая-нибудь Прагма отключает еще и это. :-)
61 romix
 
27.11.15
02:17
(57) Там еще несколько опций, насколько я понимаю, WAL - это то, что делает MS-SQL со своей базой (гарантируя при этом безошибочный откат транзакций). И там компромисс между двукратной записью и полным отсутствием защиты. :-)

(58) А это смотря с какой целью: если вы хотите отобрать события по объекту (документу, элементу справочника) или пользователю, то ничего быстрее СУБД с индексами придумать в принципе нельзя, даже при неограниченном ресурсе ОЗУ. АВЛ-деревья не спроста же придумали в далеком-далеком СССР.
62 ЧеловекДуши
 
27.11.15
06:57
(2) Лучше бы 1С разрешила писать запросы на языке хранилища БД. если это SQL, то пишется на SQL, английскими буковками, используя только транскрипцию Реквизитов, как это было реализовано у 1С++ :)
63 ЧеловекДуши
 
27.11.15
07:00
(32) Вот ты не поверишь. Но я столкнулся с системой, где вот такой подход приводит только к тому, что анализировать Лог просто нереально долго :)
... Идея от 1С писать в SQLlite приветствуется, но все же встает вопрос, почему не было реализовано в составе БД?
Зачем было придумывать костыль?
Да, может для файловой БД, это и приемлемо. А вот для других версий, SQL и .т.д. уже трагично глупо со стороны 1С :)
64 Strogg
 
27.11.15
07:06
Кстати, в своё время реализовал хранение жр в отдельной сиквельной базе. Прям все летало. Потом с переходами-переездами как-то потерялось.
А насчёт хранения в БД - версионирование этож тот же лог изменений.
65 Провинциальный 1сник
 
27.11.15
07:20
(64) Версионирование средствами прикладного решения - костыль. Это должна обеспечивать платформа независимо от прикладного решения.
66 romix
 
27.11.15
11:13
(63) Логи разрастаются - это первое, что хочется куда-нибудь вынести, обрезать/сократить и так далее. Например, в ситуации когда на диске кончилось место и надо что-нибудь предпринять.
67 Провинциальный 1сник
 
27.11.15
13:06
(66) Необходимость резать логи встречается не чаще, чем необходимость резать базу.
68 mikecool
 
27.11.15
13:09
(27) а еще лучше 0 прямая печать на матричный принтер
и не затрешь потом )
69 Провинциальный 1сник
 
27.11.15
14:02
(68) Точно. Как в банковских калькуляторах у кассиров. Все расчеты печатаются на ленте. Что там умножал и делил - всё можно раскрутить потом.
70 romix
 
27.11.15
18:29
(67)  Потеря базы - это полный аншлаг и все бегают ищут копии, а за потерю логов на практике даже не журят. Ну вот потерялись у нас целых 3 раза, и вроде пока все тихо. То есть, у них ценность другая, а размеры при этом могут быть сопоставимы с основной базой, все эти десятки гигабайт не хочется ежедневно бэкапить. Хотя, в каких-то применениях эти данные могут быть важны, но в этих случаях почему бы не хранить полную историю важных документов через Версионирование 1С.
71 orefkov
 
28.11.15
17:11
(59)
С чего бы это?
Никак это размер файла не ограничивает. Просто отображать будешь "скользящим окном".

А вообще как и что с логами делается - во всём цивилизованном мире давно уже решили, одни одинэсники не знают, куда приткнуться, и пытаются велосипеды выдумывать.
72 romix
 
28.11.15
17:11
(32) Кстати, да, можно писать в текст же, а отдельным приложением (например, второй базой 1С) тексты разбирать. А чтобы из основной базы 1С можно было кликать на документы и прочее - возможно веб-решение, у нас уже так сделано.  

Я сейчас подумал, что таким же путем можно вести вообще полный архив версий документов, при этом не будет зас..ния основной базы версиями.
73 Serg_1960
 
28.11.15
20:27
(72) У мня РИБ-база и мне проще - есть узел, база где не только полный архив базы на случай оперативного восстановления, но и версионирование документов. В этой базе пользователи не работают и проблема производительности меня не волнует.
74 milan
 
28.11.15
21:24
(71) поделись с миром 1с-ников достижениями в области хранения логов, только чтобы начиная хотябы от 100М записей с возможностью отбора по объекту и пользователю.

сбоит
75 romix
 
29.11.15
19:58
(74) Видимо, быстрее всего писать лог в текст (при этом не выстраивается индекс и нет зависимости скорости записи от объема лога), а потом (например, ночью) его считывать второй БД, а текстовый лог обнулять или перемещать.

(71) Для многих внедрений SQLite может быть и оптимальный вариант, есть же всякие бухгалтерии и ларьки. Вообще эта часть разработки платформы может быть не самой трудоемкой: ну заменили DLL ту на эту, что-то изменилось к лучшему, а кому-то понравилась бы и другая опция, я думаю, что со временем и другое тоже разработают, когда дойдут руки/приоритеты. Москва же не сразу строилась.
76 orefkov
 
29.11.15
20:33
(74)
Вот, до romix'а вроде дошло уже.
Что ПИСАТЬ в ЛОГ и АНАЛИЗИРОВАТЬ лог - две разные вещи.
Поэтому во всём мире мире ЗАПИСЬ лога осуществляется в обычные текстовые файлы, из которых затем различными КОНВЕРТЕРАМИ информация преобразуется в вид, удобный для АНАЛИЗА.
Самое простое средство из цивилизованного мира - logrotate.
До его принципа в (75) romix сам додумался.

Поэтому на месте одинэсников я вместо ведения журнала в sqlite выпустил бы удобный конвертер, который бы с задаваемой пользователем периодичностью заводил новый файл журнала регистрации, а старый бы конвертил хоть в sqlite, хоть в чёрта лысого.
77 milan
 
30.11.15
11:45
(76) ну дак до склайт так и было, решили совместить, потому как тормзоил ЖР.
78 DS
 
30.11.15
13:12
(77) "до склайт" было не так. Журнал никуда не конвертировался, а читался из этого же файла.
79 denis_jj
 
30.11.15
14:09
Сбоит регулярно. Приходится удалять.
До применения SQLite логи работали без сбоев, хотя и медленно.
Не понятно для чего нужно было использовать SQLite когда есть сервер СУБД основной базы. Почему не использовать его для хранения отдельной базы логов.

сбоит
80 ДенисЧ
 
30.11.15
14:10
Логи, как и бекапы, нужно хранить отдельно от основной базы. Это же азы безопасности.
У меня даже роутер выкидывает свои логи на удалёнку...
81 Провинциальный 1сник
 
30.11.15
14:11
(80) Зачем? Это не технологические логи, в отрыве от ИБ смысла в них мало.
82 denis_jj
 
30.11.15
14:58
(81) сейчас эти логи тоже хранятся отдельно. Не понятно почему в формате SQLite а не в формате СУБД основной базы.
83 denis_jj
 
30.11.15
15:04
(80) ничто не мешает настроить физически отдельное от основной базы место хранения базы логов. Не понятно для чего использовать формат SQLite когда есть формат и сервер СУБД основной базы.
84 romix
 
30.11.15
15:56
Ответ от 1С:
pragma journal_mode=wal приводит к частым непрогнозируемым зависаниям и деградации производительности на нагруженных базах или при достаточно большом периоде работы.

В случае возникновения проблем мы рекомендуем использовать старый журнал регистрации.

Для этого из каталога журнала регистрации следует перенести файлы 1Cv8.lgd, и создать пустой файл 1Cv8.lgf.
85 Гёдза
 
30.11.15
15:59
(76) К сожалению ты не в 1С (((
86 romix
 
30.11.15
16:05
Я подозреваю, что все проблемы решит сочетание  journal_mode=wal и посуточного обрезания лога (365 файлов в год).
Или то же самое - с текстом (если получится его методически корректно распарсить в стороннюю базу 1С или SQL).
87 Гёдза
 
30.11.15
16:07
(86) ну текстовые резать вроде платформа сама умеет
88 romix
 
14.12.15
15:07
Отправил в 1С предложение добавить там мьютекс (скорее всего, транзакции SQLite не распараллеливаются, и это приводит к зависаниям серверных процессов) и посоветовать методически правильное средство для сбора информации из текстовых логов (может, уже есть готовое, или планируется к разработке).
89 Гёдза
 
14.12.15
15:17
(88) журнал регистрации пишет 1 процесс. там нет никакой параллельности
90 Гёдза
 
14.12.15
15:17
а именно агент сервера rgmgr
91 romix
 
14.12.15
15:20
(89) Потоки же там по числу пользователей, нет?
92 orefkov
 
14.12.15
15:22
(84)
Похоже они просто не умеют правильно работать с sqlite.
93 Гёдза
 
14.12.15
15:25
(91) 1 поток
94 romix
 
14.12.15
15:31
(92) Там видимо надо поставить режим WAL и распараллелить потоки мьютексом (наверное сейчас долбятся повторами при ошибках SQLite).

На нагруженных же базах лог собирать из текстов по ночам в, скажем, вторую базу 1С с логами в регистре сведений (без SQLite). Как-то так.

(93) Не верю (с) Станиславский. Если два пользователя одновременно записывают документы, то как там один поток может быть?...
95 Гёдза
 
14.12.15
15:32
(94) в серверной пишет (90). В файловой не знаю
96 Кирпич
 
14.12.15
15:42
(94) тебе же писали уже, что WAL глючит. Накой тебе этот WAL дался? Пускай тупо в текстовый файл пишут и все будут счастливы.
97 Гёдза
 
14.12.15
15:43
(96) а поиск?
98 Кирпич
 
14.12.15
15:45
(97) писали же уже. загружай куда хочешь и ищи сколько хочешь. в тот же SQLite.
99 orefkov
 
14.12.15
15:45
(94)
Ну, мьютексом потоки не распаралеливаются, а наоборот - выстраиваются в очередь. Писать в sqlite базу в один момент может только один писатель. Поэтому если всё-таки вести лог в sqlite - я бы выделил один специальный поток, в который все остальные асинхронно посылали сообщения, а он их выгребал из очереди и писал в базу.
Деградация производительности в wal режиме возможна, если какой-либо из читателей не закрывает запрос на выборку. В этом случае sqlite считает, что есть активные читатели и не может сделать "чекпоинт" - скинуть содержимое из wal-журнала в основную базу данных. Из-за этого разрастается список страниц, размещенных в wal-журнале. А в wal-режиме при любом обращении к странице данных сначала проверяется этот список, чтобы узнать, в каком из файлов находится актуальная версия.

Имхо, проблему можно решить и без 1С, если административно раз в сутки перезаводить текстовый ЖР, и конвертить прошлый в вид, удобный для анализа. Но при этом все штатные средства просмотра журнала пойдут лесом, а многих такой путь не устраивает, все хотят "vendor way".
100 Гёдза
 
14.12.15
15:46
(98) Так это нужно самому все делать
101 romix
 
14.12.15
15:46
(96) Глючит не сам WAL, а режим повторной записи без пауз, при помощи которого, очевидно, распараллеливают запись в журнал.
102 romix
 
14.12.15
15:48
(99) Мьютекс же задерживает поток, у Рихтера это образно описано как кабинка туалета в самолете. :-) Ну да, выстраивает клиентов в очередь. :-)
103 orefkov
 
14.12.15
15:48
(101)
Да нет там никакого режима повторной записи без пауз и распаралеливания записи в журнал. Сто раз уже писал - в sqlite базу нельзя писать параллельно, только один писатель в момент. И это сам sqlite отлично поддерживает.
104 romix
 
14.12.15
15:49
(103) Он возвращает код ошибки, а 1С долбится пока не кончится ошибка.
105 romix
 
14.12.15
15:50
(103) Я это и имею в виду. А чего там по коду происходит не посмотрите? А то у меня дизассемблера сейчас нету.
106 romix
 
14.12.15
15:51
Т.е. что происходит когда SQLite возвращает ошибку. У нас есть типичная ошибка, когда серверный процесс 1С зависает и при этом все время растет лог.
107 romix
 
14.12.15
15:53
Если там тяжело или нет времени то не надо, я уже в 1С написал свое предположение. Вот мой текст письма:

«Здравствуйте, уважаемые сотрудники фирмы 1С!

>В случае возникновения проблем мы рекомендуем использовать старый журнал регистрации.

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

>pragma journal_mode=wal приводит к частым непрогнозируемым зависаниям

Мы наблюдаем также проблему зависания серверных процессов, которая, скорее всего, связана с этой же проблемой (хотя pragma journal_mode=wal и отключен). Серверный процесс rmngr или rphost непрерывно пишет в лог, не снимается при остановке сервера и не отвечает (такие зависшие процессы надо прибивать вручную в диспетчере задач, при этом лог SQLite все время растет). Я могу предполагать (не проверял, но если надо, могу проверить), что попытки записи в базу данных логов не распараллелены и система «долбится» наподобие «дятла», ожидая блокировку, когда в базу SQLite пишет другой процесс или поток. «Частые непрогнозируемые зависания» - это, видимо, из-за того, что несколько «дятлов» (образное сравнение)-потоков подключаются к процессу «долбления», и проблема нарастает, как снежный ком. А если SQLite возвращает ошибку, но при этом все-таки выполняет саму запись в свою БД, то возникает то, что мы видим в процессе эксплуатации 1С:Предприятие.

Мое предложение – проверить, действительно ли не распараллелены транзакции записи в базу SQLite (это можно сделать при помощи нарастающего sleep, а также системных средств – мьютексов и семафоров, которые есть во всех операционных системах, включая Windows и Unix) и распараллелить их, а не обходиться только повторными попытками записи без пауз при возврате от SQLite кода ошибки. Там должны быть два вызова Mutex в начале и в конце транзакции – если их нет, то проблема «частых и неконтролируемых зависаний» – неизбежна именно здесь.

Переход на текстовый режим логов в нашем случае будет означать, что пропадут все наработки, которые уже сделаны для выгрузки логов в базу данных MS-SQL. Если мы будем ежедневно сбрасывать лог в базу MS-SQL и обнулять/очищать лог, то проблема pragma journal_mode=wal, (желательно, в сочетании, с мьютексом) скорее всего, не возникнет? Но зато решится проблема нестабильной работы 1С:Предприятие.

Но, может быть, текстовый режим записи логов – как раз то, что нужно на нагруженных базах, и необходимо лишь средство для выгрузки содержимого текстовых логов в базу данных (предпочтительна вторая база 1С:Предприятие, содержащая логи, скажем, в регистре сведений). Поэтому у меня вопрос – есть ли (или планируются ли к разработке, если их нет)  методически правильные средства для сбора логов во вторую базу 1С:Предприятие? Поскольку много логов у нас уже написаны в базы SQLite, то будет полезен сбор данных также и из этого вида логов».
108 Кирпич
 
14.12.15
15:55
(107) и часто ты им такое пишешь? :)
109 romix
 
14.12.15
15:58
(108) Да вроде вежливо всё. Или там я технически не прав где-то?
110 Кирпич
 
14.12.15
16:01
(109) Про свои предположения и всякие мьютексы писать необязательно. А про глюки сообщать конечно очень полезно.
111 romix
 
14.12.15
16:04
(110) Ну там по коду легко посмотреть же, вдруг это оно. Иначе бы не было ошибки с зависанием rmngr и при этом непрерывной записью в лог.
112 Кирпич
 
14.12.15
16:07
(111) кто писал, тот пускай и разбирается. зачем давать советы, если ты точно не знаешь как оно работает. это неправильно и смешно.
113 Кирпич
 
14.12.15
16:08
мьютексы какие то. может там нету никаких мьютексов, а ты им про мьютексы...
114 romix
 
14.12.15
16:10
(112) Писали много раз, предположение, что надо выключать журнал SQLite и включать старый текстовый журнал, ни у кого в 1С не возникло.

(113) Дятлы зато летают, поклев дятлами (если использовать мое образное сравнение) же налицо.
115 romix
 
14.12.15
16:19
(112) Правильно конечно дизассемблировать. Я так и не разобрался с дизассемблерами, а надо бы за них засесть.
116 Кирпич
 
14.12.15
16:25
(115) замени sqlite.dll своей dll и сделай свою систему логов
117 Гёдза
 
14.12.15
16:28
(116) Кстати хорошая идея. Написать транслятор для другой субд например MSSQL
118 Кирпич
 
14.12.15
16:33
(117) поздно. после письма от romix в 1с уже наорали на индуса, который систему логов писал. в следующем релизе заработает нормально
119 romix
 
14.12.15
16:34
(116) Лень, вдруг починят. Там же 3 строки заменить, и все будет пучком.

(117) Орефков выше предлагает писать в текст и собирать внешней прогой в SQL, думаю что так на нагруженной базе будет правильнее всего.

Но для этого требуется делать методически правильный механизм сбора логов: может быть в 1С чего посоветуют (я им об этом последним абзацем написал).
120 Гёдза
 
14.12.15
16:36
вообще лучше использовать версионирование. Свое или 1с или сторонних разработок.
А журнал регистраций оставить только для ошибок
121 Кирпич
 
14.12.15
16:37
(119) "Там же 3 строки заменить". Напиши в 1с и про три строки тоже.
122 romix
 
14.12.15
16:41
(121) Да, там неопределенность, читать "3 строки (?)".
123 romix
 
14.12.15
16:46
(120) Тут выше предлагали РБД. Но есть страх, что и там чего нибудь чебурахнется.