Однажды после очередного обновления в Medoc при заполнении данных контрагента из справочника возникла ошибка, меня попросили разобраться, это оказался баг, патч мне прислала поддержка Medoc и через пару дней выложили обновление для других пользователей, но пока я искал причину, обнаружил что в базе данных есть ошибки.
Также в планировщике заданий было задание создавать архив программы еженедельно, но со снятой галочкой «проверка базы», я также проверил архивы программы за предыдущие месяцы и обнаружил что ошибок в них ставало меньше, то есть ошибки возникли давно.
Firebird имеет утилиты для проверки базы и резервного копирования, по этому я воспользовался ими, но сначала сделал копию файла базы данных ZVIT-Copy.FDB, потом открыл командную строку и перешел в директорию с утилитами:
D:
cd D:\Program Files\Medoc\MedocSRV\Firebird_M\
Запустил проверку копии файла базы данных:
gfix.exe -v -full -user SYSDBA -password masterkey "D:\Program Files\Medoc\MedocSRV\ixnfo.com\db\ZVIT-Copy.FDB"
По сути ошибки отображаются те же что и при создании архива программы с проверкой базы.
Создал резервную копию:
gbak -b -user SYSDBA -password masterkey "D:\Program Files\Medoc\MedocSRV\ixnfo.com\db\ZVIT-Copy.FDB" D:\backup.fbk
Восстановил из резервной копии:
gbak -c -user SYSDBA -password masterkey D:\backup.fbk D:\newzvit.fdb
При восстановлении пересоздаются индексы, удаляются поврежденные страницы и мусор, то есть пересоздается база данных, при этом процессе уже не будет никаких ошибок в базе так как поврежденных данных уже не будет, на всякий случай я оставил копию оригинального файла ZVIT.FDB, на случай если пропадут важные данные. Файл занимал около 5 гигабай и после восстановления уменьшился на 130 мегабайт.
Теперь осталось остановить два сервиса Firebird Server + ZvitGrp и файл рабочей базы ZVIT.FDB заменить отремонтированным файлом newzvit.fdb, после этого снова запустить сервисы.
services.msc
После этого ошибок уже не было и в планировщике заданий я также отметил галочкой проверять базу при создании архива программы. Если будут ошибки то архив программы не будет создан, вместо него будет пустой файл. У меня синхронизируются локальные резервные копии Medoc на отдельный сервер с бэкапами и там это будет заметно, можно также сделать скрипт который сообщит о появлении архива маленького размера.