Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Umstellung InterBase 7.5 -> Firebird 2.5 (https://www.delphipraxis.net/193086-umstellung-interbase-7-5-firebird-2-5-a.html)

mjustin 19. Jun 2017 10:30

Datenbank: Firebird • Version: 2.5 • Zugriff über: gbak

Umstellung InterBase 7.5 -> Firebird 2.5
 
Hallo,

eine InterBase Datenbank 7.5 (ODS 11.2) kann in Firebird 2.5 nicht geöffnet werden, ODS 11.2 in Firebird ist offensichtlich nicht kompatibel:

Code:
unsupported on-disk structure for file C:\I4\DB\TS2-RESTORED-1.GDB; found 11.2, support 11.2.
Beim Versuch, ein InterBase Backup einzulesen kommt man etwas weiter, allerdings bricht das Restore ab

Zitat:

C:\Windows\system32>"C:\Program Files\Firebird\Firebird_2_5\bin\gbak" -user SYSD
BA -password masterkey -r c:\i4\db\i4-d.gbk c:\i4\db\d.gdb -FIX_FSS_METADATA Win
1252 -FIX_FSS_DATA Win1252
...
gbak:do not recognize table attribute 18 -- continuing
gbak:do not recognize table attribute 18 -- continuing
gbak:do not recognize table attribute 18 -- continuing
gbak:do not recognize table attribute 18 -- continuing
gbak:do not recognize table attribute 18 -- continuing
gbak:do not recognize table attribute 18 -- continuing
gbak: ERROR:string truncated
gbak:Exiting before completion due to errors
Die Datenbank validiert in InterBase ohne Fehler.

Ist es über gbak "im Prinzip" möglich eine InterBase 7.5 Datenbank zu restoren oder setze ich gerade auf das falsche Pferd?

mkinzler 19. Jun 2017 13:21

AW: Umstellung InterBase 7.5 -> Firebird 2.5
 
Lasse Dir ein SQL-Skript erstellen, dann sollte es funktionieren. DIE ODS-Versionen sind nicht kompatibel, deshalb funktioniert auch eine Backup/Restore nicht.

mjustin 19. Jun 2017 14:07

AW: Umstellung InterBase 7.5 -> Firebird 2.5
 
Zitat:

Zitat von mkinzler (Beitrag 1374864)
Lasse Dir ein SQL-Skript erstellen, dann sollte es funktionieren. DIE ODS-Versionen sind nicht kompatibel, deshalb funktioniert auch eine Backup/Restore nicht.

Das SQL Skript (erstellt mit IBExpert) lässt sich leider nicht importieren.

Ein Beispiel: die maximale Länge der Generatornamen ist in Firebird kürzer:

Zitat:

BLR syntax error. Identifier GEN_KLR_KOSTENBUCHUNG_BEMERKUNG... is too long
-Name longer than database column size
Das gesamte Fehlerprotokoll mit 7000 Zeilen will ich hier nicht anhängen.


Viele der Fehlermeldungen sind leicht in der InterBase Datenbank korrigierbar. Ein großer Teil entfällt auf das Keyword DESCRIBE (Descriptions der Metadaten-Objekte). Das kann man allerdings in IBExpert über eine Option anpassen, dann werden COMMENT Statements im SQL Skript erzeugt.

Andere sind noch unklar (z.B. Fehlemeldungen die sich auf eine "ORDER BY" clause beziehen, die aber im SQL Statement der Stored Prozedure gar nicht enthalten ist:

Zitat:

Invalid expression in the ORDER BY clause (not contained in either an aggregate function or the GROUP BY clause)
Weitere Recherchen folgen :)

mikhal 19. Jun 2017 15:05

AW: Umstellung InterBase 7.5 -> Firebird 2.5
 
Schau mal, ob dir die Data Pump von EMS weiterhilft...

Kostet zwar Geld, aber es gibt eine Testversion, die trotz ihrer Einschränkungen zumindest für einen Test hinreichend sein sollte!

Grüße
Mikhal

hanvas 19. Jun 2017 16:52

AW: Umstellung InterBase 7.5 -> Firebird 2.5
 
Zitat:

Zitat von mjustin (Beitrag 1374870)

Das SQL Skript (erstellt mit IBExpert) lässt sich leider nicht importieren.
Ein Beispiel: die maximale Länge der Generatornamen ist in Firebird kürzer:

Nicht nur die Generatornamen. Die wesentlichen Einschränkungen IB 7.5->FB2.5 dürften sein :

Objektnamen dürfen bei Firebird 2.5 nicht länger als 31 Zeichen sein.
Spalten mit boolschen Werten werden nicht unterstützt.

Dementsprechend erst alle Objektnamen auf 31 Zeichen kürzen und boolsche Spalten durch andere Domain / Werte ersetzen. Welche Objekte Namen haben die länger als 31 Zeichen sind kann man durch Zugriff auf die Systemtabellen erfragen (http://docwiki.embarcadero.com/Inter.../System_Tables).

Ich würde dafür ein kleines Programm basteln das eine Liste mit Objektnamen > 31 Zeichen erstellt und für jeden Namen eine Ersetzung mit weniger als 31 Zeichen bastelt. Anschließend könntest Du anhand dieser Liste das SQL Script so bearbeiten das jedes Vorkommen mit mehr als 31 Zeichen durch den neuen Namen ersetzt wird.

Es müsste (bei entsprechenden Rechten) auch möglich sein die Objektnamen direkt in den Systemtabellen zu ändern, über die Nebenwirkungen kann ich nichts sagen.

cu Ha-Jö

hoika 19. Jun 2017 18:35

AW: Umstellung InterBase 7.5 -> Firebird 2.5
 
Hallo,
Zitat:

Name longer than database column size
Vielleicht mit höherer PageSize restoren?

aus dem Kopf
gbak -page_size 16384

hstreicher 19. Jun 2017 20:01

AW: Umstellung InterBase 7.5 -> Firebird 2.5
 
Nein , das Limit ist "Hardcoded"

https://stackoverflow.com/questions/...le-name-length

es gibt Pläne das in V4 zu erhöhen

mfg Hannes

mjustin 20. Jun 2017 11:25

AW: Umstellung InterBase 7.5 -> Firebird 2.5
 
Danke für die vielen Antworten und Tipps!

Insgesamt ist der Versuch der Portierung eine empfehlenswerte Erfahrung, einige Probleme in den Metadaten werden von Firebird beim Einlesen des SQL Skripts erkannt, zum Beispiel

* uneindeutige Felder (ohne Alias)
* order by nach einem Feld das nicht in der Datenmenge vorkommt ("SELECT MIN(FELD) FROM TABELLE ORDER BY ANDERES_FELD"). InterBase akzeptiert dies, Firebird nicht. Es war in einer Stored Procedure tatsächlich damit ein Performancegewinn erreicht worden (anderer PLAN).

Die überlangen Generatornamen lassen sich, da es nur wenige sind, noch mit vertretbarem Aufwand ändern.

mjustin 20. Jun 2017 13:21

AW: Umstellung InterBase 7.5 -> Firebird 2.5
 
Für Abfragen für Metadaten mit Namen länger ab 31 Zeichen konnte ich die substr UDF verwenden:

Zitat:

select rdb$constraint_name, substr(rdb$constraint_name, 31, 31), rdb$const_name_uq
from rdb$ref_constraints
where substr(rdb$constraint_name, 31, 31) <> ' '

select rdb$index_name, substr(rdb$index_name, 31, 31)
from rdb$indices
where substr(rdb$index_name, 31, 31) <> ' '

select rdb$trigger_name, substr(rdb$trigger_name, 31, 31)
from rdb$triggers
where substr(rdb$trigger_name, 31, 31) <> ' '
Constraints können direkt umbenannt werden, Indexdateien sowie Trigger werden gelöscht und neu angelegt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:58 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz