On-line: гостей 0. Всего: 0 [подробнее..]
АвторСообщение
Администратор




Пост N: 2229
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 16.01.12 10:36. Заголовок: Архивация в letodb


Хочу посоветоваться. Задача - сделать бэкап (архив) базы в произвольный момент времени.
Пусть архиватор будет 7z, хотя это не принципиально.
Утилита запускается на сервере, где установлен letodb, по определенному графику (хотя бы планировщиком).
Входные параметры: каталог БД и список расширений файлов, которые надо поместить в архив.
Предлагается такой алгоритм: сканируется все содержимое каталога БД, и формируется список @listfiles для архиватора.
Если это не файл данных, он просто добавляется в список. Если это файл данных, то выполняется попытка его открыть монопольно. Если попытка успешная - файл закрывается и добавляется в список.
Если нет - добавляется в список № 2 для 2-го прохода.
Для 1-го прохода через run вызывается архиватор, и ему дается список файлов.
Для 2-го прохода создается новый каталог, куда средствами letodb через команду copy to копируются открытые файлы, затем вызывается архиватор с командой добавления в архив файлов, которые не были заархивированы во время 1-го прохода.
Какие будут идеи ?


Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 127 , стр: 1 2 3 4 5 6 7 All [только новые]





Пост N: 439
Зарегистрирован: 11.06.10
ссылка на сообщение  Отправлено: 24.02.12 10:08. Заголовок: Собрал, запускаю, по..


Собрал, запускаю, получаю:
C:\dev\letodb\utils\backup\>letobackup.exe

Source directory is absent ...

тут все правильно?
         elseif ai[1] = "DATAPATH" 
cDB := ai[2]
elseif ai[1] = "DATABASE"
cDir := ai[2]



Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 440
Зарегистрирован: 11.06.10
ссылка на сообщение  Отправлено: 24.02.12 10:15. Заголовок: Вот мой letobackup.i..


Вот мой letobackup.ini
Server = //127.0.0.1:2812
DataPath = d:/data/temp
Backup = .\backup\
Mask = *.dbf,*.fpt,*.dbt

test_ta запустил и создал базы в d:/data/temp
потом
C:\dev\letodb\utils\backup\>letobackup.exe

Connecting to //127.0.0.1:2812
Connected to Leto DB Server v.2.03
Trying to lock server...
Success
Get list of opened tables...
0 tables found
Scanning directory tree...
0 files found
Checking directories...
Copying files...
0 files and 0 tables copied
Unlocking server ...
Success
Backup finished

Что еще надо прописать?

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 2269
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 24.02.12 11:41. Заголовок: Еще нужен параметр ..


Еще нужен параметр

DataBase = /

Этот параметр обязателен, странно что бэкап вообще начался без него, там же стоит проверка:

elseif Empty( cDir )
? "Source directory is absent ..."
Return Nil

В Datapath надо указать ту же папку, которая указана в letodb.ini. Это необходимо, поскольку бэкап использует файловый доступ, если файл не открыт letodb
А в параметре DataBase - путь относительно Datapath
Еще в параметре Backup = .\backup\ желательно задавать полный путь, если предполагается запускать архиватор, поскольку он с относительным путем не найдет, что архивировать.


Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 441
Зарегистрирован: 11.06.10
ссылка на сообщение  Отправлено: 24.02.12 15:08. Заголовок: AlexMyr пишет: тут ..


AlexMyr пишет:

 цитата:
тут все правильно?

elseif ai[1] = "DATAPATH"
cDB := ai[2]
elseif ai[1] = "DATABASE"
cDir := ai[2]


тут ничего не напутано? cDb относится к DATAPATH, а cDir к DATABASE?

letodb.ini
DataPath = d:/data
EnableFileFunc = 1

letobackup.ini
Server = //127.0.0.1:2812
Database = /temp/ или Database = /
DataPath = d:/data
Backup = .\backup\
Mask = *.dbf,*.fpt,*.dbt

не работает!

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 442
Зарегистрирован: 11.06.10
ссылка на сообщение  Отправлено: 24.02.12 15:45. Заголовок: Сделал маленький тес..


Сделал маленький тест:
letodb.ini
DataPath = d:/data
EnableFileFunc = 1

Function Main 
Local cPath := "//127.0.0.1:2812/", adir:={}

REQUEST LETO
RDDSETDEFAULT( "LETO" )
adir := leto_Directory(cPath+"/data","D") // результат 0
adir := leto_Directory(cPath,"D") // результат >0
?len(adir)
for i:=1 to len(adir)
?valtype(adir[i,1]),adir[i,1]
next
return nil


