Подскажите как убрать из Журнала Регистрации запись событий "Сеанс Завершен" !
1С 8.3 SQL УПП
Поискал в инете, создал обработку и выполнил такой код:
ИспользованиеСобытия = Новый ИспользованиеСобытияЖурналаРегистрации;
ИспользованиеСобытия.Использование = Ложь;
УстановитьИспользованиеСобытияЖурналаРегистрации("_$Session$_.Finish", ИспользованиеСобытия);
Затем перегрузил Сервер, не помогло ! РегламентныеЗадания которые выполняются часто, постоянно пишут события в ЖурналРегистрации. В итоге загрузка сервера 95-100%
Итак, я разобрался как можно существенно сократить "Журнал регистрации" удалив из него сообщения о фоновых заданиях;
1. Скачиваем SQLite 3 он состоит из трех файлов: sqldiff.exe sqlite3.exe sqlite3_analyzer.exe 2. Копируем 1cv8.lgd в папку с этими тремя файлами;
3. Запускаем sqlite3.exe (я запускал из под FAR'а)
4. Выполняем следующие команды:
(sel ect и fr om и where - слитно* баг на форуме какой-то)
(не забывайте ставить ; в конце строки !) .open 1cv8.lgd
sel ect * fr om AppCodes where name='%Background%';
code|name
2|"BackgroundJob"
// Запоминаем code=2 (как #A)
sel ect * fr om ComputerCodes where name='%-1C-%'; // в условие где "-1С-" подставляем имя сервера 1С (которое указываем при регистрации Базы)
code|name
1|"VIRT-1C-01"
// Запоминаем code=1 (как #C)
sel ect * fr om EventCodes where name='%Begin%';
code|name
3|"_$Transaction$_.Begin"
// Запоминаем code=3 (как #1)
sel ect * fr om EventCodes where name='%Commit%';
code|name
4|"_$Transaction$_.Commit"
// Запоминаем code=4 (как #2)
sel ect * fr om EventCodes where name='%Finish%';
code|name
2|"_$Transaction$_.Finish"
// Запоминаем code=2 (как #3)
.changes on
delete fr om EventLog wh ere (eventCode=#1 OR eventCode=#2 OR eventCode=#3) AND computerCode=#C AND appCode=#A;
changes: 41593705 total_changes: 41593705
// Внимание! Удаление в 7GB файле длилось 15 мин на компе i7 3.2 8Gb-оперативки
// в папке появляется файл 1cv8_journal и постепенно растет ...
vacuum; // Еще примерно 7-8 мин
.exit
Итог наших манипуляций можно оценить по размеру файла 1cv8.lgd В самом начале:
dir 1cv8.lgd
Наконец пришло время очередной чистки, а файл увеличился аж до 20 Gb. Тут даже на мега серваке это займет час или два. Поэтому пришлось подумать, как можно ускорить процесс.
Решение оказалось лежит на поверхности. После очистки мы получаем файл, значительно меньшего размера ... Это навело на простую мысль, - создать НОВУЮ базу и импортировать в нее оставшиеся данные (равные размеру очищенного файла).
1. Проверяем версию PowerShell
Запустите PowerShell, в окне консоли введите $PSVersionTable
$PSVersionTable
CLRVersion 4.0.30319.34014 <- Нас интересует эта строчка !
Это означает что установлена версия 4.0
2. Скачиваем библиотеку SQLite c учетом нашей версии 4.0 со страницы
3. Создаем скрипт файл с расширением .ps1 например CutDB.ps1 - см:вложение
Add-Type -Path "C:\Program Files\System.Data.SQLite\2010\bin\System.Data.SQLite.dll"
$con = New-Object -TypeName System.Data.SQLite.SQLiteConnection
$con.ConnectionString = "Data Source=C:\Vital\1cv9.lgd"
$con.Open()
$sql = $con.CreateCommand()
$sql.CommandText = "ATTACH DATABASE 'C:\Vital\1cv8.lgd' as v8"
$sql.ExecuteNonQuery()
$sql = $con.CreateCommand()
"AppCodes"
$sql.CommandText = "CRE ATE TABLE IF NOT EXISTS AppCodes AS SEL ECT * FR OM v8.AppCodes"
$sql.ExecuteNonQuery()
"ComputerCodes"
$sql.CommandText = "CRE ATE TABLE IF NOT EXISTS ComputerCodes AS SEL ECT * FR OM v8.ComputerCodes"
$sql.ExecuteNonQuery()
"ComputerToUserCodes"
$sql.CommandText = "CRE ATE TABLE IF NOT EXISTS ComputerToUserCodes AS SEL ECT * FR OM v8.ComputerToUserCodes"
$sql.ExecuteNonQuery()
"EventCodes"
$sql.CommandText = "CRE ATE TABLE IF NOT EXISTS EventCodes AS SEL ECT * FR OM v8.EventCodes"
$sql.ExecuteNonQuery()
"EventLogMetadata"
$sql.CommandText = "CRE ATE TABLE IF NOT EXISTS EventLogMetadata AS SEL ECT * FR OM v8.EventLogMetadata"
$sql.ExecuteNonQuery()
"MetadataCodes"
$sql.CommandText = "CRE ATE TABLE IF NOT EXISTS MetadataCodes AS SEL ECT * FR OM v8.MetadataCodes"
$sql.ExecuteNonQuery()
"PrimaryPortCodes"
$sql.CommandText = "CRE ATE TABLE IF NOT EXISTS PrimaryPortCodes AS SEL ECT * FR OM v8.PrimaryPortCodes"
$sql.ExecuteNonQuery()
"SecondaryPortCodes"
$sql.CommandText = "CRE ATE TABLE IF NOT EXISTS SecondaryPortCodes AS SEL ECT * FR OM v8.SecondaryPortCodes"
$sql.ExecuteNonQuery()
"SessionDataCodes"
$sql.CommandText = "CRE ATE TABLE IF NOT EXISTS SessionDataCodes AS SEL ECT * FR OM v8.SessionDataCodes"
$sql.ExecuteNonQuery()
"SessionDataSplits"
$sql.CommandText = "CRE ATE TABLE IF NOT EXISTS SessionDataSplits AS SEL ECT * FR OM v8.SessionDataSplits"
$sql.ExecuteNonQuery()
"SessionHosts"
$sql.CommandText = "CRE ATE TABLE IF NOT EXISTS SessionHosts AS SEL ECT * FR OM v8.SessionHosts"
$sql.ExecuteNonQuery()
"SessionParamCodes"
$sql.CommandText = "CRE ATE TABLE IF NOT EXISTS SessionParamCodes AS SEL ECT * FR OM v8.SessionParamCodes"
$sql.ExecuteNonQuery()
"SessionUsers"
$sql.CommandText = "CRE ATE TABLE IF NOT EXISTS SessionUsers AS SEL ECT * FR OM v8.SessionUsers"
$sql.ExecuteNonQuery()
"UserCodes"
$sql.CommandText = "CRE ATE TABLE IF NOT EXISTS UserCodes AS SEL ECT * FR OM v8.UserCodes"
$sql.ExecuteNonQuery()
"WorkServerCodes"
$sql.CommandText = "CRE ATE TABLE IF NOT EXISTS WorkServerCodes AS SEL ECT * FR OM v8.WorkServerCodes"
$sql.ExecuteNonQuery()
"-------------------------------------"
$sql = $con.CreateCommand()
$sql.CommandText = "SEL ECT * FR OM AppCodes WHERE name=@BackgroundJob"
[void]$sql.Parameters.AddWithValue("@BackgroundJob", '"BackgroundJob"');
$adapter = New-Object -TypeName System.Data.SQLite.SQLiteDataAdapter $sql
$data = New-Object System.Data.DataSet
[void]$adapter.Fill($data)
$appCode = $data.tables.rows[0].code
# DEBUG: Show recordset
# $data.tables.rows
$sql = $con.CreateCommand()
$sql.CommandText = "SEL ECT * FR OM ComputerCodes WHERE (name=@Comp1 OR name=@Comp2)"
[void]$sql.Parameters.AddWithValue("@Comp1", '"SMF-1C-01"');
[void]$sql.Parameters.AddWithValue("@Comp2", '"SMF-1C-02"');
$adapter = New-Object -TypeName System.Data.SQLite.SQLiteDataAdapter $sql
$data = New-Object System.Data.DataSet
[void]$adapter.Fill($data)
# DEBUG: Show recordset
# $data.tables.rows
$computerCode1 = $data.tables.rows[0].code
$computerCode2 = $data.tables.rows[1].code
$sql = $con.CreateCommand()
$sql.CommandText = "SEL ECT * FR OM EventCodes where name Like @Begin OR name Like @Commit OR name Like @Finish"
[void]$sql.Parameters.AddWithValue("@Begin", '%Begin%');
[void]$sql.Parameters.AddWithValue("@Commit", '%Commit%');
[void]$sql.Parameters.AddWithValue("@Finish", '%Finish%');
$adapter = New-Object -TypeName System.Data.SQLite.SQLiteDataAdapter $sql
$data = New-Object System.Data.DataSet
[void]$adapter.Fill($data)
# DEBUG: Show recordset
# $data.tables.rows
$eventCode1 = $data.tables.rows[0].code
$eventCode2 = $data.tables.rows[1].code
$eventCode3 = $data.tables.rows[2].code
"Selecting EventLog (~5 min)"
$sql = $con.CreateCommand()
$sql.CommandText = "CRE ATE TABLE EventLog AS SELECT * FR OM v8.EventLog WH ERE NOT ((eventCode=@eventCode1 OR eventCode=@eventCode2 OR eventCode=@eventCode3) AND (computerCode=@computerCode1 OR computerCode=@computerCode2) AND appCode=@appCode)"
[void]$sql.Parameters.AddWithValue("@eventCode1", $eventCode1);
[void]$sql.Parameters.AddWithValue("@eventCode2", $eventCode2);
[void]$sql.Parameters.AddWithValue("@eventCode3", $eventCode3);
[void]$sql.Parameters.AddWithValue("@computerCode1", $computerCode1);
[void]$sql.Parameters.AddWithValue("@computerCode2", $computerCode2);
[void]$sql.Parameters.AddWithValue("@appCode", $appCode);
$sql.ExecuteNonQuery()
Write-Host "Press any key to continue ..."
$x = $host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")
$sql.Dispose()
$con.Close()
$con.Dispose()
Показать
В этом скрипте Вам нужно заменить пути на свои:
Add-Type -Path "C:\Program Files\System.Data.SQLite\2010\bin\System.Data.SQLite.dll" По этому пути должна лежать System.Data.SQLite.dll
C:\Vital\1cv9.lgd
C:\Vital\1cv8.lgd Замените имя сервера на свое:
"SMF-1C-01"
SMF-1C-02" Если у Вас один сервер, дважды проставьте "SRV-1C-01" и "SRV-1C-01"
закомментируйте строчку с помощью #
# $computerCode2 = $data.tables.rows[1].code
Выполните скрипт, правая кнопка на файле CutDB.ps1 Выполнить с помощью PowerShell
(9) Очевидно потому что запрос "SEL ECT * FR OM AppCodes WHERE name=@BackgroundJob" не возвращает строк ! Нужно посмотреть таблицу AppCodes на наличие "BackgroundJob"
Настроил у себя этот скрипт. после выполнения создается новый файл 1cv9.lgd я так понимаю это обрезаный журнал? А что с ним дальше то делать? Я пробовал заменить файл оригинал журнала регистрации, но потом при запуске 1с выдает ошибку
Ошибка формата файла журнала регистрации
по причине:
sqlite3_exec failed: attempt to write a readonly database
db: C:\Program Files (x86)\1cv8\srvinfo\reg_1541\******************\1Cv8Log\1Cv8.lgd
sql: CRE ATE INDEX IF NOT EXISTS EventLog_idx_date ON EventLog (date);