powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Заархивировать открытый DBF
15 сообщений из 15, страница 1 из 1
Заархивировать открытый DBF
    #33426262
Max4
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как-то здесь поднимал похожую тему, тогда мне посоветовали архивировать открытый dbf архиватором arj.
Верно, в отличие от зипа он архивирует. Сколько времени проблем не было.
Поясню, архивировать должно в реальном времени каждый час.
Но сейчас возникли затруднения.
Дело в том, что архивируемые файла могут чиститься pack или zap.
А вот именно такие почищенные файлы уже и не заархивируешь.
Что делать?
Фишка в том, что нужно любым способом все имеюшиеся DBF файлы вместе с индексами заархивировать. Или переписать в другую директорию.
Однако на переписать, открытые эксклюзивно не идут.
Горю! Спасайте!
...
Рейтинг: 0 / 0
Заархивировать открытый DBF
    #33426323
kdanylo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не открывайте эксклюзивно. Никогда.
...
Рейтинг: 0 / 0
Заархивировать открытый DBF
    #33427854
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Крайне опасная стратегия архивировать таблицы, с которыми в данный момент происходит работа.

Любой архиватор упаковывает по одному файлу за раз. Это значит, что есть риск упаковать, например, уже измененный файл FPT, но все еще не измененный файл DBF (или наоборот, не помню в каком порядке они модифицируются).

Или же в одной таблице модификация завершилась, а в другой еще не началась. В результате, в архиве будет нарушена ссылочная целостность базы данных.

Т.е., в принципе, архивировать открытые таблицы можно, если они открыты в режиме Shared, но есть риск нарушить при этом целостность базы данных.


PS: если открыть в режиме Exclusive сам контейнер базы данных (DBC), то никакой другой пользователь не сможет открыть никакие таблицы из этой базы данных.

Это можно использовать как способ блокировки всех таблиц базы данных перед проведением административных действий. Например, создания резервной копии таблиц или архива.
...
Рейтинг: 0 / 0
Заархивировать открытый DBF
    #33428710
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hi ВладимирМ!

Ещё хуже, архиватор не будет считывать весь файл целиком - и вполне возможна
ситуация, когда в процесса архивирования сам dbf файл изменится - т.е. грубо
говоря "голова" будет от одного состояния, а "хвост" - от совсем другого...
Т.е. как минимум "сломается" счётчик записей из заголовка файла, но может и
более серьёзная поломка случится. В общем по любому при ТАКОМ ("горячем")
архивировании необходимо обеспечить неизменность даных - т.е. использовать
FLOCK() для блокировки...

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Заархивировать открытый DBF
    #33428732
Фотография Владимир СА
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А не лучше ли тогда закрыть БД с таблицами и произвести архивацию, а затем снова открыть и продолжить работу???
...
Рейтинг: 0 / 0
Заархивировать открытый DBF
    #33428738
w3d_home
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Max4Поясню, архивировать должно в реальном времени каждый час.

ИМХО, в таком случае это надо делать из самой программы, т.к. в ином случае есть возможность огрести кучу проблем (см. предыдущие посты).

Еще, может имеет смысл как-то по другому организовать бакап?
...
Рейтинг: 0 / 0
Заархивировать открытый DBF
    #33429211
Max4
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
И как тогда производить архивирвание?
Допустим, открыт formset, где имеются штук 15 таблиц, оперетор ведет работу. Наспупает час "00". По этому времени срабатывает таймер, который и запускает архивирование с помощью ARJ. В течение минуты таймер проверяет создан ли архив на этот час. Если нет, то архивирует.
Предположим, я создам форму с предупреждением, где есть кнопка переключиться в работу formset, чтобы завершить его работу и кнопка продолжить архивирование.
Но не усложнит ли это работу пользователям? И время для создания архива тогда надо увеличивать, дабы пользователь мог все завершить.

Или вытягивать все запросами select * (для всех таблиц) в отдельные файлы, исключая удаленные строки WHERE DELETED() = .f.?
Так пройдет? При восстановлении индексы и переустановить можно.
Так будет верно работать или тоже есть ньюансы?

Открывать не эксклюзивно не могу, должна же чистка хоть иногда работать.


Есть еще варианты?
...
Рейтинг: 0 / 0
Заархивировать открытый DBF
    #33429213
Max4
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Igor Korolyov
... архивировании необходимо обеспечить неизменность даных - т.е. использовать
FLOCK() для блокировки...
Posted via ActualForum NNTP Server 1.3

А если файл открыт эксклюзивно, как я его блокирую из другой формы?
...
Рейтинг: 0 / 0
Заархивировать открытый DBF
    #33429219