Когда изменил letobackup.ini
Server = //127.0.0.1:2812
DataPath = /
DataBase = /temp/
Backup = .\backup\
Mask = *.dbf,*.fpt,*.dbt

тогда сработало:
C:\dev\letodb\utils\backup\>letobackup.exe

Connecting to //127.0.0.1:2812
Connected to Leto DB Server v.2.03
Trying to lock server...
Success
/ //127.0.0.1:2812
Get list of opened tables...
0 tables found
Scanning directory tree...
39 files found
Checking directories...
Copying file /test2.dbf
39 files and 0 tables copied
Unlocking server ...
Success
Backup finished


Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 443
Зарегистрирован: 11.06.10
ссылка на сообщение  Отправлено: 24.02.12 15:52. Заголовок: Базы лежат в d:/data..


Базы лежат в d:/data/temp
letobackup.ini
Server = //127.0.0.1:2812
DataPath = /
DataBase = /temp
Backup = .\backup\
Mask = *.dbf,*.fpt,*.dbt

letobackup создает каталог ./backup/temp,
Connecting to //127.0.0.1:2812
Connected to Leto DB Server v.2.03
Trying to lock server...
Success
/ //127.0.0.1:2812
Get list of opened tables...
0 tables found
Scanning directory tree...
4 files found
Checking directories...
Copying file /temp/Nakl2.fpt
4 files and 0 tables copied
Unlocking server ...
Success
Backup finished

находит 4 файла, НО в backup/temp файлы не копирует!

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 444
Зарегистрирован: 11.06.10
ссылка на сообщение  Отправлено: 24.02.12 15:58. Заголовок: еще момент, базы пер..


еще момент, базы переложил из /data/temp в /data, запускаю letobackup, отработал, файлы скопировал, но поставил им всем дату
16.01.12 16:41, вот!

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 2270
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 24.02.12 16:18. Заголовок: Не перепутано. Я сде..


Не перепутано.
Я сделал точно такой же letodb.ini, и точно такой же letobackup.ini с
Database = /temp/

создал
d:\data\temp
бросил туда 1 файл
запустил letobackup
получил результат:

Connecting to //127.0.0.1:2812
Connected to Leto DB Server v.2.03
Trying to lock server...
Success
Get list of opened tables...
0 tables found
Scanning directory tree...
1 files found
Checking directories...
Copying file /temp/temp.dbf
1 files and 0 tables copied
Unlocking server ...
Success
Backup finished

Почему-то не отрабатывает leto_directory, поскольку "0 files found"
"0 tables found" - так и должно быть, так как через letodb ничего не открыто..

а если в функции GetFiles после строки

LOCAL aDir := leto_Directory( cDir, "D" ), ad

поставить отладочную печать:

? cDir, len(aDir)

что получится ?


Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 445
Зарегистрирован: 11.06.10
ссылка на сообщение  Отправлено: 24.02.12 16:22. Заголовок: Pasha пишет: что по..


Pasha пишет:

 цитата:
что получится ?

уже пробовал, результат 0

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 2271
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 24.02.12 16:29. Заголовок: AlexMyr пишет: еще ..


AlexMyr пишет:

 цитата:
еще момент, базы переложил из /data/temp в /data, запускаю letobackup, отработал, файлы скопировал, но поставил им всем дату
16.01.12 16:41, вот!



А у оригинальных файлов дата другая ?
В случае копирования через файловую систему (а в этом случае так и происходит) дату-время копии файла устанавливает функция FileCopy()

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 446
Зарегистрирован: 11.06.10
ссылка на сообщение  Отправлено: 24.02.12 16:32. Заголовок: Pasha пишет: А у ор..


Pasha пишет:

 цитата:
А у оригинальных файлов дата другая ?

Да другая, 24.02.12 14:45

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 2272
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 24.02.12 17:44. Заголовок: Функции из ct я заме..


Функции из ct я заменил на функции из rtl (там и буфер поболее, аж 8К), кое-что поправил в блокировке сервера, сегодня скину.
Но с остальными чудесами честно говоря непонятно. У себя я их не обнаружил.

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 447
Зарегистрирован: 11.06.10
ссылка на сообщение  Отправлено: 24.02.12 18:32. Заголовок: Буду дальше тестиров..


Буду дальше тестировать

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 2325
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 25.02.12 16:12. Заголовок: Насколько сильно нач..


