Tato stránka byla strojově přeložena. Přečtěte si anglický originál. English

Knihovna IBSurgeon

Všechny verze On-Disk-Structure (ODS) Firebird a InterBase

Od Dmitrije Kuzmenka, 24. května 2016

Co je číslo On-Disk Structure (ODS)

Jednoduše řečeno, ODS (On-Disk Structure) je číslo formátu databázového souboru pro konkrétní verzi RDBMS Firebird nebo InterBase.

Téměř všechny verze používají tzv. „Y-valve“ pro podporu aktuálního ODS a některých starých ODS. To umožňuje serveru pracovat s databázovými soubory z předchozích verzí a zjednodušuje přechod ze starého serveru na nový. Existují však určitá omezení, která budou popsána dále.

ODS své databáze zjistíte spuštěním následujícího příkazu

Code
gstat -h database_file_name

Uživatelské jméno a heslo zde nejsou potřeba, protože gstat s volbou -h pouze čte fyzickou část databáze (hlavičková stránka, číslo 0).

Pokud gstat přečteným informacím nebude rozumět, zobrazí odpovídající zprávu – co očekával a co našel.

Například pokud spustíme gstat z InterBase 4 na databázi z Firebird 2, zobrazí

Code
Wrong ODS version, expected 8, encountered 32779?

Zde vidíte číslo ODS 32779 – to je zakódovaná hodnota 11 s přidaným vysokým bitem od Firebird 2.0 (v hexadecimálním zápisu to bude 800B, kde B = 11), aby se zabránilo záměně mezi databázemi InterBase a Firebird, protože od určitého okamžiku měly stejné číslo ODS, ale velmi odlišný formát databáze. Výjimkou pro získání srozumitelné zprávy je situace, kdy gstat nemůže najít firebird.msg nebo interbase.msg. Zobrazí něco jako

Code
can't format message 21:3 -- message file ...msg not found

To tedy znamená, že máte nesprávnou instalaci Firebird nebo InterBase a musíte ji opravit.

Několik příkladů:

Wrong ODS version, expected 8, encountered 32779? – InterBase 4.x se pokouší otevřít databázi Firebird 2.x

Wrong ODS version, expected 8, encountered 13? – InterBase 4.x se pokouší otevřít databázi InterBase 2009

Wrong ODS version, expected 15, encountered 32779 – InterBase XE/XE3 se pokouší otevřít databázi Firebird 2.x

Wrong ODS version, expected 11, encountered 11 – Firebird 2.x se pokouší otevřít databázi InterBase 7.x

Wrong ODS version, expected 11, encountered 15 – Firebird 2.x se pokouší otevřít databázi InterBase XE/XE3

Někdy můžete dostat jiný druh zprávy, ze serveru (ne z gstat), ale se stejným významem.

Například když se server Firebird 1.5 pokouší otevřít databázi Firebird 2.x:

Code
unsupported on-disk structure for file ...; found 32779, support 10

Zde vidíte tabulku verzí ODS od InterBase 4.0 (1994).

