powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Копирование и обновление баз данных
17 сообщений из 17, страница 1 из 1
Копирование и обновление баз данных
    #35477732
LUCIAN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день !
Для копирования ,обновления и индексации баз данных (ночью) находящихся на сервере (20 баз)использую "Назначенные задания" из "панели управления". Для этого имеется головная программа(VFP6), которая поочередно вызывает соотв. программы копирования или обновления.В результате головная программа выдаёт протокол копирования, в котором на основании команды ON ERROR, видно успешно или нет
произошло копирование соотв.базы данных.Для копирования используется GENDBC и COPY FILE. Но,иногда копирование на каком-то шаге останавливается так,что команда ON ERROR не может процесс продолжить дальше. Одной из причин было то ,что
у GENDBC был свой ON ERROR,когда и это устранил,то некоторое время было нормально,но потом опять начались запоры как я понял индексация начала останавливать этот процесс. Всё это копирование построено в VFP6.
Вопрос:Как это избежать или как иначе организовать копирование.
Напрашивается идея: с помощью пакетного (bat)файла создать такой поток заданий,в котором запуск каждого следующего задания не зависел бы от результата предыдущего.Где найти пример такого bat-файла,возможно ли такое сделать
...
Рейтинг: 0 / 0
Копирование и обновление баз данных
    #35477762
Samvel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LUCIAN создать такой поток заданий,в котором запуск каждого следующего задания не зависел бы от результата предыдущего.
Такое я делал в фоксв, таймерами, они как раз и не "мешают друг-другу"
...
Рейтинг: 0 / 0
Копирование и обновление баз данных
    #35477767
Sergey Sizov.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
LUCIANВопрос:Как это избежать или как иначе организовать копирование.
Казимирыч, для того, чтобы определить "иначе" надо знать что есть сейчас.

Напрашивается идея: с помощью пакетного (bat)файла создать такой поток заданий,в котором запуск каждого следующего задания не зависел бы от результата предыдущего.Где найти пример такого bat-файла,возможно ли такое сделать
Какого такого? Который копирует во время переиндексации? И зачем тебе нужна полупроиндексированная копия?
Может таки лучше займемся поисками причин остановки? Может таки начнем лечит причину, а не пытаться обойти околными путями?
...
Рейтинг: 0 / 0
Копирование и обновление баз данных
    #35477803
LUCIAN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Samvel LUCIAN создать такой поток заданий,в котором запуск каждого следующего задания не зависел бы от результата предыдущего.
Такое я делал в фоксв, таймерами, они как раз и не "мешают друг-другу"
Спасибо, какая схема этой идеи ?
Sergey SizovКакого такого? Который копирует во время переиндексации? И зачем тебе нужна полупроиндексированная копия?
Может таки лучше займемся поисками причин остановки? Может таки начнем лечит причину, а не пытаться обойти околными путями?
Алексеич перед тобой я ставил эту проблему и до сих пор ты молчал, спасибо что наконец откликнулся.
...
Рейтинг: 0 / 0
Копирование и обновление баз данных
    #35477855
LUCIAN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Sergey SizovКакого такого? Который копирует во время переиндексации? И зачем тебе нужна полупроиндексированная копия?
Схема этой работы которую я называю копированием:
1.Индексация
2.С помощью Gendbc создаётся программа-creator Dbc
3.С помощью программы-creator Dbc на другом компьютере создаётся пустая Dbc
4.С помощью COPY FILE идёт закачка данных с сервера в пустую базу
...
Рейтинг: 0 / 0
Копирование и обновление баз данных
    #35477860
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не совсем понятен смысл генерации пустой базы. Зачем вообще GENDBC?
Если нужно копирование, то копировать все включая контейнер БД.

Про живучесть базы и способы индексирования тут обсуждали

Если вопрос только в том как сделать 20 запусков последовательно чтобы один не перекрыл другой, то в BAT-файле просто напиши последовательно вызовы и запускай его:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
* Задаем рабочую папку
C:
cd \MyProg1
* Запусаем прогу  1 
MyProg1.exe

