powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Как в .net FbRestore добавить опцию fix_fss_metadata ?
12 сообщений из 12, страница 1 из 1
Как в .net FbRestore добавить опцию fix_fss_metadata ?
    #39935963
whizzzkey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день!
Использую сервер firebird 2.5.9 embedded, пытаюсь разобраться с функционалом backup\restore на firebird .net провайдере (самый последний пакет из Nuget).
Backup завёлся с пол-пинка с первого примера из интернета, а вот restore решил что так легко отдаваться без боя не с руки и вообще претит духу мира программирования и поэтому решил устроить мне немного боли и страданий в будничный вечер.

В общем использую такой код:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
  FbRestore restoreSvc = new FbRestore();
  restoreSvc.ConnectionString = \\ моя строка 
  restoreSvc.Options = FbRestoreFlags.Create | FbRestoreFlags.Replace;
  restoreSvc.PageSize = 4096;
  restoreSvc.Verbose = true;
  restoreSvc.BackupFiles.Add(new FbBackupFile( \\мой файл , 2048));
  restoreSvc.ServiceOutput += \\ мой EventHandler
  restoreSvc.Execute();



И получаю такую ошибку
Invalid metadata detected. Use -FIX_FSS_METADATA option.

Среди доступных флагов для restore в исходниках клиента чего-то похожего не нахожу

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
	
[Flags]
public enum FbRestoreFlags
  {
  DeactivateIndexes = IscCodes.isc_spb_res_deactivate_idx,
  NoShadow = IscCodes.isc_spb_res_no_shadow,
  NoValidity = IscCodes.isc_spb_res_no_validity,
  IndividualCommit = IscCodes.isc_spb_res_one_at_a_time,
  Replace = IscCodes.isc_spb_res_replace,
  Create = IscCodes.isc_spb_res_create,
  UseAllSpace = IscCodes.isc_spb_res_use_all_space,
  MetaDataOnly = IscCodes.isc_spb_res_metadata_only,
}



Да и судя по докам отсюда http://www.ibase.ru/gbak/
опция должна указывать кодировку и передаваться отдельно
ПРИМЕР-fix_fss_metadata win1251

но это справедливо для gbak, а как воспользоваться ею для .net FbRestore ? И поддерживает ли вообще FbRestore этот функционал и лучше вообще на него забить и использовать gbak через Process.Start()?
...
Рейтинг: 0 / 0
Как в .net FbRestore добавить опцию fix_fss_metadata ?
    #39935965
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
10.03.2020 14:55, whizzzkey пишет:
> использовать gbak через Process.Start()?

да
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как в .net FbRestore добавить опцию fix_fss_metadata ?
    #39935973
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
whizzzkey,

зачем она тебе? Это опция используется исключительно 1 раз при переходе c Firebird версии < 2.1.
Для регулярного b/r на 2.5 она не нужна
...
Рейтинг: 0 / 0
Как в .net FbRestore добавить опцию fix_fss_metadata ?
    #39935974
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
whizzzkeyно это справедливо для gbak, а как воспользоваться ею для .net FbRestore ?

Никак. Эта опция при неправильном применении напрочь гробит базу, поэтому давать её в руки
шарпеев нельзя.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как в .net FbRestore добавить опцию fix_fss_metadata ?
    #39935981
Ivan_Pisarevsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Там обрыв! Автору туда можно только после прохождения теста на профпригодность.
...
Рейтинг: 0 / 0
Как в .net FbRestore добавить опцию fix_fss_metadata ?
    #39935991
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
whizzzkey,

замечаний много.
1. не надо явно задавать размер страницы при ресторе, кроме тех случаев, когда его надо явно вручную (и один раз) увеличить или уменьшить. Более того, для любых современных баз, даже микроскопических, размер страницы 4к это мало. Норм - 8к. Для больших (10 гиг и выше) - 16к. Всё.
Втыкание вот этого - restoreSvc.PageSize = 4096; - для базы с размером страницы 8к приведет к тому, что размер страницы станет 4к, вырастет глубина индексов, и т.д., и сразу будет заметен просад в производительности.
Если же база совсем древняя, и у нее размер страницы 1-2к, то рестор на ФБ 2.5 автоматически повысит размер страницы до 4к.

2. Invalid metadata detected. Use -FIX_FSS_METADATA option.
Это бывает, если взять базу с кривыми метаданными от предыдущей версии - 2.1, 2.0. Указанную опцию надо использовать ОДИН раз, руками. Причем, по уму, если обнаруживается invalid metadata detected, то надо
(и более того, если речь идет об апгрейде клиентской БД с 2.1 на 2.5)
- извлечь скрипт базы данных (isql -x)
- прошерстить все метаданные скрипта на предмет "кривых символов", испорченного текста, и т.д.
- подготовить скрипт с alter ... всех кривых объектов.
- применить скрипт с alter, после чего проверить базу бэкап-рестором. Если ошибка invalid не выводится - значит всё замечательно.
И у клиента тогда - применяем скрипт, делаем бэкап, меняем Фб на 2.5, делаем рестор.

Да, как тут уже заметили, если два раза сделать рестор с -fix_fss_metadata, то тексту процедур и триггеров придет кабздец.
Тут уже был один гражданин, который влепил эту опцию на постоянку, и у него мало того что тексты убились, так еще и они выросли в размере где-то раз в 10 (или 100, уже не помню).

3. .net - это, конечно, весело. Но геморрой. Я до сих пор не уверен, исправил Иржи дефолт для транзакции read committed (убрал no_rec_version) или нет.
Кроме того, как передавать значения параметров такого типа - х.з., это надо у Иржи спрашивать. Ну и в любом случае использовать самый свежий драйвер .net.
...
Рейтинг: 0 / 0
Как в .net FbRestore добавить опцию fix_fss_metadata ?
    #39936069
Фотография Старый плюшевый мишка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А ещё, если я правильно понимаю насчёт соответствия флагов gbak и синтаксиса работы с провайдером (о котором я ни уха ни рыла), улыбнуло и подвигнуло запастись попкороном вот это
restoreSvc.Options = FbRestoreFlags.Create | FbRestoreFlags.Replace;
Особенно в связи с фейлом рестора на первом же шаге.
...
Рейтинг: 0 / 0
Как в .net FbRestore добавить опцию fix_fss_metadata ?
    #39936084
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Старый плюшевый мишка,

ага. Но тут человек строго соответствовал документации. Раз там написано -c | -r, значит надо писать
FbRestoreFlags.Create | FbRestoreFlags.Replace.
А то, что | в документации это "или" - пофиг.
...
Рейтинг: 0 / 0
Как в .net FbRestore добавить опцию fix_fss_metadata ?
    #39936145
whizzzkey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kdv,

Премного благодарен за развёрнутый ответ, буду использовать gbak через Process.Start().
...
Рейтинг: 0 / 0
Как в .net FbRestore добавить опцию fix_fss_metadata ?
    #39936146
whizzzkey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Старый плюшевый мишка,
Старый плюшевый мишкаулыбнуло и подвигнуло запастись попкороном вот это
restoreSvc.Options = FbRestoreFlags.Create | FbRestoreFlags.Replace;
Очень рад что смог доставить вам положительную эмоцию в виде улыбки, у себя почему то вызвать улыбку этим моментом не получилось, потому что вот здесь по ссылке на исходники ADO .net провайдера на гитхабе
вы сможете увидеть ровно ту же строчку кода, заимствованную мной

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
void RestorePart()
{
  var restoreSvc = new FbRestore();
  restoreSvc.ConnectionString = BuildServicesConnectionString(FbServerType, Compression, WireCrypt, true);

 /*--->*/ restoreSvc.Options = FbRestoreFlags.Create | FbRestoreFlags.Replace;

  restoreSvc.PageSize = FbTestsSetup.PageSize;
  restoreSvc.Verbose = true;
  restoreSvc.Statistics = FbBackupRestoreStatistics.TotalTime | FbBackupRestoreStatistics.TimeDelta;
  restoreSvc.BackupFiles.Add(new FbBackupFile(backupName, 2048));
  restoreSvc.ServiceOutput += ServiceOutput;
  restoreSvc.Execute();
}


Так как в официальных examples к ADO .net провайдеру нет примера как юзать Restore, то мне показалось разумным решением покопаться в исходниках и найти примеры использования FbRestore, к примеру в тестах, что я и сделал. Для меня не совсем очевидно использование флагов именно таким образом в тесте, хотя судя по документации:
Код: html
1.
2.
3.
4.
5.
6.
Интересно, что иногда у людей в командной строке восстановления БД из резервной копии можно встретить и такой оксюморон:
gbak -c -r e.fbk e.fdb

Причина написания такой командной строки кроется в неверном чтении документации по InterBase. Там указано
gbak {-c|-r} [options] source dbfile
Что означает – "или -c, или -r", но никак не оба вместе. Тем не менее, лучше такие неоднозначности не устраивать.


должен использоваться либо первый либо второй. Может быть поделитесь ответом на этот счет?
...
Рейтинг: 0 / 0
Как в .net FbRestore добавить опцию fix_fss_metadata ?
    #39936149
Фотография Старый плюшевый мишка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
whizzzkey

должен использоваться либо первый либо второй. Может быть поделитесь ответом на этот счет?


Совет простой - забыть про -r вообще и навсегда. Эта экономия рано или поздно выйдет боком. Рабочий экземпляр базы всегда должен оставаться лежать где-то в сторонке. Иначе при любом сбое во время рестора станет мучительно больно за бесцельно прожитые годы.
...
Рейтинг: 0 / 0
Как в .net FbRestore добавить опцию fix_fss_metadata ?
    #39936191
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
whizzzkeyМожет быть поделитесь ответом на этот счет?
я замучился отвечать на этот вопрос, и поэтому описал ответ на него в
http://www.ibase.ru/gbak#restore
см. текст сразу после опций рестора. Вы же сами процитировали кусок моего текста, но видимо, дальше читать не стали.
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Как в .net FbRestore добавить опцию fix_fss_metadata ?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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