powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Архивация БД - все или часть?
15 сообщений из 15, страница 1 из 1
Архивация БД - все или часть?
    #33574607
Лисонька
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Леди и джентльмены!
Сделала, наконец-то, в проекте пункт меню Архивация данных - для папки с базой данных и таблицами. Указываю на все файлы *.* Все бы ничего, но RAR пакует лишь таблицы, индексы и memo, а на файлы .dbc, .dct и .dcx выдает, что они заняты системой (извините, пишу по памяти, под рукой проекта сейчас нет). Пришлось конкретизировать RAR'у, чтобы он работал лишь с dbf, cdx и fpt. Отсюда 2 вопроса:
1. А нужно ли вообще архивировать dbc, dct и dcx файлы?
2. Если нужно, то писать отдельную программку-утилитку вне проекта?
Благодарю
...
Рейтинг: 0 / 0
Архивация БД - все или часть?
    #33574892
Фотография FM32YO aka KID
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
cArjFileDestination = ProgramPath + "\arj32.exe"

IF !FILE(cArjFileDestination)
	cNoArjHere = 'Àðõ³âàòîð ' + cArjFileDestination + ' â³äñóòí³é!'
	DO FORM &Main_path\forms\Messager.scx WITH cNoArjHere
ELSE
	DECLARE INTEGER ShellExecute IN SHELL32.DLL ;   
		  INTEGER nWinHandle, ;   
		  STRING cOperation, ;   
		  STRING cFileName, ;   
		  STRING cParameters, ;   
		  STRING cDirectory, ;   
		  INTEGER nShowWindow   
		cArchiveName = ALLTRIM(STR(DAY(DATE()))) + "-" + ALLTRIM(STR(MONTH(DATE()))) + "-" + ALLTRIM(STR(YEAR(DATE()))) && + ;
ALLTRIM(STR(minute(datetime()))) + "-" + ALLTRIM(STR(sec(datetime())))
		cWhatToArchivate = DataBasePath  

		=ShellExecute( 0 ,"Open", cArjFileDestination,"a -e " + cArchiveName + " " + cWhatToArchivate + "*.*","",- 1 ) 
		cResultArchive = ProgramPath + '\' + cArchiveName + '.arj'
		
		WAIT WINDOW "" TIMEOUT  3    &&NOWAIT
		IF FILE(cResultArchive)

			cArjIsCreated = 'Àðõ³â ' + cResultArchive + ' ñòâîðåíî!'
			DO FORM &Main_path\forms\Messager.scx WITH cArjIsCreated

		ENDIF
ENDIF

...
Рейтинг: 0 / 0
Архивация БД - все или часть?
    #33575140
karly™
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
1. Архивировать лучше все. Можно не архивировать индексные файлы, при условии, что у тебя есть процедура, восстанавливающая индексы.

2. RAR не может архивировать файлы, если они открыты экслюзивно. Т.е. надо либо дать команду Close Databases All, либо открывать БД неэксклюзивно, а в RAR-е поставить галочку Open shared files.
...
Рейтинг: 0 / 0
Архивация БД - все или часть?
    #33575327
Лисонька
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, я поняла. Использовать ключ -dh. Завтра попробую в проекте.
...
Рейтинг: 0 / 0
Архивация БД - все или часть?
    #33575419
Urri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Объясните мне, пожалуйста.
Какова гарантия, что при архивировании открытых другими пользователями (или процессами) файлов БД они заархивируются в целостном, консистентном состоянии, и все их содержимое будет затем правильно сопрягаться со всеми другими файлами, с которыми они могут быть в отношениях (dbf-dbf, dbf-cdx, dbf-fpt)? Как избежать непротиворечивости в бэкапе, не обеспечив закрытие всех файлов всеми пользователями на весь период бэкапа?

Или я не понял того, что программа однопользовательская? Но и в этом случае остается вопрос: все ли буферы сброшены на диск к началу архивирования (как это ни нереально, теоретически неполный сброс буфера возможен - или, все-таки, нет)?
...
Рейтинг: 0 / 0
Архивация БД - все или часть?
    #33575422
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Раз вопрос возник, занчит нужны пояснения

Сначала по поводу того, нужно ли копировать контейнер базы данных (DBC, DCT, DCX).

Контейнер базы данных содержит часть информации по структуре самих таблиц (например, длинные имена полей - более 10 символов) и все процедуры взаимодействия таблиц (постоянные связи, триггера, правила, значения по умолчанию и т.п.).

Кроме того, сами таблицы содержат ссылку на контейнер базы данных.