cd \MyProg2
MyProg2.exe
...
Если проге все равно какая текущая папка (или она одна для всех), то можно так
Код: plaintext
1.
2.
C:\MyProg1\MyProg1.exe
C:\MyProg2\MyProg2.exe
...
Только учти что если одна не завершится, то последующие уже не запустятся. И остановка задания убъет батник, а подвисшая прога останется.
...
Рейтинг: 0 / 0
Копирование и обновление баз данных
    #35477863
Samvel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LUCIAN Samvel LUCIAN создать такой поток заданий,в котором запуск каждого следующего задания не зависел бы от результата предыдущего.
Такое я делал в фоксв, таймерами, они как раз и не "мешают друг-другу"
Спасибо, какая схема этой идеи ?

Схема простая. Создаются несколько таймеров (столько, сколько нужно для независимых процессов) и в теле таймеров запускаются нужные команды. Естественно все команды будут выполнятся независимо друг от друга. Конечно надо учитывать замечания Sergey Sizov -а про незаконченность предыдущего процесса.
...
Рейтинг: 0 / 0
Копирование и обновление баз данных
    #35477896
LUCIAN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T Не совсем понятен смысл генерации пустой базы. Зачем вообще GENDBC?
Если нужно копирование, то копировать все включая контейнер БД.

Если копировать все включая контейнер БД , то можно скопировать уже испорченный контейнер БД.
GENDBC на испорченных контейнерах снимается.
...
Рейтинг: 0 / 0
Копирование и обновление баз данных
    #35477936
LUCIAN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Samvel Конечно надо учитывать замечания Sergey Sizov-а про незаконченность предыдущего процесса.
Процесс именно так и организован , что каждое последующее не имеет смысла без предыдущего с помощью ON ERROR. Но бывают такие случаи,что ON ERROR не спасает и процесс копирования останавливается.
...
Рейтинг: 0 / 0
Копирование и обновление баз данных
    #35477938
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LUCIAN Dima T Не совсем понятен смысл генерации пустой базы. Зачем вообще GENDBC?
Если нужно копирование, то копировать все включая контейнер БД.

Если копировать все включая контейнер БД , то можно скопировать уже испорченный контейнер БД.
GENDBC на испорченных контейнерах снимается.

Все равно непонятно. Порядок такой:
LUCIANСхема этой работы которую я называю копированием:
1.Индексация
2.С помощью Gendbc создаётся программа-creator Dbc
3.С помощью программы-creator Dbc на другом компьютере создаётся пустая Dbc
4.С помощью COPY FILE идёт закачка данных с сервера в пустую базу
Если первым пунктом у тебя индексирование исходной базы, то оно не закончится корректно если контейнер битый, а если закончилось, то контейнер нормальный (и все остальное) и его можно копировать вместе с таблицами и индексами.

Ссылку смотрел? Там я пример кода индексирования показывал, в т.ч. и лечение контейнера.
...
Рейтинг: 0 / 0
Копирование и обновление баз данных
    #35477951
LUCIAN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T Если первым пунктом у тебя индексирование исходной базы, то оно не закончится корректно если контейнер битый, а если закончилось, то контейнер нормальный (и все остальное) и его можно копировать вместе с таблицами и индексами.
База данных это не только таблицы с индексами , а это ещё и представления,..
...
Рейтинг: 0 / 0
Копирование и обновление баз данных
    #35477989
Sergey Sizov.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
LUCIANАлексеич перед тобой я ставил эту проблему и до сих пор ты молчал, спасибо что наконец откликнулся.
И думаешь в присланном мне коде понятно где и, главное, почему произошло торможение и не сработал on error? У меня нет твоих баз, таблиц, дисков, серверов и всего того что на них крутится и может помешать работе. Я ж не телепат. И будь мы хоть семя пядей во лбу, но нам все равно намного труднее понят что там у тебя происходит. Искать причину в любом случае должен ты, а можем только помогать тебе советами и рекомендациями. Правда если обеспечишь нас полной и технически грамотной информацией.
...
Рейтинг: 0 / 0
Копирование и обновление баз данных
    #35478078
