Deze pagina is automatisch vertaald. Lees het Engelse origineel. English

IBSurgeon-bibliotheek

Alle Firebird- en InterBase On-Disk-Structure (ODS)-versies

Door Dmitry Kuzmenko, 24 mei 2016

Wat is het On-Disk Structure (ODS)-nummer

In eenvoudige bewoordingen is ODS (On-Disk Structure) een nummer van het databasebestandsformaat voor de specifieke versie van Firebird of InterBase RDBMS.

Bijna alle versies gebruiken de zogenaamde “Y-valve” om de huidige ODS en enkele oude ODS te ondersteunen. Hierdoor kan de server werken met databasebestanden van eerdere versies en wordt de overgang van de oude server naar een nieuwe vereenvoudigd. Maar er zijn enkele beperkingen, die verderop worden beschreven.

U kunt de ODS van uw database achterhalen door het volgende commando uit te voeren

Code
gstat -h database_file_name

Gebruikersnaam en wachtwoord zijn hier niet nodig, omdat gstat met de optie -h alleen het fysieke deel van de database leest (headerpagina, nummer 0).

Als gstat de gelezen informatie niet begrijpt, toont het een bijbehorend bericht - wat het verwachtte, en wat het aantrof.

Als we bijvoorbeeld gstat van InterBase 4 uitvoeren op een database van Firebird 2, dan toont het

Code
Wrong ODS version, expected 8, encountered 32779?

Hier ziet u ODS-nummer 32779 - dit is gecodeerde 11, met de hoge bit toegevoegd sinds Firebird 2.0 (in hex is dat 800B, waarbij B = 11), om verwarring tussen InterBase- en Firebird-databases te voorkomen, omdat ze vanaf een bepaald punt hetzelfde ODS-nummer hadden, maar een heel ander databaseformaat. De uitzondering op het krijgen van een begrijpelijk bericht is wanneer gstat firebird.msg of interbase.msg niet kan vinden. Dan toont het iets als

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

Dit betekent dus dat u een onjuiste Firebird- of InterBase-installatie hebt, en dat u dat moet oplossen.

Enkele voorbeelden:

Wrong ODS version, expected 8, encountered 32779? - InterBase 4.x probeert een Firebird 2.x-database te openen

Wrong ODS version, expected 8, encountered 13? - InterBase 4.x probeert een IntrBase 2009-database te openen

Wrong ODS version, expected 15, encountered 32779 - InterBase XE/XE3 probeert een Firebird 2.x-database te openen

Wrong ODS version, expected 11, encountered 11 - Firebird 2.x probeert een InterBase 7.x-database te openen

Wrong ODS version, expected 11, encountered 15- Firebird 2.x probeert een InterBase XE/XE3-database te openen

Soms kunt u een ander soort bericht krijgen, van de server (niet van gstat), maar met dezelfde betekenis.

Bijvoorbeeld, wanneer de Firebird 1.5-server een Firebird 2.x-database probeert te openen:

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

Hier ziet u de tabel met ODS-versies, sinds InterBase 4.0 (1994).

