Автор | Сообщение |
|
| Администратор
|
Пост N: 2229
Зарегистрирован: 23.05.05
|
|
Отправлено: 16.01.12 10:36. Заголовок: Архивация в letodb
Хочу посоветоваться. Задача - сделать бэкап (архив) базы в произвольный момент времени. Пусть архиватор будет 7z, хотя это не принципиально. Утилита запускается на сервере, где установлен letodb, по определенному графику (хотя бы планировщиком). Входные параметры: каталог БД и список расширений файлов, которые надо поместить в архив. Предлагается такой алгоритм: сканируется все содержимое каталога БД, и формируется список @listfiles для архиватора. Если это не файл данных, он просто добавляется в список. Если это файл данных, то выполняется попытка его открыть монопольно. Если попытка успешная - файл закрывается и добавляется в список. Если нет - добавляется в список № 2 для 2-го прохода. Для 1-го прохода через run вызывается архиватор, и ему дается список файлов. Для 2-го прохода создается новый каталог, куда средствами letodb через команду copy to копируются открытые файлы, затем вызывается архиватор с командой добавления в архив файлов, которые не были заархивированы во время 1-го прохода. Какие будут идеи ?
|
|
|
Ответов - 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]
|
|
|
|
| |
Пост 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 Что еще надо прописать?
|
|
|
|
| Администратор
|
Пост 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\ желательно задавать полный путь, если предполагается запускать архиватор, поскольку он с относительным путем не найдет, что архивировать.
|
|
|
|
| |
Пост 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 не работает!
|
|
|
|
| |
Пост 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
|
|
|
|
| |
Пост 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 файлы не копирует!
|
|
|
|
| |
Пост N: 444
Зарегистрирован: 11.06.10
|
|
Отправлено: 24.02.12 15:58. Заголовок: еще момент, базы пер..
еще момент, базы переложил из /data/temp в /data, запускаю letobackup, отработал, файлы скопировал, но поставил им всем дату 16.01.12 16:41, вот!
|
|
|
|
| Администратор
|
Пост 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) что получится ?
|
|
|
|
| |
Пост N: 445
Зарегистрирован: 11.06.10
|
|
Отправлено: 24.02.12 16:22. Заголовок: Pasha пишет: что по..
Pasha пишет: уже пробовал, результат 0
|
|
|
|
| Администратор
|
Пост N: 2271
Зарегистрирован: 23.05.05
|
|
Отправлено: 24.02.12 16:29. Заголовок: AlexMyr пишет: еще ..
AlexMyr пишет: цитата: | еще момент, базы переложил из /data/temp в /data, запускаю letobackup, отработал, файлы скопировал, но поставил им всем дату 16.01.12 16:41, вот! |
| А у оригинальных файлов дата другая ? В случае копирования через файловую систему (а в этом случае так и происходит) дату-время копии файла устанавливает функция FileCopy()
|
|
|
|
| |
Пост N: 446
Зарегистрирован: 11.06.10
|
|
Отправлено: 24.02.12 16:32. Заголовок: Pasha пишет: А у ор..
Pasha пишет: цитата: | А у оригинальных файлов дата другая ? |
|
Да другая, 24.02.12 14:45
|
|
|
|
|
| Администратор
|
Пост N: 2272
Зарегистрирован: 23.05.05
|
|
Отправлено: 24.02.12 17:44. Заголовок: Функции из ct я заме..
Функции из ct я заменил на функции из rtl (там и буфер поболее, аж 8К), кое-что поправил в блокировке сервера, сегодня скину. Но с остальными чудесами честно говоря непонятно. У себя я их не обнаружил.
|
|
|
|
| |
Пост N: 447
Зарегистрирован: 11.06.10
|
|
Отправлено: 24.02.12 18:32. Заголовок: Буду дальше тестиров..
Буду дальше тестировать
|
|
|
|
| |
Пост N: 2325
Зарегистрирован: 17.05.05
|
|
Отправлено: 25.02.12 16:12. Заголовок: Насколько сильно нач..
Насколько сильно начинает тормозить основное приложение когда LetoDB начал копировать базы ? У меня основная программа на Clipper а копирование и архивацию делает программа написанная на Harbour. Когда начинается копирование баз то в основной программе тормоза получаются не детские. Это хорошо видно там ,где работа с базой идет через бровс.
|
|
|
|
| Администратор
|
Пост N: 2275
Зарегистрирован: 23.05.05
|
|
Отправлено: 25.02.12 20:19. Заголовок: Здесь немного разный..
Здесь немного разный подход. В случае копирования на клиппере или харборе используется файловый доступ. Если копирование выполняется на сервере, то файлы открываются в режиме разделения, и копирование выполняется медленно. Если копирование запускается с клиента, то все выполняется намного хуже. letodb открывает файлы монопольно. Бэкап выполняется на сервере. Если изменившився файл не открыт, то он копируется обычными файловыми операциями, то есть быстро. Если изменившийся файл открыт через letodb, то letobackup открывает его через letodb, создает его копию, и заполняет ее через стандартные методы доступа rdd, тоже быстро, поскольку монопольно. Перед копирорванием выполняется блокировка сервера, то есть ожидается завершение текущих операций модификации данных, и во время копирования не допускаются новые операции. На время копирования основная программа не сможет модифицировать данные. Но можно задать режим без этой фичи. В этом случае копирование будет выполняться прозрачно, незаметно для основной программы, но не будет гарантии целостности данных. Копия будет как срез БД. Так как это все выполняется на сервере, копирование выполняется достаточно быстро. Полное копирование БД размером 300М у меня заняло время до 5 секунд. Если копируются только изменившиеся данные, время копирования будет еще меньше, намного.
|
|
|
|
| |
Пост N: 2329
Зарегистрирован: 17.05.05
|
|
Отправлено: 25.02.12 22:14. Заголовок: Pasha Спасибо за по..
Pasha Спасибо за подробный ответ !
|
|
|
|
| |
Пост N: 2330
Зарегистрирован: 17.05.05
|
|
Отправлено: 26.02.12 17:40. Заголовок: Pasha пишет: Полное..
Pasha пишет: цитата: | Полное копирование БД размером 300М у меня заняло время до 5 секунд |
| Да уж не плохо. У меня расшаренная база 470 мегабайт по сети копируется за 2.5 минуты средcтвами Harbour
|
|
|
|
| |
Пост N: 454
Зарегистрирован: 11.06.10
|
|
Отправлено: 27.02.12 09:52. Заголовок: Выкачал заново letod..
Выкачал заново letodb, собрал, проверил letobackup, работает Паша, спасибо
|
|
|
|
| |
Пост 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 раз
|
|
|
|
| |
Пост 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) т.е. нашел два файла, а при копировании путь не найден
|
|
|
Ответов - 127
, стр:
1
2
3
4
5
6
7
All
[только новые]
|
|