Све верзије Firebird и InterBase On-Disk-Structure (ODS)
Аутор: Дмитриј Кузменко, 24. мај 2016.
Шта је број ODS (On-Disk Structure)
Једноставно речено, ODS (On-Disk Structure) је број формата датотеке базе података за одређену верзију Firebird или InterBase RDBMS-а.
Скоро све верзије користе такозвани „Y-valve” да подрже тренутни ODS и неке старије ODS-ове. То омогућава серверу да ради са датотекама база података из претходних верзија и поједностављује прелазак са старог сервера на нови. Али постоје одређена ограничења, која ће бити описана у наставку.
Можете сазнати ODS ваше базе података покретањем следеће команде:
gstat -h име_датотеке_базе
Корисничко име и лозинка овде нису потребни, јер gstat са опцијом -h само чита физички део базе података (насловну страницу, број 0).
Ако gstat не разуме прочитане информације, приказаће одговарајућу поруку - шта је очекивао и шта је пронашао.
На пример, ако покренемо gstat из InterBase 4 на бази података из Firebird 2, приказаће:
Wrong ODS version, expected 8, encountered 32779?
Овде видите ODS број 32779 - ово је кодирано 11, са додатим високим битом од Firebird 2.0 (у хексадецималном облику то је 800B, где је B = 11), да би се избегла забуна између InterBase и Firebird база података, јер су од одређене тачке имале исти ODS број, али веома различит формат базе. Изузетак од добијања разумљиве поруке је када gstat не може да пронађе firebird.msg или interbase.msg. Приказаће нешто попут:
can't format message 21:3 -- message file ...msg not found
Дакле, то значи да имате нетачну инсталацију Firebird или InterBase-а и да то треба поправити.
Неколико примера:
Wrong ODS version, expected 8, encountered 32779? - InterBase 4.x покушава да отвори Firebird 2.x базу података
Wrong ODS version, expected 8, encountered 13? - InterBase 4.x покушава да отвори InterBase 2009 базу података
Wrong ODS version, expected 15, encountered 32779 - InterBase XE/XE3 покушава да отвори Firebird 2.x базу података
Wrong ODS version, expected 11, encountered 11 - Firebird 2.x покушава да отвори InterBase 7.x базу података
Wrong ODS version, expected 11, encountered 15 - Firebird 2.x покушава да отвори InterBase XE/XE3 базу података
Понекад можете добити другу врсту поруке, од сервера (не од gstat-а), али са истим значењем.
На пример, када Firebird 1.5 сервер покушава да отвори Firebird 2.x базу података:
unsupported on-disk structure for file ...; found 32779, support 10
Овде можете видети табелу ODS верзија, од InterBase 4.0 (1994).
| Верзија сервера | Главни ODS број | Може да ради са ODS | Напомена |
|---|---|---|---|
| InterBase 4.0/4.1 | 8.0 | ||
| InterBase 4.2 | 8.2 | 8.2 | InterBase 4.2 присилно надограђује ODS 8.0 на 8.2 |
| InterBase 5.0/5.1 | 9.0 | 8.2 | InterBase 5.x присилно надограђује ODS 8.0 на 8.2 |
| InterBase 5.5/5.6 | 9.1 | 8.2 | |
| InterBase 6.0 Firebird 1.0 Yaffil 1.0 |
10.0 | 9.0/9.1 | Опасно је радити са ODS 9.x, јер нови InterBase и Firebird користе нови формат метаподатака, који InterBase 5.x не препознаје |
| Firebird 1.5 | 10.1 | 9.0/9.1/10.0 | ODS 10.1 64-битног Firebird 1.5 је некомпатибилан са 32-битним ODS 10.1. Ово је једина позната некомпатибилност формата базе података између 32/64-битних верзија. |
| InterBase 7.0 | 11.0 | 10.0 | Некомпатибилан са ODS 11 Firebird 2.x |
| InterBase 7.1 | 11.1 | 10.0 | InterBase 7.5 ће надоградити InterBase ODS 11.0/11.1 на 11.2, што је некомпатибилно за претходне верзије (7.0/7.1) |
| InterBase 7.5 | 11.2 | 10.0 | |
| Firebird 2.0 | 11.0 | 10.x | ODS 11 Firebird 2.0 је некомпатибилан са InterBase 7.x |
| Firebird 2.1 | 11.1 | 10.x/11.0 | ODS 11 Firebird 2.0 је некомпатибилан са InterBase 7.x |
| Firebird 2.5 | 11.2 | 10.x/11.x | ODS 11.2 је некомпатибилан са Firebird 2.0/2.1. |
| Firebird 3.0 | 12.0 | Не подржава претходне ODS-ове, само 12.0 | |
| Firebird 4.0 | 13.0 | 13.0 | |
| Firebird 5.0 | 13.1 | 13.0, 13.1 | База података се може надоградити са 13.0 на 13.1 помоћу gfix -upgrade са 13.0, или резервном копијом/враћањем |
| InterBase 2007 | 12.0 | 11.x | |
| InterBase 2009 | 13.1 | 12.0 | |
| InterBase XE, XE3 | 15.0 | 13.1 | Где је ODS 14? |
| InterBase XE7 | 16.0 | 15, 13 | „тренутни” ODS се може подесити у IBCONFIG-у. На овај начин XE7 ће креирати базе података (укључујући враћање) са наведеним ODS-ом (13, 15, 16) као подразумеваним. |
ODS надоградња
Свака верзија сервера увек користи (осим InterBase XE7) свој главни ODS број за креирану или враћену базу података. Ако је ODS базе мањи од главног ODS-а сервера, сервер може радити са том базом ако подржава њен ODS.
Понекад сервер може надоградити стари ODS на неки новији, без обавештења. То може довести до немогућности повратка на претходну верзију. На пример, ако отворите базу података са ODS 8.0 помоћу InterBase 4.2, надоградиће ODS на 8.2, што InterBase 4.0/4.1 не разуме. Дакле, мања надоградња ODS-а чини базе података некомпатибилним унутар исте главне верзије сервера. Ово важи и за Firebird 2.5 и InterBase 7.5.
Да бисте избегли проблеме повратка на претходну верзију, препоручујемо прављење резервних копија на тренутној верзији сервера чак и пре мање надоградње ваше верзије сервера.
Разлика између ODS-а (главног или споредног) може бити велика или мала. Ако сте довољно радознали, можете отворити jrd\ods.h (Firebird отворени код) и пронаћи разлике између ODS-ова. На пример, ODS 9.0 у поређењу са 8.x има декларативни референцијални интегритет, SQL улоге, сакупљање отпада у индексима. Али ODS 9.1 се разликује од 9.0 само по једном индексу, додатом у неку системску табелу.
Имајте на уму да се главна ODS верзија не може надоградити у ходу. Можете је надоградити само резервном копијом/враћањем.
Миграција између InterBase и Firebird-а
Последње верзије Firebird-а (3.0) и InterBase-а (XE7) веома се разликују, по функцијама и ODS-у. Као што је раније речено, последњи заједнички је био ODS 10, и од тада (Firebird 2.0 и InterBase 7.0) базе података су некомпатибилне по свом формату.
Дакле, миграција ће бити лакша ако нисте користили функције од InterBase 7.x или Firebird 1.5. Ако јесте - сложеност миграције зависиће од тога колико функција сте користили у бази података или процесу администрације.
Тренутно, након много година развоја Firebird-а и InterBase-а, миграција између најновијих верзија ових сервера је тешка.
У сваком случају, ако покушате ово да урадите, потребно је да извучете скрипту метаподатака из базе података, а затим покушате да креирате нову базу података из те скрипте, користећи исти сервер.
isql -x db.gdb …
isql -i script.ddl …
Ово треба урадити да бисте проверили да ли постоје лоши стари метаподаци у вашој бази података или грешке у извлачењу скрипте на серверу који користите. InterBase и Firebird чувају процедуре, окидаче и погледе (и неке друге објекте) у компилованом облику (BLR - Binary Language Representation), а током резервне копије/враћања метаподаци се не рекомпајлирају (из SQL-а у BLR).
У овом случају, ако је база података креирана давно и стално мењана, може постојати нетачан (стари) BLR за неке објекте. Ти објекти могу и даље радити, али покушај њиховог поновног креирања (ALTER) може изазвати синтаксну (или другу) грешку.
Затим можете покушати да креирате базу података из исправљене скрипте на новом серверу. Након што поправите све некомпатибилности у овој скрипти, можете пребацити податке из старе базе у нову.
Чак и ако сте покушали резервну копију на старом серверу и враћање на новом, и успело је - никада не верујте томе. Ако ваша база садржи много објеката, не можете проверити све одједном на новом серверу, па ће се грешка појавити касније.
Како се вратити на претходну верзију Firebird-а или InterBase-а
Понекад ће вам можда бити потребно да извршите спуштање верзије и вратите се са новог сервера. Разлози могу бити различити - изненадна грешка у серверу, проблеми са перформансама и слично.
Ако сте направили резервну копију пре надоградње сервера, неће бити проблема са повратком. Али ако нисте, суочићете се са проблемом повратка са новог ODS-а на стари ODS.
За то ће вам бити потребна 2 рачунара са новим сервером и старим. Ако нисте користили ниједну нову функцију сервера X (верзије InterBase-а или Firebird-а), можете се вратити на X-1 пратећи ове кораке:
- Узмите gbak алатку са сервера X-1 и направите резервну копију користећи је на серверу X
- Пренесите резервну копију на X-1 сервер и вратите је
Ако постоје проблеми у кораку 1, можете покушати
- Направите резервну копију на серверу X, користећи његов gbak
- Копирајте gbak алатку са X на X-1
- Вратите резервну копију на X-1 користећи gbak са X
Имајте на уму да локални протокол између сервера X и X-1 може бити некомпатибилан, па је боље навести име сервера:
gbak -b localhost:c:\dir\data.gdb
Резултат ће бити успешан само под условом да нисте мењали ниједан објекат базе података на серверу X од када сте надоградили са X-1.
Ево примера:
- Са 5.x на 4.2 - не смеју се користити роле и нови декларативни референцијални интегритет
- Са 6.x на 5.x - без измена метаподатака, јер 6.x користи нови BLR формат
- Са InterBase 7.x на Firebird - без boolean колона и имена објеката дужих од 31 карактера.
- Са Firebird 1.5 на InterBase - без BIGINT колона и нових SQL проширења у тригерима и процедурама
- Са Firebird 2.0 на Firebird 1.5 - без нових функционалности Firebird 2.0.
- И тако даље
Ако и даље постоје грешке које се не могу поправити, једини начин је да креирате базу података на X-1 серверу из SQL скрипте и пребаците податке.
Firebird Migration сервис
Често је миграција сложен задатак, посебно за старије Firebird базе података, које су напустили оригинални програмери. Наша компанија нуди свеобухватан сервис миграције за сложене Firebird базе података. Редовна накнада је USD$2900.
На пример, мигрирали смо базу података чија је SQL скрипта била 55 мегабајта, са више од 5000 ускладиштених процедура, 1000 табела и неколико хиљада ad hoc SQL упита, за мање од 3 месеца.
Ако имате било каквих питања, контактирајте нас [email protected]