Т.е. получаются взаимные ссылки: таблицы на контейнер, а контейнер на таблицы.

Это значит, что открыть таблицы без контейнера не нарушая структуры данных - не получится. Как следствие, контейнер базы данных необходимо сохранять вместе с таблицами.

Теперь вопрос собственно по архивированию.

На самом деле, нужно не столько архивирование, сколько создание резервной копии. Т.е. вполне достаточно скопировать всю базу данных в отдельный каталог. Желательно, на другой машине или хотя бы на другом винчестере (другой железке). Арихивирование - это просто вопрос экономии физического места на диске. Можно делать, но не обязательно.

Сложность заключается в самой технологии создания резервной копии.

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

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

Теперь можно спокойно скопировать все таблицы.

После этого можно переключить контейнер базы данных в режим Shared и скопировать его средствами, например, FileSystemObject. Он позволяет копировать файлы, открытые в режиме Shared.
...
Рейтинг: 0 / 0
Архивация БД - все или часть?
    #33575501
Фотография Владимир СА
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лисонька...Сделала, наконец-то, в проекте пункт меню Архивация данных - для папки с базой данных и таблицами. Указываю на все файлы *.* Все бы ничего, но RAR пакует лишь таблицы, индексы и memo, а на файлы .dbc, .dct и .dcx выдает, что они заняты системой (извините, пишу по памяти, под рукой проекта сейчас нет)....
У меня лично стоит вот такой код на событие Click кнопки архивирование, и работает и остаюсь в приложении как в EXE-ке, так и в самом VFP.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
IF FILE("FILEVIEW01.VUE")  
    DELETE FILE FILEVIEW01.VUE  
ENDIF  
CREATE VIEW FILEVIEW01  
    
LOCAL m.c_archiv, m.c_path_winrar, m.c_path_dbf, m.c_path_arch, m.c_gd  
m.c_archiv = '! /N '		&& Формирование командной строки для запуска архиватора  
m.c_path_winrar = TRIM(T_setting.P_winrar)  && Путь к WinRar.exe  
m.c_path_dbf = TRIM(T_setting.P_dbf)  && В этой дирректории у меня лежат файлы для архивации  
m.c_path_arch = TRIM(T_setting.P_arch)  && Путь куда положить архив  
m.c_gd = STR(T_setting.Ych_gd, 4 )  && Для формирования имени архива,   
                                           && тут можно придумать более сложную модель.  
    
CLOSE DATABASES ALL  
m.c_archiv = m.c_archiv + m.c_path_winrar + ' u -ep ' + ;  
                 m.c_path_arch + 'Ord_'+m.c_gd + ' ' + m.c_path_dbf + '*.*'  
&c_archiv  && Выполнение WinRar  
    
WAIT WINDOW "Подождите пока идет архивирование!" TIMEOUT  10   
 * Поставил  10  сек на всю архивацию, хотя можно придумать более изощренное что-то  
    
SET VIEW TO FILEVIEW01
И получаю файл Ord_2005.rar
...
Рейтинг: 0 / 0
Архивация БД - все или часть?
    #33575758
Лисонька
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ура! Поняла, почему, как я ни старалась, файлы самой базы RAR никак не желал архивировать. Я запускала приложение прямо из редактора проекта. А вот через EXE все проходит нормально.
Ну на счет других пользователей - то можно сделать защиту, где-то на форуме был топик, как проверить, работает ли кто с базой или нет. А вот на счет буферизации и потери из за этого данных... CLOSE DATEBASE ALL не спасет от потери информации?
...
Рейтинг: 0 / 0
Архивация БД - все или часть?
    #33575884
Фотография Владимир СА
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лисонька...Ну на счет других пользователей - то можно сделать защиту, где-то на форуме был топик, как проверить, работает ли кто с базой или нет....Если у тебя файл-серверное приложение, то по-моему архивацию надо запускать при условии, что никто не работает с БД, а это, по-моему, вне рабочее время.
...
Рейтинг: 0 / 0
Архивация БД - все или часть?
    #33577493
Лисонька
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир САЕсли у тебя файл-серверное приложение, то по-моему архивацию надо запускать при условии, что никто не работает с БД, а это, по-моему, вне рабочее время.
Нет, Вы немного не поняли моего последнего вопроса. Как заметил уважаемый Urri, что делать с буфером, как перевести из него все содержащиеся данные на винт? Думаю, что одной команды CLOSE DATABASE здесь будет недостаточно. Как можно быть в полной уверенности, что архивация (или просто создание резервной копии файлов) пройдет корректно и сохранится вся необходимая информация?
...
Рейтинг: 0 / 0
Архивация БД - все или часть?
    #33577515