Max4
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Владимир САА не лучше ли тогда закрыть БД с таблицами и произвести архивацию, а затем снова открыть и продолжить работу???
Нет, одно из условий, чтоб оператора не сильно заморачивать.
У него работы с клиентами валом, к тому же многие из них с компьютером на "Вы".
Ему нужно минимум кнопочек нажимать. И думать над этим поменьше, какую нажать. Контингент работающих половина - женщины предпенсионного возраста (не в обиду всем, разные есть).
...
Рейтинг: 0 / 0
Заархивировать открытый DBF
    #33429254
Oopyr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
lcTable = "Table2Archive"
lcFile = "X:\Prepare4Backup\" + lcTable
SELECT (lcTable)
SET DELETED OFF
COPY TO (lcFile) WITH CDX
ArchiveTable(lcFile)

PROCEDURE ArchiveTable
LPARAMETERS tcFile
IF FILE(tcFile + ".FPT")
    ArchiveFile(tcFile + ".FPT")
ENDIF
IF FILE(tcFile + ".CDX")
    ArchiveFile(tcFile + ".CDX")
ENDIF
IF FILE(tcFile + ".DBF")
    ArchiveFile(tcFile + ".DBF")
ENDIF
ENDPROC
...
Рейтинг: 0 / 0
Заархивировать открытый DBF
    #33429440
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hi Oopyr!

Ну и ещё желательно сделать настройку SET LOCK ON - чтобы за время
копирования таблицы через COPY TO не произошло её изменения (в смысле не из
самой этой программы, т.к. в фоксе команды выполняются всегда
последовательно, а из других программ. работающих с этой таблицей)...
Конечно если надо сохранять СОГЛАСОВАННЫЕ таблицы (т.е. не одну, а несколько
логически связанных таблиц) - то только ручной блокировкой ВСЕХ таблиц перед
началом их копирования и можно решить задачу.

2 Max4 - нет решительно ни одной веской причины в РАБОЧЕЙ программе
открывать таблицу эксклюзивно. Это может делать отдельная административная
программа, которая во время неактивности системы (ночью, на выходных и т.п.)
будет выполнять обслуживание базы - паковку там, переиндексацию и т.п.

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Заархивировать открытый DBF
    #33429447
Фотография Владимир СА
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Почему такое жесткое условие:
Max4...Поясню, архивировать должно в реальном времени каждый час.Хотя бы в обед или технологические перерывы??? Может пересмотреть это место?
...
Рейтинг: 0 / 0
Заархивировать открытый DBF
    #33429672
Max4
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть там одна закавыка. Работвют несколько таблиц, в которые закачиваются поступающие постоянно текстовые справки. Есть еще другой постоянно работающий таймер, который по мере поступления этих справок обрабатывает из, и информацию с них сажает в соответствующие таблицы. Может, и глупо в свое время написал, но предварительно перед закачкой в них текстового файла для дальнейшей обработки, они ощищаются, так же как и таблицы, в которые садится инфа с них после обработки.
Тогда получается их, может, вообще не архивировать? А держать чистыми вместе с запасными CDX, и при восстановлении архива брать оттуда?

Насчет того, что выше писал: "Или вытягивать все запросами select * (для всех таблиц) в отдельные файлы, исключая удаленные строки WHERE DELETED() = .f.?" - будет все же работать или тоже может быть нарушена целостность?
...
Рейтинг: 0 / 0
Заархивировать открытый DBF
    #33431842
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hi Max4!

> Тогда получается их, может, вообще не архивировать?

Ну если они временные, то наверное смысла их архивировать нет никакого :)

> Насчет того, что выше писал: "Или вытягивать все запросами select * (для
> всех таблиц) в отдельные файлы, исключая удаленные строки WHERE DELETED()
> = .f.?" - будет все же работать или тоже может быть нарушена целостность?

Будет работать, если на время "вытягивания" обеспечить незыблемость данных -
т.е. залочить ВСЕ связанные таблицы. А уж SELECT это будет, COPY TO, или
непосредственно архивирование "открытого" файла - принципиального значения
не имеет.

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Заархивировать открытый DBF
    #33434708
Max4
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Временные-то не нужны для особого архивирования, то таблиц много, поэтому даю "архивировать все dbf, ftp", соответственно разахивирую тоже все.
А тут-то и получается, что те, что "зиповались" либо нет в архиве, либо они бракованные.
Но если select будет работать без изъянов (для ВСЕХ связанных таблиц), то это самый приемлемый вариант.
Потом просто переиндексировать их надо будет и все.
На случай порчи же временных, их буду ворвращать из чистых.
На моей практике был случай порчи обычного простого dbf без всяких индексов и ftp. Видимо в момент записи машина сбойнула (возножно отключали энергию, точно не знаю). Но когда я пришел он был нулевой (длина), а там и архивирования кикакого не было, простая запись в него даже без чистки,(pack,zip) и все.
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Заархивировать открытый DBF
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]