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




Пост 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: 2242
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 19.01.12 13:42. Заголовок: AlexMyr пишет: Наве..


AlexMyr пишет:

 цитата:
Наверное просит сделать попытку позже.
Раскручу свой вариант еще: бэкап ждет некоторое время пока завершатся транзакции, если не дождался, делается следующая попытка дождаться, пропустив транзакции, к-е нервничают и так какое-то количество раз, если за отведенное количество не дождался, то завершаем попытки и выдаем сообщение "попробовать позже", если же дождался, то делаем бэкап, и продолжаем работу. Я так вижу процесс бэкапа в данный момент



Да, наверное так и надо делать. В функции блокирования блокировок (эдакая тавтология) можно задать таймаут, в течении которого будет ожидание окончания всех операций с недопущением новых. Если операции завершились - возвращать успех, иначе - отменять блокировку блокировок.
А полностью выгонять всех юзеров из базы - задача непростая. Да и делать это надо для других случаев. Блокирование новых коннектов - это отдельное действие.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 598
Зарегистрирован: 25.12.07
ссылка на сообщение  Отправлено: 19.01.12 13:58. Заголовок: Pasha пишет: Нет, п..


Pasha пишет:

 цитата:
Нет, при этом все соединения останутся живые, только они на время бэкапа не смогут выполнять операции на обновление БД.
А на чтение данных - смогут.



Ну, это вопрос просто терминологии, что считать остановкой. Полная - не совсем полная, типа

А так, ADS-ный вариант, похоже, и единственный...

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




Пост N: 2243
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 19.01.12 16:07. Заголовок: Sergey Spirin пишет:..


Sergey Spirin пишет:

 цитата:
Ну, это вопрос просто терминологии, что считать остановкой. Полная - не совсем полная, типа

А так, ADS-ный вариант, похоже, и единственный...



На запросы сервер отвечать же будет. Правда, не на все.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 701
Зарегистрирован: 27.01.07
ссылка на сообщение  Отправлено: 19.01.12 16:34. Заголовок: Паша, как это будет ..


Паша, как это будет выглядеть для клиентской стороны?

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




Пост N: 2244
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 19.01.12 17:16. Заголовок: Думаю, так. Если реч..


Думаю, так.
Если речь идет о windows, то на сервере в трее будет сидеть утилитка (написанная с помощью hwgui), которая при старте считает настройки: папку БД, папку зеркала, расширения файлов, команды архивации, график.
Сначала она создаст зеркало. Затем по графику она будет просыпаться, попытается блокировать сервер, обновит зеркало и запустит архивацию. В меню трея можно будет увидеть ее состояние, ну и принудительно запустить архивацию.
Можно еще дать ей функции блокировки новых соединений, ну и разблокировки соответственно.
Сначала надо сделать поддержку команд блокировки сервером, а потом написать утилитку.

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



Пост N: 392
Зарегистрирован: 11.06.10
ссылка на сообщение  Отправлено: 19.01.12 17:31. Заголовок: Паша, зачем графичес..


Паша, зачем графический режим (hwgui), может быть проще, как для msde утилита osql в консоли, типа так:
leto_backup -Uuser -Ppw -Tpath -Iip:port
Не знаю, любой юзер может делать архив или только админ, или еще разрешения давать на работу с архивом (может лишнее это, права на создание архива) ?
Допустим если путь не указать куда сохранять, то создаем архив, там где запущена утилита.
АйПи и порт - может у кого два сервера крутится на одной машине.
Можно еще какие параметры придумать.

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




Пост N: 2245
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 19.01.12 17:45. Заголовок: Все параметры затолк..


Все параметры затолкаем в ini.
А интерфейс можно сделать и консольный, и gui. Запускать - хоть планировщиком.


Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 702
Зарегистрирован: 27.01.07
ссылка на сообщение  Отправлено: 19.01.12 19:36. Заголовок: Паша, так все-таки, ..


Паша, так все-таки, как частичный стоп сервера будет восприниматься клиентским приложением? К примеру, клиент был подключен, начался бэкап, а клиент делает попытку записи в базу. Что будет? И что будет, если клиентское приложение не использует Leto_BeginTransaction() и Leto_CommitTransaction()?

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




Пост N: 2246
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 19.01.12 20:32. Заголовок: PSP пишет: Паша, та..


PSP пишет:

 цитата:
Паша, так все-таки, как частичный стоп сервера будет восприниматься клиентским приложением? К примеру, клиент был подключен, начался бэкап, а клиент делает попытку записи в базу. Что будет? И что будет, если клиентское приложение не использует Leto_BeginTransaction() и Leto_CommitTransaction()?



