===== Обслуживание базы данных. =====
^Номер регламента^Вид обслуживания^Периодичность^Необходимые программы^
|1|Копирование базы данных|Ежедневно|см. Batch-файл резервного копирования|
|2|Удаление событий старше заданного периода|Ежемесячно|[[http://www.artonit.ru/index.php?option=com_content&view=article&id=61:dbclean_for_service_db&catid=57:artonit-hard-soft&Itemid=76|DBClean]]|
|3|Удаление неактивных пользователей|Ежеквартально|С помощью программы IBExpert запросом delete from people p where p."ACTIVE"=0
|
|4|Бэкап-Ресторе базы данных|Ежеквартально|[[http://www.artonit.ru/index.php?option=com_content&view=article&id=61:dbclean_for_service_db&catid=57:artonit-hard-soft&Itemid=76|DBClean]]|
|5|Автоматическая чистка базы данных|Ежедневно|{{ :uni:db_skud_service.zip |}}\\ Открыть архив в любую папку.\\ Проверить пути к исполняемым файлам.\\ Настроить Назначенные задания на запуск файла db_SKUD_service.bat в указанное время (лучше ночью, т.к. процесс очистки может занимать длительное время).\\ --- //[[admin@artonit.ru|Бухаров А.В.]] 11.01.2020 10:49// Содержимое файла db_SKUD_service.sql изменено согласно [[uni:uni#Единый SQL запрос на очистку событий|SQL запросы для удаления событий]] и содержит необходимые команды для удаления событий.|
===== Перечень объектов =====
--- //[[admin@artonit.ru|Бухаров А.В.]] 2019/06/17 08:58//
^№ п/п^Название^IP адрес^Логин^Пароль^Версия БД^Версия Сити^
|1|Дххххххх|192.168.222.1|ХХХ| |
|2|Фххх|192.168.230.9| СКД | |
|3|Вххххх| 192.168.230.5|Восток| |
|4|Рххххххххх|192.168.183.200|Артсек| |
|5|Дхххххх|192.168.222.1|Administrator|
|6|Шххххххх|192.168.230.4|administrator|||1.2.5|
|7|Зххххххх|192.168.23.119|Запад|||1.2.5|
==== Комплект сервисных программ ====
^№ п/п^Сервис, программа^ Объект ^^^^^
^:::^:::^Доминион^Резиденция^Лайнер Восток^Шуваловский^Балчуг^Фьюжн
|1|Автоматический бэкап базы данных|Нет.\\ --- //[[admin@artonit.ru|Бухаров А.В.]] 2019/06/18 08:56// |Есть, в папку C:\service.\\ --- //[[admin@artonit.ru|Бухаров А.В.]] 2019/06/18 08:49//|
|2|Сбор статистики по контроллерам| Есть, сбор данных разделен по типам контроллеров (Адемант и Артонит)\\ --- //[[admin@artonit.ru|Бухаров А.В.]] 2019/06/18 08:58//|Есть, проверен\\ --- //[[admin@artonit.ru|Бухаров А.В.]] 2019/06/18 08:46// --- |-|Есть, проверен --- //[[admin@artonit.ru|Бухаров А.В.]] 10.03.2020 23:51//|
|3|Автоматическое удаление неизвестного идентификатора|Нет\\ --- //[[admin@artonit.ru|Бухаров А.В.]] 2019/06/21 14:01//|Есть|
|4|{{ :uni:city_1_2_5.zip |Панель управления Артонит Сити вер. 1.2.5}}|
|5|AServer|1.2.0.27|1.2.0.27|
==== Версии БД и их состояние на объектах====
--- //[[admin@artonit.ru|Бухаров А.В.]] 2019/06/17 09:04//
БД СКУД не имеют версий. Есть отличительные признаки доработок, которые я излагаю ниже.
^№ п/п^Версия^Краткая характеристика^Резиденция^
|1|Базовая Артонит 10|Имеются таблица ZKSOFT_FP_TAMPLATE для хранения отпечатков пальца |Есть\\ //[[admin@artonit.ru|Бухаров А.В.]] 2019/06/18//|
|2| Артонит Сити| Имеются таблицы с характерным началом ss_.|Есть\\ //[[admin@artonit.ru|Бухаров А.В.]] 2019/06/18//|
|3| Статистика| Имеются таблицы с названием st_. \\ Запуск скрипта сбора статистики установлен в шедулер.\\ C:\xampp\curl.exe -L http://127.0.0.1/city/task/stat_device|Есть\\ Есть (был с ошибкой)\\ //[[admin@artonit.ru|Бухаров А.В.]] 2019/06/18//|
|4| Разделение идентификаторов, работа с ГРЗ| [[uni:#Данные таблицы CARDTYPE|CARDTYPE]],\\ DEVTYPE_CARDTYPE|Есть\\ Есть\\ --- //[[admin@artonit.ru|Бухаров А.В.]] 2019/06/18//|
|5| Дабавлена аналитика событий| В таблицу events добавлено поле analit.\\ В базу данных добавлена процедура EVENT_ANALIT. ALTER TABLE EVENTS
ADD ANALIT INTEGER\\ update RDB$RELATION_FIELDS
set RDB$DESCRIPTION = 'Результат аналитики событий'
where (RDB$RELATION_NAME = 'EVENTS') and
(RDB$FIELD_NAME = 'ANALIT')
{{ :wiki:event_analit_процедура.zip |}}\\ Обновлена процедура DEVICEEVENTS_INSERT. {{ :wiki:deviceevents_insert_with_event_analit.zip |}}|Добавлена\\ Добавлена\\ Обновлена\\ --- //[[admin@artonit.ru|Бухаров А.В.]] 2019/06/19//|
|6|Удаление неизвестного идентификатора|При возникновении события 80 (Проход неизвестного идентификатора) карта автоматически ставится на удаление из всех точек прохода.\\ {{ :uni:delete_unknow_card_процедура.zip |}}\\ {{ :uni:events_del_unknow_card_trigger.zip |}}|\\ Добавлена\\ Добавлена\\ --- //[[admin@artonit.ru|Бухаров А.В.]] 2019/06/19//|
=== Данные таблицы CARDTYPE ===
INSERT INTO CARDTYPE (ID, NAME, DESCRIPTION) VALUES (1, 'RFID', 'Карта EM-marine');
INSERT INTO CARDTYPE (ID, NAME, DESCRIPTION) VALUES (2, 'FP', 'Отпечаток пальца');
INSERT INTO CARDTYPE (ID, NAME, DESCRIPTION) VALUES (3, 'ШК', 'Штрих-код');
INSERT INTO CARDTYPE (ID, NAME, DESCRIPTION) VALUES (4, 'ГРЗ', 'Государственный регистрационный знак а/м');
COMMIT WORK;
=== Данные таблицы DEVTYPE_CARDTYPE ===
INSERT INTO DEVTYPE_CARDTYPE (ID_DEVTYPE, ID_CARDTYPE, ID_DB) VALUES (1, 1, 1);
INSERT INTO DEVTYPE_CARDTYPE (ID_DEVTYPE, ID_CARDTYPE, ID_DB) VALUES (5, 4, 1);
INSERT INTO DEVTYPE_CARDTYPE (ID_DEVTYPE, ID_CARDTYPE, ID_DB) VALUES (6, 1, 1);
INSERT INTO DEVTYPE_CARDTYPE (ID_DEVTYPE, ID_CARDTYPE, ID_DB) VALUES (4, 2, 1);
INSERT INTO DEVTYPE_CARDTYPE (ID_DEVTYPE, ID_CARDTYPE, ID_DB) VALUES (4, 1, 1);
COMMIT WORK;
=== Данные таблицы DEVTYPE ===
INSERT INTO DEVTYPE (ID_DEVTYPE, ID_DB, NAME, STANDALONE) VALUES (1, 1, 'Контроллеры Артонит/Адемант', 1);
INSERT INTO DEVTYPE (ID_DEVTYPE, ID_DB, NAME, STANDALONE) VALUES (2, 1, 'Контроллеры Артонит (резерв)', 1);
INSERT INTO DEVTYPE (ID_DEVTYPE, ID_DB, NAME, STANDALONE) VALUES (3, 1, 'UHF RFID контроллеры', 1);
INSERT INTO DEVTYPE (ID_DEVTYPE, ID_DB, NAME, STANDALONE) VALUES (4, 1, 'Biomrteical', 1);
INSERT INTO DEVTYPE (ID_DEVTYPE, ID_DB, NAME, STANDALONE) VALUES (5, 1, 'Система распознавания ГРЗ', 1);
INSERT INTO DEVTYPE (ID_DEVTYPE, ID_DB, NAME, STANDALONE) VALUES (6, 1, 'Артонит в режиме он-лайн', 0);
COMMIT WORK;
== Batch-файл резервного копирования. ==
"C:\Program Files (x86)\Firebird\Firebird_1_5_6\bin\gbak.exe" -b -v -ig -g "127.0.0.1:C:\Program Files (x86)\Cardsoft\DuoSE\Access\SHIELDPRO_REST.GDB" C:\service\SHIELDPRO_REST_%date%.FBK -USER sysdba -PASSWORD temp
== Добавить поле ANALIT ==
ALTER TABLE EVENTS ADD ANALIT INTEGER
===== Обновление баз данных Артонит 10 до Артонит Сити. =====
- Обновить саму базу данных до последней версии.
- записать данные в таблицу CARDTYPE.
- записать данные в таблицу DEVTYPE_CARDTYPE.
- в таблице card всем пользователям установить категорию доступа NULL (update card set ... = null).
- Очистить содержимое таблицы cardidx.
- Очистить содержимое таблицы cardindev.
База обновлена и готова к проверке и последующему использованию по назначению.
== Удаление всех событий старше заданного количества дней. ==
Удаление - процесс опасный, поэтому я привожу пример select.\\ При необходимости удаления следует select * заменить на delete.
select * from events e
where e.datetime>CURRENT_DATE-2
либо
select * from events e where e.datetime >DATE'today' - 2
===== Удаление указанных событий старше заданного количества дней. =====
9.08.2019
В ходе работы база данных быстро пополняется событиями, что приводит к росту размера базы данных. Большое количество событий в таблице events может приводить к замедлению вставки событий, получаемых от АСервера.
Для автоматизации контроля размера базы данных я предлагаю следующий алгоритм:
- Ввести типизацию событий, для каждого типа указать срок хранения,
- Административно определить какое событие к какому типу относится,
- подготовить необходимые SQL запросы, чтобы обеспечить удаление событий в соответствии с определенной политикой,
- в Назначение задания внести необходимые настройки, чтобы сформированные запросы запускались ежедневно в начале суток.
==== Типы данных====
^№ п/п^Назначение^Срок хранения^
|1|Оперативный анализ|14|
|2|Данные для отчетов|45|
|3|Важные данные|60|
==== Типы событий: ====
^Код события^Название события^Оперативный анализ^Данные для отчетов^Важные данные^
|0|неизвестное событие|+|
|17|добавлена карточка||+|
|18|удалена карточка||+|
|19|изменены параметры карточки||+|
|32|добавлен новый сотрудник||+|
|33|удален сотрудник||+|
|34|изменены данные сотрудника||+|
|46|неизвестная карточка|+|
|49|дверь открыта кнопкой|+|
|50|действительная карточка|||+|
|51|дверь открыта пользователем||+|
|52|дверь открыта всегда|||+|
|55|дверь закрыта всегда|||+|
|56|дверь разблокирована|||+|
|65|недействительная карточка|||+|
==== SQL запросы для удаления событий ====
=== Удаление событий для оперативных отчетов ===
Удаление указанных событий старше 30 дней
delete from events e
where e.datetime < CURRENT_DATE-14
and e.id_eventtype in (0, 46, 49)
=== Удаление событий для отчетов ===
Удаление указанных событий старше 30 дней
delete from events e
where e.datetime < CURRENT_DATE-45
and e.id_eventtype in (17, 18, 19, 32, 33, 34, 51)
=== Удаление важных данных ===
Удаление указанных событий старше 30 дней
delete from events e
where e.datetime < CURRENT_DATE-60
=== Единый SQL запрос на очистку событий и сбора статистики. ===
--- //[[admin@artonit.ru|Бухаров А.В.]] 28.02.2020 08:51//\\ Т.к. в результате нам требуется выполнение всех запросов за один раз, то резонно их собрать в одном файле.\\ Для анализа состояния базы данных хорошо бы знать и количество событий в журнале, и их распределение по событиями. Все это реализуется в одном файле (см. ниже).\\ В лог-файле будет отображено время и окончания работы скрипта, количество событий после удаления событий и статистика по событиям:
delete from events e
where e.datetime < CURRENT_DATE-45;
commit;;
delete from events e where e.datetime < CURRENT_DATE-5 and e.id_eventtype in (0, 46, 49, 53, 54, 57, 58);
commit;;
delete from events e where e.datetime < CURRENT_DATE-5 and e.id_eventtype in (17, 18, 19, 32, 33, 34, 51);
commit;;
select count (*) from events;
commit;;
select distinct e.id_eventtype, et.name, count(e.id_event) from events e
join eventtype et on et.id_eventtype=e.id_eventtype
group by e.id_eventtype, et.name ;
commit;;
select distinct e.analit, count (*) from events e
where e.analit is not null
and e.datetime> CURRENT_TIMESTAMP-1
group by e.analit;
commit;;
===== Статистика событий =====
Вывод информации о типах событий и их количество в базе данных.
select distinct e.id_eventtype, et.name, count(e.id_event) from events e
join eventtype et on et.id_eventtype=e.id_eventtype
group by e.id_eventtype, et.name
===== Запрет удаления администратора. =====
Для запрета удаления пользователя **Администратор** необходимо выполнить указанный ниже скрипт.
/******************************************************************************/
/*** Generated by IBExpert 06.03.2020 16:28:50 ***/
/******************************************************************************/
SET SQL DIALECT 3;
SET NAMES WIN1251;
SET TERM ^ ;
CREATE TRIGGER PEOPLE_MET_DELETE_ADMIN FOR PEOPLE
ACTIVE BEFORE DELETE POSITION 0
AS
begin
if (old.id_pep = 1) then exception deletenotallowed;
end
^
SET TERM ; ^