LUCIAN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Sergey SizovИ думаешь в присланном мне коде понятно где и, главное, почему произошло торможение и не сработал on error? У меня нет твоих баз, таблиц, дисков, серверов и всего того что на них крутится и может помешать работе. Я ж не телепат. И будь мы хоть семя пядей во лбу, но нам все равно намного труднее понят что там у тебя происходит. Искать причину в любом случае должен ты, а можем только помогать тебе советами и рекомендациями. Правда если обеспечишь нас полной и технически грамотной информацией.
"Копирование и обновление баз данных" -это у каждого каким то образом организовано .Вот Samvel поделился своим изобретением, поэтому попробую разобраться в его идее.Мне главное ,чтобы копирование следующей БД не зависело от копирования предыдущей БД. Да мне пусть все индексаци и и копирования поснимаются главно чтобы все задания отработали . Днём буду разбираться.
...
Рейтинг: 0 / 0
Копирование и обновление баз данных
    #35478257
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LUCIANБаза данных это не только таблицы с индексами , а это ещё и представления,..
Я в курсе. Еще коннекты, хранимые процедуры, в т.ч. триггеры и т.д. и т.п. И все это хранится в контейнере БД, т.е. в файлах MyBD.DBC, MyBD.DCT и MyBD.DCX
...
Рейтинг: 0 / 0
Копирование и обновление баз данных
    #35481132
LUCIAN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Для организации копирования и обновления баз данных использовал одно назначенное задание
в панели управления . Учитывая выше приведённые советы решил создать 4 одинаковые
назначенные задания в панели управления и 5-ое задание для архивирования. Эти задания
будут запускаться по расписанию:1-ое в 0-30 остальные через 2ч. т.е. в 2-30,4-30,..
Что копировать или не копировать программа решает на основании таблицы(PR_KOP-протокол
копирования) следующей структуры:

СТРУКТУРА PR_KOP

D_KOP D(8,0) && дата копир.
NZ N(2,0) && № копируемой БД
WRNAC T(8,0) && время начала копир.
WRKON T(8,0) && время оконч копир.
SOST N(1,0) && результат копирования: 0-надо копировать,1-запущено копирование,
2-копирование успешное,
3-копирование закончилось крахом

С помощью такой организации копирования предполагается ,что если 1-ое назн.задание зависло на 8-ой БД,то 2-ое задание начнёт копировать с 9-ой БД.Утром проверив протокол копирования сделаем соотв. выводы.
Такая организация копирования является более полной чем предыдущая.Можно ли лучше организовать копирование БД.

Код головной программы:

Код: 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.
30.
31.
32.
PUBLIC USPEX,KOP_D
LOCAL I,KZ
LOCAL ARRAY  APR( 22 ) 
USE C:\PROT\PR_KOP SHARED
KOP_D=DATE() && дата копир.

IF NOT SEEK(KOP_D,"PR_KOP","D_KOP") && если за эту дату не копировалось, то создаём протокол
	FOR I= 1  TO  22 
		INSERT INTO PR_KOP (D_KOP,NZ,WRNAC,WRKON,SOST) VALUES (M.KOP_D,I,DATETIME( 2001 , 1 , 1 , 0 , 0 , 0 ),DATETIME( 9999 , 12 , 31 , 23 , 59 , 59 ), 0 )
	ENDFOR	 
ENDIF
SELECT PR_KOP

COPY TO ARRAY APR FIELDS NZ FOR D_KOP=M.KOP_D AND SOST= 0 
KZ=_TALLY

