powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Внесение изменений в БД при апдейте приложения.
13 сообщений из 38, страница 2 из 2
Внесение изменений в БД при апдейте приложения.
    #39169064
fb user
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DarkMasterОбновление метаданных раз в несколько минут?
Нет. Только при изменении структуры в главной базе. А она там может измениться например накатом обновления, включающим как изменения структуры, так и изменения данных.
...
Рейтинг: 0 / 0
Внесение изменений в БД при апдейте приложения.
    #39169070
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fb userБаза в гиг - уже большая, если стоит на ноутбуке и синхронизируется с
сервером как по структуре, так и по данным, особенно если это происходит раз в несколько
минут.
Даже на ноутбуке гигабайтная база - игрушечный размер.

С репликацией метаданных это к Red Database, они такое делают. Я - нет.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Внесение изменений в БД при апдейте приложения.
    #39169074
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fb user,

это, давайте вопрос репликации (метаданных) отдельно. Это уже следующий вопрос, после реализации обновлений метаданных БД.
...
Рейтинг: 0 / 0
Внесение изменений в БД при апдейте приложения.
    #39169262
Mironico
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Буду как и планировал скриптами от версии до версии.

Еще что хотел спросить..
Юзаю FIB, есть там pFIBBackupService, не могу понять
как проконтролировать удачно ли прошел бэкап.
В доках не совсем понятно, получается только через лог?
...
Рейтинг: 0 / 0
Внесение изменений в БД при апдейте приложения.
    #39169272
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvВроде бы обновлятор 1с работает как раз по второй схеме.Нет, скорее по первой.
Обновления должны устанавливаться по очереди, хотя некоторые "немножко кумулятивные", и включают в себя возможность перепрыгнуть пару-тройку обновлений.
Теоретически, могут быть полные кумулятивные обновления, но на практике такого не бывает.

И кстати, обновлятор не умеет "по очереди применить пропущенные".
Пользователь нажимает "попробовать обновиться", и обновлятор показывает, до какой версии он может обновиться с текущей.
После обновления пользователь опять нажимает "попробовать обновиться", и обновлятор опять выдаёт следующую доступную версию, либо "обновлений не обнаружено".
...
Рейтинг: 0 / 0
Внесение изменений в БД при апдейте приложения.
    #39170026
ZeroMQ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MironicoБуду как и планировал скриптами от версии до версии.

Еще что хотел спросить..
Юзаю FIB, есть там pFIBBackupService, не могу понять
как проконтролировать удачно ли прошел бэкап.
В доках не совсем понятно, получается только через лог?

При ошибке компонент выбрасывает исключение.



Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
type
  TProtocol = (TCP, SPX, NamedPipe, Local);
...
  TBRStruct = packed record
    BackupDirName: string;
    BackupFileName: string;
    PageSize: Integer;
    Protocol: TProtocol;
    Port: string;
    ServerDirName: string;
    ServerFileName: string;
    ServerName: string;
    Password: string;
  end;
...
procedure TDBBackupForm.PrepareBackupStruct(var aBackupStruct: TBRStruct);
// Подготовка данных для бэкапа
begin
  aBackupStruct.BackupDirName := Trim(edTrgDirName.Text); // Текст из контролов "Edit"
  aBackupStruct.BackupFileName := Trim(edTrgFileName.Text);
  aBackupStruct.Protocol := TCP; // Такие дела.

  aBackupStruct.Port := FBPortConnection;

  aBackupStruct.ServerDirName := Trim(edSrcDirName.Text);
  aBackupStruct.ServerFileName := Trim(edSrcFileName.Text);

  if Trim(edTrgServerName.Text) <> '' then begin
    aBackupStruct.ServerName := Trim(edTrgServerName.Text);
    aBackupStruct.Port := FBPortConnection;
  end;

  aBackupStruct.Password := Trim(edPassword.Text);

end;
...
procedure TDBBackupForm.ValidateBackupStruct(var aBackupStruct: TBRStruct);
// Проверка исходных данных
begin
  if aBackupStruct.BackupDirName = '' then
    raise Exception.Create('Не указано имя директории резервной копии');
  if aBackupStruct.BackupFileName = '' then
    raise Exception.Create('Не указано имя файла резервной копии');
  if (aBackupStruct.Protocol <> Local) and (aBackupStruct.ServerName = '') then
    raise Exception.Create('Не указано имя сервера');

  if aBackupStruct.ServerDirName = '' then
    raise Exception.Create('Не указано имя директории на сервере');
  if aBackupStruct.ServerFileName = '' then
    raise Exception.Create('Не указано имя файла базы на сервере');

  if AnsiUpperCase(aBackupStruct.BackupDirName + aBackupStruct.BackupFileName)
    =
    AnsiUpperCase(aBackupStruct.ServerDirName + aBackupStruct.ServerFileName)
    then
    raise
      Exception.Create('Файл копии и файл базы должны быть различны.');

  if aBackupStruct.Password = '' then
  begin
    SetFocusIfPossible(edPassword);
    raise Exception.Create('Не указан пароль SYSDBA.');
  end;

end;
...

procedure TDBBackupForm.btnOkClick(Sender: TObject);
//  Выполнение бэкапа с логированием в edVerbose : TMemo
var
  fBegin, fEnd: TDateTime;
  fError: string;
  fTmpStr: string;