Фотография Владимир СА
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лисонька...что делать с буфером, как перевести из него все содержащиеся данные на винт? Думаю, что одной команды CLOSE DATABASE здесь будет недостаточно. Как можно быть в полной уверенности, что архивация (или просто создание резервной копии файлов) пройдет корректно и сохранится вся необходимая информация?Может я как раз и не понял. Но если у вас локальное приложение, то CLOSE DATABASE ALL закроет все таблицы, сбросив предварительно буферы (если они были организованы), и закроет БД. А вот если задача сразу предполагалась, что будет файл-серверной, то как я писал выше: "...по-моему архивацию надо запускать при условии, что никто не работает с БД, а это, по-моему, вне рабочее время".
...
Рейтинг: 0 / 0
Архивация БД - все или часть?
    #33577598
Лисонька
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Приложение файл-серверное. Не ахти какое, опыта у меня в этом совсем нет, но работает уже с ноября прошлого года. Вроде все нормально, я регулярно проверяю данные.
Значит, вето на работу операторов и в самом начале кода архивирования прописываю CLOSE DATEBASE.
Благодарю всех-всех-всех!

Елизавета Скрунскайте
...
Рейтинг: 0 / 0
Архивация БД - все или часть?
    #33578070
Urri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЛисонькаПриложение файл-серверное. Не ахти какое, опыта у меня в этом совсем нет, но работает уже с ноября прошлого года. Вроде все нормально, я регулярно проверяю данные.
Значит, вето на работу операторов и в самом начале кода архивирования прописываю CLOSE DATEBASE.
Благодарю всех-всех-всех!

Елизавета СкрунскайтеМожно использовать проверенный временем подход: создание в каталоге файла-флажка, увидев который ни одна из программ пользователей не позволит работать с БД. Т.е.:
1. создаете файл-флажок,
2. убеждаетесь, что с БД никто не работает (например, открыв dbc эксклюзивно),
3. если получилось, начинаете все архивировать, как у ВладимираМ написано.
4. Стираете файл-флажок.

Если не получилось - возможны варианты. Например выгнать пользователя из сети. ;-)
...
Рейтинг: 0 / 0
Архивация БД - все или часть?
    #33578373
Лисонька
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А я сейчас по-другому придумала сделать.
Хочу включить в базу еще одну табличку Usernumber с единственным полем nArchiv. Значение поля по умолчанию 0. При запуске приложения на любом компьютере происходит следущее: nArchiv=nArchiv+1. При выходе nArchiv=nArchiv-1.
А при выборе пункта меню 'Архивирование данных' делаем проверку:
Код: plaintext
1.
2.
3.
4.
5.
6.
LOCAL lUser
lUser=Usernumber.nArchiv
IF lUser= 1 
** Идет код для архивации
ELSE
** Сообщение об исользовании БД одним из юзеров
ENDIF
Дома сейчас не могу все это проверить. Подскажите, совсем чушь я придумала? Стоит завтра пробовать на месте?
Благодарю
...
Рейтинг: 0 / 0
Архивация БД - все или часть?
    #33578631
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hi Лисонька!

> Дома сейчас не могу все это проверить. Подскажите, совсем чушь я
> придумала? Стоит завтра пробовать на месте?

Учти, что некорректные выходы оставят счётчик в некорректном состоянии. Так
что по нормальному надо бы запись соответствующую блокировать, а при попытке
архивирования пытаться либо "сбросить" все флаги (при этом ограничив число
попыток в SET REPROCESS и организовав отлов ошибки) либо пытаться
заблокировать таблицу - т.к. при слёте программы её блокировки снимаются
автоматически (на некоторых криво настроенных или просто кривых ОС это может
происходить с заметной задержкой, но тем не менее в конце концов блокировка
будет снята).

Что касается архивирования открытых файлов - то теоретически FLOCK() на все
таблицы должен обеспечить "непротиворечивое" состояние базы на момент
архивирования. dbc и прочие файлы самой базы можно не архивировать каждый
раз - если в приложении конечно нет кода меняющего по ходу работы структуру
таблиц, настройки коннекшенов и т.п. - т.е. если для приложения можно
спокойно открыть саму базу в режиме NOUPDATE и всё будет работать. Впрочем
для сетевой базы именно так и должна быть организована работа с базой -
единственное исключение - процедуры обновления структур - но тут уж по
любому надо всех "выгонять" и организовывать монопольный доступ к базе.

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Архивация БД - все или часть?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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