Serverversie Hoofd-ODS-nummer Kan werken met ODS Opmerking
InterBase 4.0/4.1 8.0
InterBase 4.2 8.2 8.2 InterBase 4.2 upgradet ODS 8.0 geforceerd naar 8.2
InterBase 5.0/5.1 9.0 8.2 InterBase 5.x upgradet ODS 8.0 geforceerd naar 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 Het is gevaarlijk om met ODS 9.x te werken, omdat nieuwe InterBase en Firebird een nieuw metadataformaat gebruiken, dat niet door InterBase 5.x wordt herkend
Firebird 1.5 10.1 9.0/9.1/10.0 ODS 10.1 van 64bit Firebird 1.5 is incompatibel met 32bit ODS 10.1. Dit is de enige bekende incompatibiliteit van het databaseformaat tussen 32/64bit-versies.
InterBase 7.0 11.0 10.0 Incompatibel met ODS 11 van Firebird 2.x
InterBase 7.1 11.1 10.0 InterBase 7.5 zal InterBase ODS 11.0/11.1 upgraden naar 11.2, wat incompatibel is voor eerdere versies (7.0/7.1)
InterBase 7.5 11.2 10.0
Firebird 2.0 11.0 10.x ODS 11 van Firebird 2.0 is incompatibel met InterBase 7.x
Firebird 2.1 11.1 10.x/11.0 ODS 11 van Firebird 2.0 is incompatibel met InterBase 7.x
Firebird 2.5 11.2 10.x/11.x ODS 11.2 is incompatibel met Firebird 2.0/2.1.
Firebird 3.0 12.0 Ondersteunt geen eerdere ODS, alleen 12.0
Firebird 4.0 13.0 13.0
Firebird 5.0 13.1 13.0, 13.1 Database kan van 13.0 naar 13.1 worden geüpgraded met gfix -upgrade vanaf 13.0, of met backup/restore
InterBase 2007 12.0 11.x
InterBase 2009 13.1 12.0
InterBase XE, XE3 15.0 13.1 Waar is ODS 14?
InterBase XE7 16.0 15, 13 “huidige” ODS kan worden ingesteld in IBCONFIG. Op deze manier maakt XE7 databases (inclusief restore) met de opgegeven ODS (13, 15, 16) als standaard.

ODS-upgrade

Elke serverversie gebruikt altijd (behalve InterBase XE7) zijn hoofd-ODS-nummer voor de aangemaakte of gerestorede database. Als de ODS van de database lager is dan de hoofd-ODS van de server, kan de server met die database werken als hij de ODS ondersteunt.

Soms kan de server een oude ODS upgraden naar een nieuwere, zonder melding. Dit kan ertoe leiden dat terugkeren naar de vorige versie onmogelijk wordt. Als u bijvoorbeeld een database met ODS 8.0 opent met InterBase 4.2, dan upgradet het de ODS naar 8.2, wat niet begrijpelijk is voor InterBase 4.0/4.1. Dus de kleine upgrade van ODS maakt databases incompatibel binnen dezelfde hoofdserverversie. Dit geldt ook voor Firebird 2.5 en InterBase 7.5.

Om problemen bij het terugkeren naar de vorige versie te voorkomen, raden we aan om back-ups te maken op de huidige serverversie, zelfs vóór de kleine upgrade van uw serverversie.

Het verschil tussen ODS (hoofd of minor) kan enorm zijn, of klein. Als u nieuwsgierig genoeg bent, kunt u jrd\ods.h openen (Firebird open source) en de verschillen tussen ODS vinden. ODS 9.0 heeft bijvoorbeeld vergeleken met 8.x declaratieve referentiële integriteit, SQL-rollen, garbage collection in indices. Maar ODS 9.1 verschilt van 9.0 alleen door één index, toegevoegd aan een systeemtabel.

Let op dat de hoofd-ODS-versie niet on-the-fly kan worden geüpgraded. U kunt deze alleen upgraden via backup/restore.

Migratie tussen InterBase en Firebird

De laatste versies van Firebird (3.0) en InterBase (XE7) zijn heel verschillend, qua functies en ODS. Zoals eerder gezegd was de laatste gemeenschappelijke ODS 10, en sindsdien (Firebird 2.0 en InterBase 7.0) zijn databases incompatibel met elkaars formaat.

Dus de migratie zal eenvoudiger zijn als u geen functies hebt gebruikt sinds InterBase 7.x of Firebird 1.5. Zo ja - dan hangt de complexiteit van de migratie af van hoeveel functies u hebt gebruikt in de database of het beheerproces.

Momenteel, na vele jaren van Firebird- en InterBase-ontwikkeling, is migratie tussen de nieuwste versies van deze servers moeilijk.

Hoe dan ook, als u dit probeert, moet u een metadatascript uit de database extraheren en vervolgens proberen de nieuwe database vanuit dat script aan te maken, met dezelfde server.

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

Dit moet worden gedaan om te controleren of er slechte oude metadata in uw database zitten of bugs in de scriptextractie in de server die u gebruikt. InterBase en Firebird slaan procedures, triggers en views (en enkele andere objecten) op in gecompileerde vorm (BLR - Binary Language Representation), en tijdens backup/restore worden metadata niet opnieuw gecompileerd (van SQL naar BLR).

In dit geval, als een database lang geleden is aangemaakt en voortdurend is gewijzigd, kan er onjuiste (oude) BLR voor sommige objecten zijn. Deze objecten kunnen nog steeds werken, maar een poging ze opnieuw aan te maken (ALTER) kan een syntax- (of andere) fout opleveren.

Dan kunt u proberen een database aan te maken vanuit het gecorrigeerde script op de nieuwe server. Nadat u alle incompatibiliteiten in dit script hebt opgelost, kunt u gegevens van de oude database naar de nieuwe database pompen.

Zelfs als u een backup hebt geprobeerd op de oude server en een restore op de nieuwe, en het werkte - vertrouw dit nooit. Als uw database veel objecten bevat, kunt u ze niet allemaal tegelijk op de nieuwe server controleren, dus de fout zal zich enige tijd later voordoen.

Hoe terug te keren naar de vorige versie van Firebird of InterBase

Soms moet u misschien een downgrade uitvoeren en terugkeren van de nieuwe server. Redenen kunnen verschillen - een plotselinge bug in de server, prestatieproblemen, enzovoort.

Als u de backup hebt gemaakt vóór de serverupgrade, zijn er geen problemen om terug te keren. Maar zo niet, dan zult u het probleem tegenkomen van het terugkeren van de nieuwe ODS naar de oude ODS.

Om dat te doen hebt u 2 computers nodig met de nieuwe server en de oude. Als u geen nieuwe functies van server X hebt gebruikt (versie van InterBase of Firebird), dan kunt u terugkeren naar X-1 door deze stappen te volgen:

  1. Neem het gbak-hulpprogramma van server X-1, en maak daarmee een backup op server X
  2. Draag de backup over naar de X-1-server, en restore deze

Als er problemen zijn bij stap 1, kunt u proberen

  1. Maak een backup op server X, met behulp van zijn gbak
  2. Kopieer het gbak-hulpprogramma van X naar X-1
  3. Restore de backup op X-1 met behulp van gbak van X

Let op dat het lokale protocol tussen servers X en X-1 incompatibel kan zijn, dus het is beter om de servernaam op te geven:

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

Het resultaat zal alleen succesvol zijn op voorwaarde dat u geen van de databaseobjecten op server X hebt gewijzigd sinds u van X-1 hebt geüpgraded.

Hier zijn voorbeelden:

  • Van 5.x naar 4.2 - er mogen geen rollen en nieuwe declaratieve referentiële integriteit zijn gebruikt
  • Van 6.x naar 5.x - geen metadatwijzigingen, omdat 6.x een nieuw BLR-formaat gebruikt
  • Van InterBase 7.x naar Firebird - geen boolean-kolommen en objectnamen langer dan 31 tekens.
  • Van Firebird 1.5 naar InterBase - geen BIGINT-kolommen en nieuwe SQL-uitbreidingen in triggers en procedures
  • Van Firebird 2.0 naar Firebird 1.5 - geen van de nieuwe Firebird 2.0-functionaliteit.
  • Enzovoort

Als er nog steeds fouten zijn die niet kunnen worden opgelost, is de enige manier om de database op de X-1-server aan te maken vanuit het SQL-script en gegevens te pompen.

Firebird-migratieservice

Vaak is de migratie een complexe taak, vooral voor legacy Firebird-databases, die door de oorspronkelijke ontwikkelaars zijn verlaten. Ons bedrijf biedt de uitgebreide migratieservice voor de complexe Firebird-databases. Het reguliere tarief is USD$2900.

We hebben bijvoorbeeld de database gemigreerd waarvan het SQL-script 55 Megabytes was, met meer dan 5000 stored procedures, 1000 tabellen en enkele duizenden ad hoc SQL-query’s, in minder dan 3 maanden.

Als u vragen hebt, neem dan contact met ons op via [email protected]