Форум » LetoDB, HbNetio. » Архивация в letodb » Ответить

Архивация в letodb

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

Ответов - 127, стр: 1 2 3 4 5 6 7 All

AlexMyr: Собрал, запускаю, получаю: C:\dev\letodb\utils\backup\>letobackup.exe Source directory is absent ... тут все правильно? [pre2] elseif ai[1] = "DATAPATH" cDB := ai[2] elseif ai[1] = "DATABASE" cDir := ai[2][/pre2]

AlexMyr: Вот мой 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 Что еще надо прописать?

Pasha: Еще нужен параметр DataBase = / Этот параметр обязателен, странно что бэкап вообще начался без него, там же стоит проверка: elseif Empty( cDir ) ? "Source directory is absent ..." Return Nil В Datapath надо указать ту же папку, которая указана в letodb.ini. Это необходимо, поскольку бэкап использует файловый доступ, если файл не открыт letodb А в параметре DataBase - путь относительно Datapath Еще в параметре Backup = .\backup\ желательно задавать полный путь, если предполагается запускать архиватор, поскольку он с относительным путем не найдет, что архивировать.


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 не работает!

AlexMyr: Сделал маленький тест: letodb.ini DataPath = d:/data EnableFileFunc = 1 [pre2]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[/pre2] Когда изменил 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

AlexMyr: Базы лежат в 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 файлы не копирует!

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

Pasha: Не перепутано. Я сделал точно такой же 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) что получится ?

AlexMyr: Pasha пишет: что получится ? уже пробовал, результат 0

Pasha: AlexMyr пишет: еще момент, базы переложил из /data/temp в /data, запускаю letobackup, отработал, файлы скопировал, но поставил им всем дату 16.01.12 16:41, вот! А у оригинальных файлов дата другая ? В случае копирования через файловую систему (а в этом случае так и происходит) дату-время копии файла устанавливает функция FileCopy()

AlexMyr: Pasha пишет: А у оригинальных файлов дата другая ? Да другая, 24.02.12 14:45

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

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

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

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

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

Dima: Pasha пишет: Полное копирование БД размером 300М у меня заняло время до 5 секунд Да уж не плохо. У меня расшаренная база 470 мегабайт по сети копируется за 2.5 минуты средcтвами Harbour

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

Dima: Pasha пишет: Так как это все выполняется на сервере, копирование выполняется достаточно быстро. Полное копирование БД размером 300М у меня заняло время до 5 секунд. Если копируются только изменившиеся данные, время копирования будет еще меньше, намного. Каким образом копировать только изменившиеся данные ? Не понятно как удается вложиться в 5 секунд при копировании базы в 300 метров. Провел эксперимент [pre2] 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 [/pre2] Copy to сработало быстрее в 8 раз

AlexMyr: Так, тестирую на удаленной машине и получаю 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) т.е. нашел два файла, а при копировании путь не найден



полная версия страницы