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

Knihovna IBSurgeon

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

By Dmitry Kuzmenko, 24-May-2016

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

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

Téměř všechny verze používají takzvaný „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 vaší databáze zjistíte spuštěním následujícího příkazu

Code
gstat -h database_file_name

Uživatel a heslo zde nejsou nutné, protože gstat s volbou -h pouze čte fyzickou část databáze (hlavičkovou stránku, číslo 0).

Pokud gstat nerozumí přečteným informacím, zobrazí odpovídající hlášení - co očekával a co našel.

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

Code
Wrong ODS version, expected 8, encountered 32779?

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

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

To znamená, že máte nesprávnou instalaci Firebird nebo InterBase a je třeba 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 získat jiný druh hlášení, 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 Práce s ODS 9.x je nebezpečná, 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ýší InterBase ODS 11.0/11.1 na 11.2, což je nekompatibilní pro předchozí verze (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 XE7 vytvoří databáze (včetně obnovy) se zadaným ODS (13, 15, 16) jako výchozím.

Upgrade ODS

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

Někdy může server povýšit starý ODS na novější, bez upozornění. To může vést k nemožnosti návratu na předchozí verzi. Například, pokud otevřete databázi s ODS 8.0 pomocí InterBase 4.2, povýší ODS na 8.2, kterému InterBase 4.0/4.1 nerozumí. Takže menší upgrade 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 na předchozí verzi, doporučujeme provádět zálohy na aktuální verzi serveru ještě před menším upgradem 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ěkteré 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) se velmi liší, funkcemi i 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 nekompatibilní svým formátem.

Migrace bude tedy 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 použili v databázi nebo v procesu správy.

V současné době, 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 extrahovat skript metadat z databáze 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 v extrakci skriptu na serveru, který používáte. InterBase a Firebird ukládají procedury, triggery a pohledy (a některé další objekty) v kompilované formě (BLR - Binary Language Representation), a během zálohy/obnovy nejsou metadata znovu kompilována (z SQL do BLR).

V tomto případě, pokud byla databáze vytvořena dávno a neustále upravována, může být pro některé objekty nesprávné (staré) BLR. Tyto objekty mohou stále fungovat, ale pokus o jejich znovuvytvoř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. Po opravě všech nekompatibilit v tomto skriptu můžete přečerpat data ze staré databáze do nové.

I když jste zkusili 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 všechny najednou zkontrolovat na novém serveru, takže chyba se objeví až později.

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

Někdy můžete potřebovat provést downgrade a vrátit se zpět z nového serveru. Důvody se mohou lišit - náhlá chyba v serveru, problémy s výkonem atd.

Pokud jste provedli zálohu před upgradem serveru, nebude problém se vrátit zpět. Ale 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 na X-1 podle těchto kroků:

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

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

  1. Proveďte zálohu na serveru X pomocí jeho gbak
  2. Zkopírujte utilitu gbak z X na X-1
  3. Obnovte 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 na serveru X nezměnili žádné databázové objekty od doby, kdy jste povýšili z X-1.

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á nová funkcionalita Firebird 2.0.
  • A tak dále

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

Služba migrace Firebird

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

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]