FOR I= 1  TO KZ
	USPEX=.T.
	ON ERROR USPEX=.F.
	UPDATE PR_KOP SET SOST= 1 ,WRNAC=DATETIME() WHERE D_KOP=M.KOP_D AND NZ=APR(I)  && НАЧАЛО КОПИРОВАНИЯ 	USE IN PR_KOP
	PR_KOP="cop"+ltrim(str(APR(I), 2 )) && имя соотв.процедуры
	DO (PR_KOP)
	USE C:\PROT\PR_KOP SHARED
	IF USPEX
		UPDATE PR_KOP SET SOST= 2 ,WRKON=DATETIME() WHERE D_KOP=M.KOP_D AND NZ=APR(I) && КОПИРОВАНИЕ ЗАВЕРШИЛОСЬ УСПЕШНО SOST= 2 
	ELSE
		UPDATE PR_KOP SET SOST= 3 ,WRKON=DATETIME() WHERE D_KOP=M.KOP_D AND NZ=APR(I) && КОПИРОВАНИЕ ЗАВЕРШИЛОСЬ КРАХОМ SOST= 3 
	ENDIF		
ENDFOR

QUIT

Код одной из вызываемых процедур копирования:

Код: 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.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
CLOSE TABL ALL
CD F:\SBT\BAL && исходная папка на сервере
USE BAL.DBC EXCL
IF NOT USPEX
	RETURN
ENDIF
CLOSE TABL ALL

DO D:\KOPII\BALBAK\BALIND && ИНДЕКСАЦИЯ
IF NOT USPEX
	RETURN
ENDIF
*** Создание программы-creatora БД	
SET SAFETY OFF
DVFP=SYS( 2004 )
DGEN=DVFP+"TOOLS\GENDBC"
SET PATH TO &DGEN

DO GENDBC WITH "BALB"

COPY FILE BALB.PRG TO D:\KOPII\BALBAK\BALB.PRG
COPY FILE BALB.KRT TO D:\KOPII\BALBAK\BALB.KRT
COPY FILE F:\PEXE\BAL.EXE TO D:\KOPII\BALBAK\BAL.EXE
DELETE FILE BALB.PRG
DELETE FILE BALB.KRT
***********************************************
CD D:\KOPII\BALBAK && папка для копии
*** параметры для представлений
PUBLIC DATN,DATK,ZURN,ORDB,sct_ido,zur_id,SCT_ID,NSTRG,REGZ,dok_n,ZTR_ID
ZTR_ID= 50 
dok_n=padr( 1 , 10 )
REGZ=.T.
NSTRG=STR( 1 , 2 )+STR( 1 , 3 )
SCT_ID= 1 
zur_id= 1 
sct_ido= 1 
ORDB="PADL(ZURM0.ID_ZUR,18)"
ZURN="1"
DATK=DATE()
DATN=DATK-DAY(DATK)+ 1 
*** создание пустой БД
DO D:\KOPII\BALBAK\BALB.PRG
IF NOT USPEX
	RETURN
ENDIF

CLOS TABL ALL

WAIT WIND "НАПОЛНЕНИЕ БАЗЫ ДАННЫХ " NOWAIT

OPEN DATA D:\KOPII\BALBAK\BAL
LNTABLES=ADBOBJECTS(LATABLES,'TABLE')
FOR LNX= 1  TO LNTABLES
	LCTABLENAME=LATABLES(LNX)
	COPY FILE F:\SBT\BAL\&LCTABLENAME..DBF TO  D:\KOPII\BALBAK\&LCTABLENAME..DBF
	IF FILE("&LCTABLENAME..FPT")
		COPY FILE F:\SBT\BAL\&LCTABLENAME..FPT TO  D:\KOPII\BALBAK\&LCTABLENAME..FPT
	ENDIF
	IF FILE("&LCTABLENAME..CDX")
		COPY FILE F:\SBT\BAL\&LCTABLENAME..CDX TO  D:\KOPII\BALBAK\&LCTABLENAME..CDX
	ENDIF
ENDFOR
WAIT WIND " Ф И Н И Ш " NOWAIT 
...
Рейтинг: 0 / 0
Копирование и обновление баз данных
    #35481202
Sergey Sizov.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не вдаваясь пока в логику.
Вот это зачем? В смысле зачем это вычислять при каждом вызове?
LUCIAN
Код: plaintext
DATETIME( 2001 , 1 , 1 , 0 , 0 , 0 ),DATETIME( 9999 , 12 , 31 , 23 , 59 , 59 )
Не проще ли написать так:
Код: plaintext
{^ 2001 - 01 - 01   00 : 00 : 00 }, {^ 9999 - 12 - 31   23 : 59 : 59 }
?
А вот это
LUCIAN
Код: plaintext
1.
2.
3.
4.
IF USPEX
	UPDATE PR_KOP SET SOST= 2 ,WRKON=DATETIME() WHERE D_KOP=M.KOP_D AND NZ=APR(I) && КОПИРОВАНИЕ ЗАВЕРШИЛОСЬ УСПЕШНО SOST= 2 
ELSE
	UPDATE PR_KOP SET SOST= 3 ,WRKON=DATETIME() WHERE D_KOP=M.KOP_D AND NZ=APR(I) && КОПИРОВАНИЕ ЗАВЕРШИЛОСЬ КРАХОМ SOST= 3 
ENDIF

может заменить вот этим
Код: plaintext
UPDATE PR_KOP SET SOST=Iif(USPEX,  2 ,  3 ),WRKON=DATETIME() WHERE D_KOP=M.KOP_D AND NZ=APR(I)
?
Экономия в четыре(!) :) строки.

А вот это
LUCIAN
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
FOR LNX= 1  TO LNTABLES
	LCTABLENAME=LATABLES(LNX)
	COPY FILE F:\SBT\BAL\&LCTABLENAME..DBF TO  D:\KOPII\BALBAK\&LCTABLENAME..DBF
	IF FILE("&LCTABLENAME..FPT")
		COPY FILE F:\SBT\BAL\&LCTABLENAME..FPT TO  D:\KOPII\BALBAK\&LCTABLENAME..FPT
	ENDIF
	IF FILE("&LCTABLENAME..CDX")
		COPY FILE F:\SBT\BAL\&LCTABLENAME..CDX TO  D:\KOPII\BALBAK\&LCTABLENAME..CDX
	ENDIF
ENDFOR

может заменить вот этим
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
FOR LNX= 1  TO LNTABLES
	LCTABLENAME=LATABLES(LNX)
	COPY File ('F:\SBT\BAL\'+LCTABLENAME+'.DBF') TO ('D:\KOPII\BALBAK\'+LCTABLENAME+'.DBF')
	IF FILE(LCTABLENAME+'.FPT')
		COPY File ('F:\SBT\BAL\'+LCTABLENAME+'.FPT') TO ('D:\KOPII\BALBAK\'+LCTABLENAME+'.FPT')
	ENDIF
	IF FILE(LCTABLENAME+'.CDX)
		COPY File ('F:\SBT\BAL\'+LCTABLENAME+'.CDX') TO ('D:\KOPII\BALBAK\'+LCTABLENAME+'.CDX')
	ENDIF
ENDFOR
? Или разучился работать без макроподстановки? :)
...
Рейтинг: 0 / 0
Копирование и обновление баз данных
    #35481204
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В целом насколько это живуче не понятно сходу.

Тут можно без макроподстановок обойтись
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
WAIT WIND "НАПОЛНЕНИЕ БАЗЫ ДАННЫХ " NOWAIT

OPEN DATA D:\KOPII\BALBAK\BAL
FOR LNX =  1  TO ADBOBJECTS(LATABLES,'TABLE')
	LCTABLENAME=LATABLES(LNX)
	COPY FILE ('F:\SBT\BAL\' + LCTABLENAME + '.DBF') TO  ('D:\KOPII\BALBAK\' + LCTABLENAME + '.DBF')
	IF FILE('F:\SBT\BAL\' + LCTABLENAME + '.FPT')
		COPY FILE ('F:\SBT\BAL\' + LCTABLENAME + '.FPT') TO  ('D:\KOPII\BALBAK\' + LCTABLENAME + '.FPT')
	ENDIF
	IF FILE('F:\SBT\BAL\' + LCTABLENAME + '.CDX')
		COPY FILE ('F:\SBT\BAL\' + LCTABLENAME + '.CDX') TO  ('D:\KOPII\BALBAK\' + LCTABLENAME + '.CDX')
	ENDIF
ENDFOR
WAIT WIND " Ф И Н И Ш " NOWAIT 
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Копирование и обновление баз данных
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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