Форум » 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

Pasha: AlexMyr пишет: Так, тестирую на удаленной машине и получаю Так я делал эту утилиту для запуска на сервере, там, где расположена БД Если расчитывать на бэкап с клиентской машины, тогда копирование неоткрытых файлов прийдется выполнять не файловыми операциями, а средствами letodb, что будет заметно медленнее.

AlexMyr: Pasha пишет: Так я делал эту утилиту для запуска на сервере, там, где расположена БД Ясно, так работает.

Pasha: Dima пишет: Каким образом копировать только изменившиеся данные ? Не понятно как удается вложиться в 5 секунд при копировании базы в 300 метров. Провел эксперимент Если делать бэкап неоткрытой БД, то 300М у меня скопировалось за 6.5-7 сек (не 5, урезаю осетра, говорил "на глаз") Открытая БД 300М копируется за 40 сек, это средствами rdd. Copy to не использую, так как тогда бекап надо делать в пределах видимости letodb. Можно сделать отдельную опцию для использования copy to Отслеживается изменение таблицы в целом, изменение отдельных записей не отслеживается


Pasha: Пробую использовать __dbCopy. И оказывается, что letobackup блокирует сервер и сама себе не дает копировать таблицы. Прийдется наверное не делать блокировку для пользователя, который блокировал сервер.

Dima: Pasha пишет: Если делать бэкап неоткрытой БД, то 300М у меня скопировалось за 6.5-7 сек (не 5, урезаю осетра, говорил "на глаз") Как происходит бэкап неоткрытой БД ? Функцию MakeCopy я смотрел. Копирование происходит в следующем куске кода и я ни как не пойму как можно уложиться за 7 секунд при копировании базы в 300 метров коли база копируется целиком. В чем же фишка то ? [pre2] select leto_old leto_SetSkipBuffer( 1000 ) set order to 0 go top while ! eof() dbf_new->(dbAppend()) for i := 1 to FCount() dbf_new->(FieldPut( i, leto_old->(FieldGet( i )) )) next if Deleted() dbf_new->(dbDelete()) endif skip enddo [/pre2]

Pasha: Если файл не открыт letodb, то работает другая ветка: [pre2] if ASCAN(aTables, {|a| Lower(a[2]) == Lower(af[1])}) != 0 // не эта elseif ! IsMemoFile( aTables, Lower(af[1]) ) // а простое копирование файла ?? Padr( "Copying file " + af[1], MaxCol() ) __CopyFile( cDB + af[1], cNewFile ) hb_FSetDateTime( cNewFile, af[3], af[4] ) nFiles ++ endif[/pre2]

Dima: Pasha пишет: Если файл не открыт letodb, то работает другая ветка: Это я промахнулся ;)



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