Насколько сильно начинает тормозить основное приложение когда LetoDB начал копировать
базы ?
У меня основная программа на Clipper а копирование и архивацию делает программа написанная
на Harbour. Когда начинается копирование баз то в основной программе тормоза получаются
не детские. Это хорошо видно там ,где работа с базой идет через бровс.

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 2275
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 25.02.12 20:19. Заголовок: Здесь немного разный..


Здесь немного разный подход. В случае копирования на клиппере или харборе используется файловый доступ. Если копирование выполняется на сервере, то файлы открываются в режиме разделения, и копирование выполняется медленно. Если копирование запускается с клиента, то все выполняется намного хуже.
letodb открывает файлы монопольно. Бэкап выполняется на сервере. Если изменившився файл не открыт, то он копируется обычными файловыми операциями, то есть быстро.
Если изменившийся файл открыт через letodb, то letobackup открывает его через letodb, создает его копию, и заполняет ее через стандартные методы доступа rdd, тоже быстро, поскольку монопольно. Перед копирорванием выполняется блокировка сервера, то есть ожидается завершение текущих операций модификации данных, и во время копирования не допускаются новые операции.
На время копирования основная программа не сможет модифицировать данные. Но можно задать режим без этой фичи. В этом случае копирование будет выполняться прозрачно, незаметно для основной программы, но не будет гарантии целостности данных. Копия будет как срез БД.
Так как это все выполняется на сервере, копирование выполняется достаточно быстро. Полное копирование БД размером 300М у меня заняло время до 5 секунд. Если копируются только изменившиеся данные, время копирования будет еще меньше, намного.


Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 2329
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 25.02.12 22:14. Заголовок: Pasha Спасибо за по..


Pasha
Спасибо за подробный ответ !


Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 2330
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 26.02.12 17:40. Заголовок: Pasha пишет: Полное..


Pasha пишет:

 цитата:
Полное копирование БД размером 300М у меня заняло время до 5 секунд


Да уж не плохо.
У меня расшаренная база 470 мегабайт по сети копируется за 2.5 минуты средcтвами Harbour


Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 454
Зарегистрирован: 11.06.10
ссылка на сообщение  Отправлено: 27.02.12 09:52. Заголовок: Выкачал заново letod..


Выкачал заново letodb, собрал, проверил letobackup, работает Паша, спасибо

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 2332
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 27.02.12 12:35. Заголовок: Pasha пишет: Так ка..


Pasha пишет:

 цитата:
Так как это все выполняется на сервере, копирование выполняется достаточно быстро. Полное копирование БД размером 300М у меня заняло время до 5 секунд. Если копируются только изменившиеся данные, время копирования будет еще меньше, намного.


Каким образом копировать только изменившиеся данные ?
Не понятно как удается вложиться в 5 секунд при копировании базы в 300 метров.
Провел эксперимент
 
proc main
local a:=seconds()
use karta new // размер 80 мегабайт

*copy file karta.dbf to karta1.dbf
*? seconds()-a // 3 секунды
*wait


dbCreate( "dbf_new", dbStruct())
use dbf_new exclusive new

select karta
go top
while ! eof()
dbf_new->(dbAppend())
for i := 1 to FCount()
dbf_new->(FieldPut( i, karta->(FieldGet( i )) ))
next
if Deleted()
dbf_new->(dbDelete())
endif
skip
enddo
? seconds()-a // 24 секунды
wait
return



Copy to сработало быстрее в 8 раз

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 455
Зарегистрирован: 11.06.10
ссылка на сообщение  Отправлено: 27.02.12 12:38. Заголовок: Так, тестирую на уда..


Так, тестирую на удаленной машине и получаю

C:\dev\letodb\utils\backup\>letobackup.exe

Connecting to //x.x.x.x:2812/
Connected to Leto DB Server v.2.03
Trying to lock server...
Success
Get list of opened tables...
0 tables found
Scanning directory tree...
2 files found
Checking directories...
Copying file /rel1.dbf
Error BASE/2012 Open error: e:/data_dbf/rel1.dbf (DOS Error 3)
Called from __COPYFILE(0)
Called from MAKECOPY(285)
Called from BACKUP(228)
Called from MAIN(172)

т.е. нашел два файла, а при копировании путь не найден

Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 127 , стр: 1 2 3 4 5 6 7 All [только новые]
Ответ:
1 2 3 4 5 6 7 8 9
большой шрифт малый шрифт надстрочный подстрочный заголовок большой заголовок видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки моноширинный шрифт моноширинный шрифт горизонтальная линия отступ точка LI бегущая строка оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 367
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет