Гость
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Как в .net FbRestore добавить опцию fix_fss_metadata ? / 12 сообщений из 12, страница 1 из 1
10.03.2020, 14:55
    #39935963
whizzzkey
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в .net FbRestore добавить опцию fix_fss_metadata ?
Добрый день!
Использую сервер 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
10.03.2020, 15:02
    #39935965
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в .net FbRestore добавить опцию fix_fss_metadata ?
10.03.2020 14:55, whizzzkey пишет:
> использовать gbak через Process.Start()?

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

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

Никак. Эта опция при неправильном применении напрочь гробит базу, поэтому давать её в руки
шарпеев нельзя.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
10.03.2020, 15:19
    #39935981
Ivan_Pisarevsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в .net FbRestore добавить опцию fix_fss_metadata ?
Там обрыв! Автору туда можно только после прохождения теста на профпригодность.
...
Рейтинг: 0 / 0
10.03.2020, 15:47
    #39935991
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в .net FbRestore добавить опцию fix_fss_metadata ?
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
10.03.2020, 19:11
    #39936069
Старый плюшевый мишка
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в .net FbRestore добавить опцию fix_fss_metadata ?
А ещё, если я правильно понимаю насчёт соответствия флагов gbak и синтаксиса работы с провайдером (о котором я ни уха ни рыла), улыбнуло и подвигнуло запастись попкороном вот это
restoreSvc.Options = FbRestoreFlags.Create | FbRestoreFlags.Replace;
Особенно в связи с фейлом рестора на первом же шаге.
...
Рейтинг: 0 / 0
10.03.2020, 20:31
    #39936084
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в .net FbRestore добавить опцию fix_fss_metadata ?
Старый плюшевый мишка,

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

Премного благодарен за развёрнутый ответ, буду использовать gbak через Process.Start().
...
Рейтинг: 0 / 0
11.03.2020, 01:14
    #39936146
whizzzkey
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в .net FbRestore добавить опцию fix_fss_metadata ?
Старый плюшевый мишка,
Старый плюшевый мишкаулыбнуло и подвигнуло запастись попкороном вот это
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
11.03.2020, 02:45
    #39936149
Старый плюшевый мишка
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в .net FbRestore добавить опцию fix_fss_metadata ?
whizzzkey

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


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


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