Удаление логов из БД "Shelter"

Удаление логов из базы данных

       При длительном использовании ПО Shelter увеличивается размер БД, т.к. действия пользователей логируются и записываются в таблицы LOG$FIELDS и LOG$TABLES.

      Для удаления логов из БД, сначала необходимо выполнить диагностику базы. Подключится к БД и запустить диагностику можно с помощью программы IBExpert (Рис. 1).

Рис. 1

      После выполнения диагностики результаты можно посмотреть на вкладке «Tables» поля «Size» для таблиц LOG$FIELDS и LOG$TABLES (Рис. 2).

Рис. 2

      Для удаления всех логов необходимо выполнить следующие скрипты:

                   1.       Удаление логирования из таблицы LOG$FIELDS

                   delete from log$fields;

                   commit;

                   2.       Удаление логирования из таблицы LOG$TABLES

                   delete from log$tables;

                           commit;

Для удаления логов за определенный период необходимо выполнить следующий скрипт:

           delete from LOG$TABLES LT where LT.DATE_TIME < d2dbl('now') - 30;

           delete from LOG$FIELDS LF where not LF.LOG_TABLES_ID in (select LT.ID from LOG$TABLES LT where LT.ID = LF.LOG_TABLES_ID);

           commit;

      После выполнения данного скрипта, в БД останутся логи за 30 дней, остальные будут удалены.

      Для уменьшения размера БД необходимо сделать backup / restore.

      Для автоматического удаления логов необходимо в «Планировщик заданий» Windows добавить простую задачу с выполнением .bat файла, рядом с котором должен быть файл script.sql.

      Содержание .bat файла:

                   @rem Указать путь до isql.exe

                   @echo off

                   set isql="C:\Program Files (x86)\Shelter\Firebird\bin\isql.exe" 

                   set sqlPath=%~dp0

                   set sqlFile=%sqlPath%script.sql

                   %isql% -input %sqlFile%

Содержание script.sql:

                                    CONNECT 'localhost/3080:C:\_BASE\SHELTER.FDB' user 'ucs' PASSWORD 'ucs';

                   delete from LOG$TABLES LT where LT.DATE_TIME < d2dbl('now') - 30;

                   delete from LOG$FIELDS LF where not LF.LOG_TABLES_ID in (select LT.ID from LOG$TABLES LT where LT.ID = LF.LOG_TABLES_ID);

                   commit;