Внешняя таблица как лог изменений в БД

Запросы, планы, оптимизация запросов, ...

Модераторы: kdv, CyberMax

Ответить
DmiSbr
Сообщения: 7
Зарегистрирован: 22 мар 2010, 13:03

Внешняя таблица как лог изменений в БД

Сообщение DmiSbr » 15 сен 2010, 07:22

Доброго всем утра !
Есть небольшая база на три рабочих места. Содержит одну основную таблицу и несколько вспомогательных справочников. Работа пользователей сводится к вводу данных в основную таблицу. И вот уже второй раз происходит следующая неприятность: при выключении питания компьютера база ломается, а точнее портится основная таблица. Восстановить БД удается, но теряются последние введенные данные (текущего дня). Есть мысль использовать внешнюю таблицу для дополнительного сохранения введенных данных за текущий день. Делать вставку/редактирование можно триггерами основной таблицы. Однако есть вопрос: что произойдет с внешней таблицей при такого рода сбое ? Сохранятся ли уже добавленные данные ?
Заранее спасибо.

Windows XP, Yaffil 891

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Re: Внешняя таблица как лог изменений в БД

Сообщение kdv » 15 сен 2010, 11:04

1. проверить, включено ли в базе forced writes. должно быть ON
2. купить ups
3. делать периодически бэкап, думаю, что база небольшая

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

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Re: Внешняя таблица как лог изменений в БД

Сообщение Dimitry Sibiryakov » 15 сен 2010, 13:53

И не забыть научить, наконец, пользователей не выдёргивать его сразу из розетки, а предварительно использовать меню "Пуск" - "Выключить компьютер".

DmiSbr
Сообщения: 7
Зарегистрирован: 22 мар 2010, 13:03

Re: Внешняя таблица как лог изменений в БД

Сообщение DmiSbr » 16 сен 2010, 07:01

2 kdv
>> 1. проверить, включено ли в базе forced writes. должно быть ON
включено
>> 2. купить ups
UPS есть. Элементарно вышел из строя, вырубился, соответсвенно вырубился копм
>> делать периодически бэкап, думаю, что база небольшая
Бэкап делается раз в неделю. Можно настроить на ежедневный бэкап, не вопрос. Теряются введенные данные за день, как спасать их.
Иногда за день до тысячи операций. Напряжно вводить их заново.
>> Все остальные идеи, типа лога во внешнюю таблицу для исправления ситуации с вот такими сбоями - ужасный ужас.
Ничего другого пока не придумал. Можно вести лог операций из программы, на каждом рабочем месте. Но тогда придется писать программу для сливания логов с трех машин, анализировть порядок выполнения операций вставки/редактирования/удаления.

2 Dimitry Sibiryakov
>> И не забыть научить, наконец, пользователей не выдёргивать его сразу из розетки, а предварительно использовать меню "Пуск" - "Выключить компьютер".
Это конечно тоже. Обещал "выпороть" каждого, кто посмеет так поступить. Но все же нужна защита от "дурака".

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Re: Внешняя таблица как лог изменений в БД

Сообщение Dimitry Sibiryakov » 16 сен 2010, 14:15

Вот с этого и надо было начинать: "после аварийного выключения компьютера теряются введённые данные за последний день". Теперь не нужно быть Хаузом чтобы поставить диагноз: база с расширением GDB. Переименуйте и будет вам счастье.

DmiSbr
Сообщения: 7
Зарегистрирован: 22 мар 2010, 13:03

Re: Внешняя таблица как лог изменений в БД

Сообщение DmiSbr » 16 сен 2010, 20:31

2 Dimitry Sibiryakov
> Теперь не нужно быть Хаузом чтобы поставить диагноз: база с расширением GDB. Переименуйте и будет вам счастье.
А можно поподробнее, честно говоря не понял о чем это

DmiSbr
Сообщения: 7
Зарегистрирован: 22 мар 2010, 13:03

Re: Внешняя таблица как лог изменений в БД

Сообщение DmiSbr » 16 сен 2010, 20:58

Ну и сам себе отвечу. Вот нашел, может кому пригодится
...
Дело в том что WindosXP считает файлы с расширением *.gdb - системными
и делает им резервное копирвание, а в случае сбоя системы восстанавливает
эти системные файлы, то есть существует вариант когда Windows поднимет
старый файл баз данных, что никому не нужно.
...
ну и далее вот тут http://libro.0pk.ru/viewtopic.php?id=2

DmiSbr
Сообщения: 7
Зарегистрирован: 22 мар 2010, 13:03

Re: Внешняя таблица как лог изменений в БД

Сообщение DmiSbr » 17 сен 2010, 12:57

И все же хочется знать, как ведет себя внешняя таблица в случаях резкого выключения питания.
Может кто знает ?

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Re: Внешняя таблица как лог изменений в БД

Сообщение kdv » 17 сен 2010, 14:18

Вот нашел, может кому пригодится
а искать надо было в FAQ по IB/FB:
http://www.ibase.ru/ibfaq.htm#xp
хочется знать, как ведет себя внешняя таблица в случаях резкого выключения питания.
Firebird записывает данные в файл, на самом деле запись кэшируется операционной системой, а потом диском. Поэтому Вам никто не предскажет, как себя поведет кэш Windows и кэш диска. Результат будет зависеть от момента выключения и где в это время находятся данные.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Re: Внешняя таблица как лог изменений в БД

Сообщение kdv » 17 сен 2010, 16:48

Вот и максимально точный ответ на Ваш вопрос
http://www.sql.ru/forum/actualthread.as ... 05#9458350

То есть, если бы сервер после каждой записи вызывал операцию flush для внешней таблицы, то тогда еще можно было бы как-то гарантировать ее максимальную актуальность при неожиданном выключении питания. А так - нет, гарантировать нельзя. Но все же, это не "суточная" потеря данных.

Собственно, Вам еще повезло, с потерей данных за 1 день, т.к. Вы этот компьютер, похоже, включаете и выключаете каждый день. Если бы Вы его включали или перезагружали раз в неделю или месяц, то тогда из-за System Restore потеряли бы много больше данных. и восстанавливать их пришлось бы из бэкапа недельной давности.

В общем, у Вас теперь много поводов для размышлений о правильном организации резервного копирования :-)

DmiSbr
Сообщения: 7
Зарегистрирован: 22 мар 2010, 13:03

Re: Внешняя таблица как лог изменений в БД

Сообщение DmiSbr » 18 сен 2010, 07:48

2 kdv
а искать надо было в FAQ по IB/FB:
...а счастье было близко..
Вот и максимально точный ответ на Ваш вопрос
....Действительно, внешняя таблица не тот случай.
Собственно, Вам еще повезло, с потерей данных за 1 день, т.к. Вы этот компьютер, похоже, включаете и выключаете каждый день...
Собственно так оно и есть
.... и восстанавливать их пришлось бы из бэкапа недельной давности.
Вот это как раз и не проблема. Дело в том, что ежедневно происходит выгрузка данных за день из маленьких офисов (с колличеством рабочих мест 2-3), с последующей загрузкой в общую базу в головном офисе. А там уже все серьезно, и бэкап/ресторе, и UPS на 3 КВт. А вот с операциями за день, тут да.....Потому вопрос остается актуален. Как лучше организовать логирование операций вставки/редактирования/удаления одной таблицы, для возможности быстрого восстановления?

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Re: Внешняя таблица как лог изменений в БД

Сообщение kdv » 18 сен 2010, 16:32

Как лучше организовать логирование операций вставки/редактирования/удаления одной таблицы, для возможности быстрого восстановления?
Что Вы имеете в виду под "быстрым восстановлением" известно только Вам, в смысле Вашей прикладной области, приложений и базы данных. То есть, делается это программно.
И "как лучше организовать" - тоже странный вопрос. Вот есть таблица, есть триггер, есть внешняя таблица.
Только, избавившись от расширения gdb, о каком именно "быстром восстановлении" идет речь? Данные то "за сутки" не будут пропадать.

hvlad
Разработчик Firebird
Сообщения: 1244
Зарегистрирован: 21 мар 2005, 10:48

Re: Внешняя таблица как лог изменений в БД

Сообщение hvlad » 18 сен 2010, 17:35

DmiSbr писал(а):Теряются введенные данные за день, как спасать их.
Иногда за день до тысячи операций. Напряжно вводить их заново.
Если при потере питания теряются все записи, введённые за день (с момента последнего запуска программы ?), и FW=ON, то остаётся только одно - научитья делать commit до выхода из программы.

DmiSbr
Сообщения: 7
Зарегистрирован: 22 мар 2010, 13:03

Re: Внешняя таблица как лог изменений в БД

Сообщение DmiSbr » 18 сен 2010, 18:50

Огромное всем спасибо за помощь.
Базу переименовал.
С внешней таблицей проведу эксперимент.
Если получитьяс интересный результат, отпишусь.

Ответить