Verze serveru Hlavní číslo ODS Může pracovat s ODS Poznámka
InterBase 4.0/4.1 8.0
InterBase 4.2 8.2 8.2 InterBase 4.2 násilně povyšuje ODS 8.0 na 8.2
InterBase 5.0/5.1 9.0 8.2 InterBase 5.x násilně povyšuje ODS 8.0 na 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 Je nebezpečné pracovat s ODS 9.x, protože nový InterBase a Firebird používají nový formát metadat, který InterBase 5.x nerozpozná
Firebird 1.5 10.1 9.0/9.1/10.0 ODS 10.1 64bitového Firebird 1.5 je nekompatibilní s 32bitovým ODS 10.1. Toto je jediná známá nekompatibilita formátu databáze mezi 32/64bitovými verzemi.
InterBase 7.0 11.0 10.0 Nekompatibilní s ODS 11 Firebird 2.x
InterBase 7.1 11.1 10.0 InterBase 7.5 povýší ODS 11.0/11.1 na 11.2, což je nekompatibilní s předchozími verzemi (7.0/7.1)
InterBase 7.5 11.2 10.0
Firebird 2.0 11.0 10.x ODS 11 Firebird 2.0 je nekompatibilní s InterBase 7.x
Firebird 2.1 11.1 10.x/11.0 ODS 11 Firebird 2.0 je nekompatibilní s InterBase 7.x
Firebird 2.5 11.2 10.x/11.x ODS 11.2 je nekompatibilní s Firebird 2.0/2.1.
Firebird 3.0 12.0 Nepodporuje předchozí ODS, pouze 12.0
Firebird 4.0 13.0 13.0
Firebird 5.0 13.1 13.0, 13.1 Databázi lze povýšit z 13.0 na 13.1 pomocí gfix -upgrade z 13.0 nebo pomocí zálohy/obnovy
InterBase 2007 12.0 11.x
InterBase 2009 13.1 12.0
InterBase XE, XE3 15.0 13.1 Kde je ODS 14?
InterBase XE7 16.0 15, 13 „Aktuální“ ODS lze nastavit v IBCONFIG. Tímto způsobem bude XE7 vytvářet databáze (včetně obnovy) se zadaným ODS (13, 15, 16) jako výchozím.

Povýšení ODS

Každá verze serveru vždy používá (s výjimkou InterBase XE7) své hlavní číslo ODS pro vytvořenou nebo obnovenou databázi. Pokud je ODS databáze nižší než hlavní ODS serveru, server může s touto databází pracovat, pokud podporuje její ODS.

Někdy může server povýšit starý ODS na nějaký novější, bez upozornění. To může vést k nemožnosti vrátit se zpět k předchozí verzi. Například pokud otevřete databázi s ODS 8.0 pomocí InterBase 4.2, povýší ODS na 8.2, čemuž InterBase 4.0/4.1 nerozumí. Takže drobné povýšení ODS činí databáze nekompatibilními v rámci stejné hlavní verze serveru. To platí také pro Firebird 2.5 a InterBase 7.5.

Abychom se vyhnuli problémům s návratem k předchozí verzi, doporučujeme provádět zálohy na aktuální verzi serveru ještě před drobným povýšením verze serveru.

Rozdíl mezi ODS (hlavním nebo vedlejším) může být obrovský nebo malý. Pokud jste dostatečně zvědaví, můžete otevřít jrd\ods.h (Firebird open source) a najít rozdíly mezi ODS. Například ODS 9.0 ve srovnání s 8.x má deklarativní referenční integritu, SQL role, garbage collection v indexech. Ale ODS 9.1 se od 9.0 liší pouze jedním indexem přidaným do nějaké systémové tabulky.

Všimněte si, že hlavní verzi ODS nelze povýšit za běhu. Můžete ji povýšit pouze pomocí zálohy/obnovy.

Migrace mezi InterBase a Firebird

Poslední verze Firebird (3.0) a InterBase (XE7) jsou velmi odlišné, co se týče funkcí a ODS. Jak bylo řečeno dříve, poslední společný byl ODS 10, a od té doby (Firebird 2.0 a InterBase 7.0) jsou databáze navzájem nekompatibilní svým formátem.

Migrace tedy bude snazší, pokud jste nepoužívali funkce od InterBase 7.x nebo Firebird 1.5. Pokud ano – složitost migrace bude záviset na tom, kolik funkcí jste v databázi nebo v procesu správy použili.

V současnosti, po mnoha letech vývoje Firebird a InterBase, je migrace mezi nejnovějšími verzemi těchto serverů obtížná.

V každém případě, pokud se o to pokusíte, musíte z databáze extrahovat skript metadat a poté se pokusit vytvořit novou databázi z tohoto skriptu pomocí stejného serveru.

Code
isql -x db.gdb …
isql -i script.ddl …

To je třeba provést, abyste zkontrolovali, zda ve vaší databázi nejsou nějaká špatná stará metadata nebo chyby extrakce skriptu v serveru, který používáte. InterBase a Firebird ukládají procedury, triggery a pohledy (a některé další objekty) v kompilované podobě (BLR – Binary Language Representation) a během zálohy/obnovy se metadata nepřekompilovávají (z SQL do BLR).

V tomto případě, pokud byla databáze vytvořena dávno a neustále upravována, mohou pro některé objekty existovat nesprávné (staré) BLR. Tyto objekty mohou stále fungovat, ale pokus o jejich opětovné vytvoření (ALTER) může vyvolat syntaktickou (nebo jinou) chybu.

Poté můžete zkusit vytvořit databázi z opraveného skriptu na novém serveru. Poté, co opravíte všechny nekompatibility v tomto skriptu, můžete přenést data ze staré databáze do nové databáze.

I když jste zkusili provést zálohu na starém serveru a obnovu na novém a fungovalo to – nikdy tomu nevěřte. Pokud vaše databáze obsahuje mnoho objektů, nemůžete je na novém serveru zkontrolovat všechny najednou, takže chyba se objeví až po nějaké době.

Jak se vrátit k předchozí verzi Firebird nebo InterBase

Někdy může být nutné provést downgrade a vrátit se zpět z nového serveru. Důvody mohou být různé – náhlá chyba v serveru, problémy s výkonem a tak dále.

Pokud jste provedli zálohu před povýšením serveru, nebudou s návratem žádné problémy. Pokud ne, narazíte na problém návratu z nového ODS na starý ODS.

K tomu budete potřebovat 2 počítače s novým serverem a starým. Pokud jste nepoužili žádné nové funkce serveru X (verze InterBase nebo Firebird), můžete se vrátit k X-1 podle těchto kroků:

  1. Vezměte nástroj gbak ze serveru X-1 a proveďte s ním zálohu na serveru X
  2. Přeneste zálohu na server X-1 a obnovte ji

Pokud v kroku 1 nastanou nějaké problémy, můžete zkusit

  1. Provést zálohu na serveru X pomocí jeho gbak
  2. Zkopírovat nástroj gbak z X na X-1
  3. Obnovit zálohu na X-1 pomocí gbak z X

Všimněte si, že lokální protokol mezi servery X a X-1 může být nekompatibilní, takže je lepší zadat název serveru:

Code
gbak -b localhost:c:\dir\data.gdb

Výsledek bude úspěšný pouze za podmínky, že jste od povýšení z X-1 nezměnili žádné objekty databáze na serveru X.

Zde jsou příklady:

  • Z 5.x na 4.2 – nesmí být použity žádné role a nová deklarativní referenční integrita
  • Z 6.x na 5.x – žádné změny metadat, protože 6.x používá nový formát BLR
  • Z InterBase 7.x na Firebird – žádné boolean sloupce a názvy objektů delší než 31 znaků.
  • Z Firebird 1.5 na InterBase – žádné BIGINT sloupce a nová SQL rozšíření v triggerech a procedurách
  • Z Firebird 2.0 na Firebird 1.5 – žádná z nových funkcí Firebird 2.0.
  • A tak dále

Pokud stále existují chyby, které nelze opravit, jediným způsobem je vytvořit databázi na serveru X-1 z SQL skriptu a přenést data.

Služba migrace Firebird

Migrace je často složitý úkol, zejména u starších databází Firebird, které původní vývojáři opustili. Naše společnost nabízí komplexní službu migrace pro složité databáze Firebird. Běžný poplatek je 2900 USD.

Například jsme migrovali databázi, jejíž SQL skript měl 55 megabajtů, s více než 5000 uloženými procedurami, 1000 tabulkami a několika tisíci ad hoc SQL dotazy, za méně než 3 měsíce.

Pokud máte jakékoli dotazy, kontaktujte nás prosím na [email protected]