begin

  PrepareBackupStruct(fBRStruct);
  ValidateBackupStruct(fBRStruct);

  btnCancel.Enabled := False;
  btnOk.Enabled := False;
  pcMain.Enabled := False;

  fBegin := Now; // Время начала
  Screen.Cursor := crHourGlass;

  try
    edVerbose.Text := 'Начало резервного копирования. Время: ' +
      DateTimeToStr(fBegin);
    edVerbose.Lines.Add('');
    edVerbose.Lines.Add('');

    srvBackup.Params.Clear;
    srvBackup.Protocol := fBRStruct.Protocol;
    if fBRStruct.Protocol <> Local then
      srvBackup.ServerName := fBRStruct.ServerName + '/' + FBPortConnection
    else
      srvBackup.ServerName := '';

    srvBackup.LibraryName := ConnectDataModule.GetFBClientLibName;

    srvBackup.Params.Values['user_name'] := 'SYSDBA';
    srvBackup.Params.Values['password'] := edPassword.Text;

    pcMain.ActivePage := tsProtocol;
    btnOk.Enabled := pcMain.ActivePage = tsParams;

    try
      srvBackup.Attach;
      srvBackup.BackupFile.Clear;

      fTmpStr := IncludeTrailingPathDelimiter(fBRStruct.BackupDirName);
      // Добавляем слэш в конец пути

      srvBackup.BackupFile.Add(fTmpStr + fBRStruct.BackupFileName);

      if srvBackup.Active then
      begin

        fTmpStr := IncludeTrailingPathDelimiter(fBRStruct.ServerDirName)
          + fBRStruct.ServerFileName;

        srvBackup.DatabaseName := fTmpStr;

        srvBackup.Verbose := cbVerbose.Checked;
        if cbGarbageCollection.Checked then
          srvBackup.Options := srvBackup.Options - [NoGarbageCollection]
        else
          srvBackup.Options := srvBackup.Options + [NoGarbageCollection];

        srvBackup.ServiceStart;

        if srvBackup.Verbose then
          while not srvBackup.Eof do
          begin
            edVerbose.Lines.Add(srvBackup.GetNextLine);
            Application.ProcessMessages
          end
        else
          while srvBackup.IsServiceRunning do
            Application.ProcessMessages;

        // Считаем, что в этой точке backup успешно выполнен
        BusinessDataModule.SaveBRStruct('LastBackup', fBRStruct);

      end;
      fEnd := Now;

    except
      on e: Exception do
      begin
        fEnd := Now;
        fError := ('Ошибка:' + e.Message);
        ShowMessage(fError);
      end
    end
  finally
    if srvBackup.Active then
      srvBackup.Detach;

    Screen.Cursor := crDefault;

    edVerbose.Lines.Add(fError);
    edVerbose.Lines.Add('Резервное копирование завершено. Время: ' +
      DateTimeToStr(fEnd));
    edVerbose.Lines.Add('Затрачено времени: ' + TimeToStr(fEnd - fBegin));

    btnOk.Enabled := pcMain.ActivePage = tsParams;
    btnCancel.Enabled := True;
    pcMain.Enabled := True;
  end
end;


...
Рейтинг: 0 / 0
Внесение изменений в БД при апдейте приложения.
    #39170071
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZeroMQПри ошибке компонент выбрасывает исключение.
госсподи! какое исключение и на какой строке кода?
...
Рейтинг: 0 / 0
Внесение изменений в БД при апдейте приложения.
    #39170079
ZeroMQ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvZeroMQПри ошибке компонент выбрасывает исключение.
госсподи! какое исключение и на какой строке кода?
Нискажу. Зачем ты "госсподи!" написал?
...
Рейтинг: 0 / 0
Внесение изменений в БД при апдейте приложения.
    #39177796
Го-стхи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
У меня так: версия БД в проге, версия БД в БД. Для простоты сравнения версии нумеруются #..#.## (ровно две цифры в "дробной" части, она же minor version). Если App_DBVer < DB_DBVer - отлуп, надо обновить прогу. App_DBVer > DB_DBVer - запуск обновлятора, который пошагово наращивает версию до текущей. Для простоты (база небольшая и доступ локальный-эксклюзивный) сделал копирование файла БД и применение обновлений к нему, после чего файл подменяется. Надо бы транзакциями, но тогда возникает проблема использования измененных метаданных в рамках той же транзакции.
...
Рейтинг: 0 / 0
Внесение изменений в БД при апдейте приложения.
    #39177991
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Го-стхитогда возникает проблема использования измененных метаданных в рамках той же транзакции.

а базу в single-user mode переводишь?

IMHO корректно такая задача расшивается только *отдельным процессом* обновлятеля, который к тому же просьбами и пинками выгонит из БД всех пользователей перед обновлением.

а после обновления, заново соединяясь уже и метаданные перечитаются на клиентах
...
Рейтинг: 0 / 0
Внесение изменений в БД при апдейте приложения.
    #39177992
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...ну и добавление где надо действия "re-connect" в скрипты самого обновлятеля, да.
...
Рейтинг: 0 / 0
Внесение изменений в БД при апдейте приложения.
    #39178440
Го-стхи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ariochа базу в single-user mode переводишь?
Пока не было такой нужды, просто отсоединял коннект в самой программе, дальше копирование и обновление копии. Разумеется, сие только для локального эксклюзивного применения. Для муьтиюзера придется придумывать более мудрую схему.
а после обновления, заново соединяясь уже и метаданные перечитаются на клиентах
Не в том дело, просто иногда без реконнекта не идут некоторые апдейты. А если сделать реконнект - уже будет больше одной транзакции, что делает затруднительным консистентный откат к предыдущей версии в случае непредвиденностей. Разве что разносить несовместимые изменения по двум разным апдейтам...
...
Рейтинг: 0 / 0
Внесение изменений в БД при апдейте приложения.
    #39178582
Печень белого медведя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Го-стхи...что делает затруднительным консистентный откат к предыдущей версии...

Бэкап спасает.
...
Рейтинг: 0 / 0
13 сообщений из 38, страница 2 из 2
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Внесение изменений в БД при апдейте приложения.
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]