Автор | Сообщение |
|
| Администратор
|
Пост 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: 2242
Зарегистрирован: 23.05.05
|
|
Отправлено: 19.01.12 13:42. Заголовок: AlexMyr пишет: Наве..
AlexMyr пишет: цитата: | Наверное просит сделать попытку позже. Раскручу свой вариант еще: бэкап ждет некоторое время пока завершатся транзакции, если не дождался, делается следующая попытка дождаться, пропустив транзакции, к-е нервничают и так какое-то количество раз, если за отведенное количество не дождался, то завершаем попытки и выдаем сообщение "попробовать позже", если же дождался, то делаем бэкап, и продолжаем работу. Я так вижу процесс бэкапа в данный момент |
| Да, наверное так и надо делать. В функции блокирования блокировок (эдакая тавтология) можно задать таймаут, в течении которого будет ожидание окончания всех операций с недопущением новых. Если операции завершились - возвращать успех, иначе - отменять блокировку блокировок. А полностью выгонять всех юзеров из базы - задача непростая. Да и делать это надо для других случаев. Блокирование новых коннектов - это отдельное действие.
|
|
|
|
| постоянный участник
|
Пост N: 598
Зарегистрирован: 25.12.07
|
|
Отправлено: 19.01.12 13:58. Заголовок: Pasha пишет: Нет, п..
Pasha пишет: цитата: | Нет, при этом все соединения останутся живые, только они на время бэкапа не смогут выполнять операции на обновление БД. А на чтение данных - смогут. |
| Ну, это вопрос просто терминологии, что считать остановкой. Полная - не совсем полная, типа А так, ADS-ный вариант, похоже, и единственный...
|
|
|
|
| Администратор
|
Пост N: 2243
Зарегистрирован: 23.05.05
|
|
Отправлено: 19.01.12 16:07. Заголовок: Sergey Spirin пишет:..
Sergey Spirin пишет: цитата: | Ну, это вопрос просто терминологии, что считать остановкой. Полная - не совсем полная, типа А так, ADS-ный вариант, похоже, и единственный... |
| На запросы сервер отвечать же будет. Правда, не на все.
|
|
|
|
| постоянный участник
|
Пост N: 701
Зарегистрирован: 27.01.07
|
|
Отправлено: 19.01.12 16:34. Заголовок: Паша, как это будет ..
Паша, как это будет выглядеть для клиентской стороны?
|
|
|
|
| Администратор
|
Пост N: 2244
Зарегистрирован: 23.05.05
|
|
Отправлено: 19.01.12 17:16. Заголовок: Думаю, так. Если реч..
Думаю, так. Если речь идет о windows, то на сервере в трее будет сидеть утилитка (написанная с помощью hwgui), которая при старте считает настройки: папку БД, папку зеркала, расширения файлов, команды архивации, график. Сначала она создаст зеркало. Затем по графику она будет просыпаться, попытается блокировать сервер, обновит зеркало и запустит архивацию. В меню трея можно будет увидеть ее состояние, ну и принудительно запустить архивацию. Можно еще дать ей функции блокировки новых соединений, ну и разблокировки соответственно. Сначала надо сделать поддержку команд блокировки сервером, а потом написать утилитку.
|
|
|
|
| |
Пост N: 392
Зарегистрирован: 11.06.10
|
|
Отправлено: 19.01.12 17:31. Заголовок: Паша, зачем графичес..
Паша, зачем графический режим (hwgui), может быть проще, как для msde утилита osql в консоли, типа так: leto_backup -Uuser -Ppw -Tpath -Iip:port Не знаю, любой юзер может делать архив или только админ, или еще разрешения давать на работу с архивом (может лишнее это, права на создание архива) ? Допустим если путь не указать куда сохранять, то создаем архив, там где запущена утилита. АйПи и порт - может у кого два сервера крутится на одной машине. Можно еще какие параметры придумать.
|
|
|
|
| Администратор
|
Пост N: 2245
Зарегистрирован: 23.05.05
|
|
Отправлено: 19.01.12 17:45. Заголовок: Все параметры затолк..
Все параметры затолкаем в ini. А интерфейс можно сделать и консольный, и gui. Запускать - хоть планировщиком.
|
|
|
|
| постоянный участник
|
Пост N: 702
Зарегистрирован: 27.01.07
|
|
Отправлено: 19.01.12 19:36. Заголовок: Паша, так все-таки, ..
Паша, так все-таки, как частичный стоп сервера будет восприниматься клиентским приложением? К примеру, клиент был подключен, начался бэкап, а клиент делает попытку записи в базу. Что будет? И что будет, если клиентское приложение не использует Leto_BeginTransaction() и Leto_CommitTransaction()?
|
|
|
|
| Администратор
|
Пост N: 2246
Зарегистрирован: 23.05.05
|
|
Отправлено: 19.01.12 20:32. Заголовок: PSP пишет: Паша, та..
PSP пишет: цитата: | Паша, так все-таки, как частичный стоп сервера будет восприниматься клиентским приложением? К примеру, клиент был подключен, начался бэкап, а клиент делает попытку записи в базу. Что будет? И что будет, если клиентское приложение не использует Leto_BeginTransaction() и Leto_CommitTransaction()? |
| Любая попытка записи в БД, с использованием транзакции или нет, связана с попыткой блокировки. И на эту попытку клиент получит наш ответ Чемберлену: Не боимся буржуазного звона, ответим на ультиматум Керзона ! НЕТ ! rlock и fillock вернет .f., после dbappend() будет neterr()
|
|
|
|
| постоянный участник
|
Пост N: 703
Зарегистрирован: 27.01.07
|
|
Отправлено: 19.01.12 20:40. Заголовок: Может быть не лишним..
Может быть не лишним будет сделать возможность проверки, разрешено писАть или нет, чтобы не доводить до ответа на "ультиматум Керзона", а? Ну, что-нибудь типа Leto_IsTransactionAllowed() -> .T. или .F.
|
|
|
|
| Администратор
|
Пост N: 2247
Зарегистрирован: 23.05.05
|
|
Отправлено: 19.01.12 20:50. Заголовок: Так ведь любая попыт..
Так ведь любая попытка записи должна быть связана с проверкой. Зачем еще что-то дополнительно делать ? Как учила нас nantucket 20 лет назад, надо пару секунд попытаться выполнить блокировку, а если не получится - огорчиться.
|
|
|
|
|
| постоянный участник
|
Пост N: 704
Зарегистрирован: 27.01.07
|
|
Отправлено: 19.01.12 21:04. Заголовок: Так-то оно так... Но..
Так-то оно так... Но Leto_IsTransactionAllowed() можно использовать для проверки с целью запретить юзерам даже пытаться редактировать данные. К примеру, в условии WHEN поля GET или еще где-то, где использование RLock(), FilLock() или DBAppend() не совсем корректно.
|
|
|
|
| Администратор
|
Пост N: 2248
Зарегистрирован: 23.05.05
|
|
Отправлено: 19.01.12 21:09. Заголовок: PSP пишет: Так-то о..
PSP пишет: цитата: | Так-то оно так... Но Leto_IsTransactionAllowed() можно использовать для проверки с целью запретить юзерам даже пытаться редактировать данные. К примеру, в условии WHEN поля GET или еще где-то, где использование RLock(), FilLock() или DBAppend() не совсем корректно. |
| Не возражаю. Можно остановиться на таком синтаксисе: leto_LockUpdate([<.lOnOff.>]) При наличии параметра - включить/выключить блокировку изменений При его отсутствии - вернуть текущее состояние. Только для получения этого состояния клиенту прийдется посылать отдельный запрос на сервер, и все время так его опрашивать неэффективно.
|
|
|
|
| постоянный участник
|
Пост N: 705
Зарегистрирован: 27.01.07
|
|
Отправлено: 19.01.12 21:10. Заголовок: Согласен. :sm12: ..
Согласен.
|
|
|
|
| Администратор
|
Пост N: 2265
Зарегистрирован: 23.05.05
|
|
Отправлено: 22.02.12 16:59. Заголовок: Я не забыл про эту т..
Я не забыл про эту тему, просто в силу обстоятельств могу уделять letodb немного времени. Уже почти все сделал. Возник такой ньюанс: перед копировании файлов сравниваю в том числе их размер. А он может различаться у оригинала и копии на 1-2 байта, если перед этим файл копировался средствами rdd. Приходится сравнивать размер "с погрешностью" до 2-х байт
|
|
|
|
| Администратор
|
Пост N: 2266
Зарегистрирован: 23.05.05
|
|
Отправлено: 23.02.12 18:41. Заголовок: Сбросил на CVS..
Сбросил на CVS
|
|
|
|
| постоянный участник
|
Пост N: 743
Зарегистрирован: 27.01.07
|
|
Отправлено: 23.02.12 21:52. Заголовок: Pasha пишет: у ориг..
Pasha пишет: цитата: | у оригинала и копии на 1-2 байта |
| А время последнего изменения одинаково в этом случае?
|
|
|
|
| Администратор
|
Пост 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, то надо отдельно перед созданием бэкапа делать сброс буферов, иначе копия будет неактуальной.
|
|
|
|
| |
Пост 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 Спасибо за тулзу, будем тестировать
|
|
|
|
| Администратор
|
Пост N: 2268
Зарегистрирован: 23.05.05
|
|
Отправлено: 24.02.12 10:00. Заголовок: Спасибо, учту. Еще н..
Спасибо, учту. Еще наверное надо сделать свой вариант функции FileCopy, и отказаться от использования hbct. FileCopy из ct использует буфер размером всего 512 байт, что маловато, и скорость копирования при этом не самая высокая.
|
|
|
Ответов - 127
, стр:
1
2
3
4
5
6
7
All
[только новые]
|
|