Любая попытка записи в БД, с использованием транзакции или нет, связана с попыткой блокировки.
И на эту попытку клиент получит наш ответ Чемберлену: Не боимся буржуазного звона, ответим на ультиматум Керзона ! НЕТ ! rlock и fillock вернет .f., после dbappend() будет neterr()

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 703
Зарегистрирован: 27.01.07
ссылка на сообщение  Отправлено: 19.01.12 20:40. Заголовок: Может быть не лишним..


Может быть не лишним будет сделать возможность проверки, разрешено писАть или нет, чтобы не доводить до ответа на "ультиматум Керзона", а? Ну, что-нибудь типа Leto_IsTransactionAllowed() -> .T. или .F.

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




Пост N: 2247
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 19.01.12 20:50. Заголовок: Так ведь любая попыт..


Так ведь любая попытка записи должна быть связана с проверкой. Зачем еще что-то дополнительно делать ?
Как учила нас nantucket 20 лет назад, надо пару секунд попытаться выполнить блокировку, а если не получится - огорчиться.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 704
Зарегистрирован: 27.01.07
ссылка на сообщение  Отправлено: 19.01.12 21:04. Заголовок: Так-то оно так... Но..


Так-то оно так... Но Leto_IsTransactionAllowed() можно использовать для проверки с целью запретить юзерам даже пытаться редактировать данные. К примеру, в условии WHEN поля GET или еще где-то, где использование RLock(), FilLock() или DBAppend() не совсем корректно.

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




Пост N: 2248
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 19.01.12 21:09. Заголовок: PSP пишет: Так-то о..


PSP пишет:

 цитата:
Так-то оно так... Но Leto_IsTransactionAllowed() можно использовать для проверки с целью запретить юзерам даже пытаться редактировать данные. К примеру, в условии WHEN поля GET или еще где-то, где использование RLock(), FilLock() или DBAppend() не совсем корректно.



Не возражаю.
Можно остановиться на таком синтаксисе:
leto_LockUpdate([<.lOnOff.>])
При наличии параметра - включить/выключить блокировку изменений
При его отсутствии - вернуть текущее состояние.
Только для получения этого состояния клиенту прийдется посылать отдельный запрос на сервер, и все время так его опрашивать неэффективно.


Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 705
Зарегистрирован: 27.01.07
ссылка на сообщение  Отправлено: 19.01.12 21:10. Заголовок: Согласен. :sm12: ..


Согласен.

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




Пост N: 2265
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 22.02.12 16:59. Заголовок: Я не забыл про эту т..


Я не забыл про эту тему, просто в силу обстоятельств могу уделять letodb немного времени.
Уже почти все сделал. Возник такой ньюанс: перед копировании файлов сравниваю в том числе их размер. А он может различаться у оригинала и копии на 1-2 байта, если перед этим файл копировался средствами rdd.
Приходится сравнивать размер "с погрешностью" до 2-х байт

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




Пост N: 2266
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 23.02.12 18:41. Заголовок: Сбросил на CVS..


Сбросил на CVS

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 743
Зарегистрирован: 27.01.07
ссылка на сообщение  Отправлено: 23.02.12 21:52. Заголовок: Pasha пишет: у ориг..


Pasha пишет:

 цитата:
у оригинала и копии на 1-2 байта


А время последнего изменения одинаково в этом случае?

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




Пост N: 2267
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 24.02.12 09:03. Заголовок: PSP пишет: А время ..


PSP пишет:

 цитата:
А время последнего изменения одинаково в этом случае?



Да, одинаково.
Ситуация такая. При первом запуске таблица открыта, и, letobackup, обнаруживая это, открывает ее тоже через letodb, и создает копию средствами rdd. Затем закрывает копию, и устанавливает дату-время файла как на оригинале. А размер копии отличается от оригинала на 1-2 байта. Думаю, это несмертельно.
Был еще ньюанс под windows с регистром: если имя файла набрано на верхнем регистре, то dbCreate (dbfcdx) его не создавал с параметром полное имя+расширение. Пришлось имя переводить в lower case.
Еще ньюанс: если установлен режим Optimize=1 aka set hardcommit off, то надо отдельно перед созданием бэкапа делать сброс буферов, иначе копия будет неактуальной.

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



Пост N: 438
Зарегистрирован: 11.06.10
ссылка на сообщение  Отправлено: 24.02.12 09:48. Заголовок: Паша, при компиляции..


Паша, при компиляции letobackup получил:
gcc.exe: error: ../../lib/mingw/librddleto.a: No such file or directory

в letobackup.hbp надо
-l../../lib/librddleto.a
т.к. при сборке letodb библиотека rddleto создается в папке /lib

Спасибо за тулзу, будем тестировать

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




Пост N: 2268
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 24.02.12 10:00. Заголовок: Спасибо, учту. Еще н..


Спасибо, учту.
Еще наверное надо сделать свой вариант функции FileCopy, и отказаться от использования hbct.
FileCopy из ct использует буфер размером всего 512 байт, что маловато, и скорость копирования при этом не самая высокая.

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

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