Firebird auf Debian 13 (Trixie)

Nach einem Dist-Upgrade auf Debian Trixie liefen meine die Firebird-Datenbank benutzenden eigenen Tools nicht mehr und es hat mich einige (!) Minuten gekostet, herauszufinden, was da genau die Ursache war. Vielleicht RTFM, aber Google & Co. fanden trotz neuerdings intensiver KI-Unterstützung nichts. (*)

Ein „apt search firebird“ liefert Hinweise, dass bei Debian 13 sowohl Firebird 3.0 als auch Firebird 4.0 installiert werden. Ein „apt install firebird“ spült beide Versionen ins System und damit auch Konfigurationsdateien für beide Versionen, die Verzeichniss „/etc/firebird/3.0“ und „/etc/firebird/4.0“ vorhanden.

Obwohl ein „service firebird3.0 status“ zeigte, dass Firebird lief, kam dies hier:

$ isql-fb localhost:foo
Statement failed, SQLSTATE = 08006
Unable to complete network request to host "localhost".
-Failed to establish a connection.
Use CONNECT or CREATE DATABASE to specify a database
SQL>

Hmm. Da schaut man erst einmal blöd und vermutet eine Fehlkonfiguration des Netzwerks, aber das lief ja. Oder irgendwas mit IPv4 und IPv6? Wenn ich mittels „CREATE DATABASE ‚foo.fdb‘;“ eine neue Datenbank erzeugte, dann gehörte diese anschließend nicht firebird:firebird sondern dem aktuellen Benutzer, und natürlich gelang dies nur in einem Verzeichnis, in dem der aktuelle Benutzer Schreibrechte hat. WTF ging hier vor sich?

Die Konfiguration in „/etc/firebird/3.0“ entsprach größtenteils der auf einem anderen Rechner, auf dem Firebird problemlos lief und immer noch läuft. Nach dem ich in der „/etc/firebird/3.0/firebird.conf“…

RemoteBindAddress =
RemoteAccess = true

… konfiguriert und ein „service firebird3.0 restart“ durchgeführt hatte, kam ich auch wieder von remote auf meine existierende Datenbank. Aber lokal kam weiterhin die obige Fehlermeldung mit „Unable to complete network request to host“. Auch „servername:foo“ oder „127.0.0.1:foo“ nützte nichts. Was passierte hier?

Mittels

strace isql-fb localhost:foo 2> /tmp/strace.log

habe ich geschaut, was da genau passiert. Und siehe da: es ist alles voller „4.0“. Auszüge aus dem erzeugten Log:

execve("/usr/lib/firebird/4.0/bin/isql-fb
openat(AT_FDCWD, "/usr/lib/x86_64-linux-gnu/firebird/4.0/firebird.conf

Obwohl der Server in Version 3.0 läuft, wird eine Version 4.0 von isql-fb gestartet, das auch die Konfiguration aus dem 4.0-Verzeichnis liest. Hä?

Ein Blick in „more $(which isql-fb)“ zeigt: Das ist ein Wrapper-Script, das abhängig von einer gesetzten Umgebungsvariable $FIREBIRD_VERSION die passende Version von isql-fb startet. Default ist 4.0, sprich wenn nicht gesetzt, dann wird isql 4.0 gestartet.

$ isql-fb -z localhost:foo -u sysdba -p masterkey
ISQL Version: LI-V4.0.5.3140 Firebird 4.0
Statement failed, SQLSTATE = 08006
Unable to complete network request to host "localhost".
-Failed to establish a connection.
Use CONNECT or CREATE DATABASE to specify a database
SQL> exit;

$ export FIREBIRD_VERSION=4.0

$ isql-fb -z localhost:foo -u sysdba -p masterkey
ISQL Version: LI-V4.0.5.3140 Firebird 4.0
Statement failed, SQLSTATE = 08006
Unable to complete network request to host "localhost".
-Failed to establish a connection.
Use CONNECT or CREATE DATABASE to specify a database
SQL> exit;

$ export FIREBIRD_VERSION=3.0

$ isql-fb -z localhost:foo -u sysdba -p masterkey
ISQL Version: LI-V3.0.12.33787 Firebird 3.0
Server version:
LI-V3.0.12.33787 Firebird 3.0
LI-V3.0.12.33787 Firebird 3.0/tcp (dd13)/P15:C
LI-V4.0.5.3140 Firebird 4.0/tcp (dd13)/P15:C
Database: localhost:foo, User: SYSDBA
SQL> select 'Hallelujah' from RDB$Database;

CONSTANT 
========== 
Hallelujah

Aber warum genau scheitert isql-fb 4.0? Darum:

$ cat /etc/firebird/3.0/service-port.conf 
RemoteServicePort = 3050

$ cat /etc/firebird/4.0/service-port.conf 
RemoteServicePort = 3051

Firebird 3.0 lauscht auf Port 3050, isql-fb 4.0 möchte sich allerdings auf Port 3051 verbinden. Irgendjemand im Firebird- oder Debian-Team (?) hat sich wohl gedacht, dass es ganz furchtbar schlau ist, für den Default-Firebird-Client genau den Port zu verwenden, den der Default-Firebird-Server aber gar nicht verwendet. :rolleyes:

Jetzt muss ich nur noch schauen, was das alles für Auswirkungen auf meine PHP- und Perl-Scripts hat und wie ich die wieder zum Laufen bekomme… Fortsetzung folgt.


(*) Mal schauen, ob und wann die Inhalte dieser Seite von ihnen gefunden werden.

Lazarus, UTF8, Firebird und Default Character Set NONE

Ich habe in den letzten Tagen ein wenig mit Lazarus herumgespielt, um damit eventuell (auf Linux) portierbare Frontends für alte, existierende Datenbanken zu bauen. Dabei bin ich über die Problematik gestolpert, dass Lazarus standardmäßig überall mit UTF8 arbeitet, die alten Datenbanken sich aber um Zeichensätze nicht gekümmert haben. Alte Frontends liefen unter Windows irgendwie mit einem Zeichensatz vergleichbar (identisch?) mit ISO Latin 1 (a.k.a ISO 8859-1), der Firebird-Datenbank war es eh egal, was an Zeichen rausgeholt und darin gesichert wurde, kurzum: passte alles. Mit Lazarus/UTF8 und alten Datenbankinhalten in Latin-1 wird alles ein wenig herausfordernder. Aber letztlich ist das alles nichts wirklich Wildes, wenn man weiß, wie es funktioniert.

Man hat drei Möglichkeiten, mit dieser Herausforderung umzugehen:

  1. Für neue Projekte legt man die Datenbank selbst („create database ‚/path/to/db/foobar.fdb‘ default character set UTF8;“) und alle Spalten („foo varchar(42) character set UTF8“) direkt als UTF8 an. Dann muss man im mit Lazarus und den Firebird/Interbase-Datenbankkomponenten gebauten Frontend (so gut wie nichts) beachten.
  2. Ältere Datenbanken konvertiert man komplett mit allen Spalten und allen Inhalten von NONE auf UTF8. Dann hat man wie oben im Frontend auch Ruhe, aber solch eine Konvertierung kann in Arbeit ausarten.
  3. Oder man lässt die alte Datenbank in Ruhe und sorgt im neuen Frontend an den entscheidenden Stellen manuell für eine Zeichensatzumwandlung.

Für den dritten Fall ist Folgendes zu tun (ohne Anspruch auf Vollständigkeit):

  • TIBConnection: Die Datenbankverbindung auf CharSet:= ‚ISO8859_1‘ setzen und mittels UseConnectionCharSetIfNone:= True eine automatische Umwandlung von Datenbankinhalten für die visuellen Datenbankkomponenten aktivieren. In einem DBGrid beispielsweise werden deutsche Umlaute dann richtig dargestellt (stünde das hingegen auf False, dann sähe man nur Fragezeichen statt Umlauten)
  • uses … LConvEncoding
  • Bei jeder TSQLQuery müssen Zeichenketten aus dem Frontend in Richtung Datenbank mittels UTF8ToISO_8859_1() umgewandelt werden. Wer sich SQL-Statements also zusammenbaut und dafür die Inhalte von Eingabefelder verwendet, muss die erst einmal durch die Zeichensatzumwandlung jagen.

Eventuell schreibe ich es demnächst noch ausführlicher auf, aber der geneigte Lazarus-Programmierer sollte vielleicht damit schon auf den richtigen Lösungsweg kommen.

Links:

Unter Windows mit LibreOffice auf Firebird-Datenbanken zugreifen

Um unter Windows7 oder Windows10 mit LibreOffice auf die Inhalte einer Datenbank eines Firebird-Datenbank-Servers zugreifen zu können, ist Folgendes zu tun (in meinem Fall läuft Firebird als Superserver unter Ubuntu 16.04 LTS):

  • Auf dem Server den Remote-Zugriff ermöglichen und einen Alias definieren
  • ODBC-Treiber installieren
  • gds32.dll installieren
  • ODBC-Datenquelle definieren
  • Eine LibreOffice-Datenbank definieren

Weiterlesen …

Kurztipp: Externe Daten in Excel2000 und LibreOffice

Nicht lachen, aber ich habe hier noch uralte Excel-Tabellen, die mit Daten aus externen Datenquellen gefüllt werden. Diese wollte ich nun auf LibreOffice umstellen und habe lange herumsuchen müssen.

Meine Datenquelle ist in beiden Fällen eine Tabelle einer auf einem anderen Rechner laufenden Firebird-Datenbank, die per „ODBC-Datenquellen-Administrator“ (odbcad32.exe) im System angemeldet ist. Für das Uralt-Excel2000 muss (auf meinem Windows7 Pro 64bit) dafür die Anwendung aus c:\Windows\SysWOW64\ verwendet werden, für LibreOffice (64bit) die Anwendung aus c:\Windows\System32\.

In Excel2000 wurde die Datenbanktabelle per Menü „Daten / Externe Daten“ und einem der Untermenüpunkte in die Tabelle eingefügt. Wenn in der Zwischenzeit Veränderungen innerhalb der Datenbank aufgetreten waren, wurden die nicht direkt in Excel sichtbar, sonder man musste per Menü „Daten / Daten aktualisieren“ bzw. einem Klick auf das passende Symbol in der Symbolleiste mit dem roten Ausrufezeichen die Daten auf den neuesten Stand bringen.

In LibreOffice Calc sollte man nicht Menü „Daten / Datenquelle“ wählen, dies wird sich als Sackgasse erweisen und man steht erst einmal wie ein Ochs vor’m Berg und fragt sich, was das soll.

Stattdessen wähle man Menü „Ansicht / Datenquellen“, die alle in LibreOffice Base definierten Datenbanken und deren Inhalte anzeigt. Nun klappt man die gewüschte Datenbank im Explorer auf, klappt die Tabellen auf, scrollt zur gewünschten Tabelle und zieht diese per Drag & Drop ins Tabellenblatt. Fertig.

Auch in LibreOffice Calc werden Veränderungen innerhalb der Datenbank nicht direkt im Tabellenblatt angezeigt. Dazu wähle man Menü „Daten / Bereich aktualisieren“. Et voilà!

Eine Schaltfläche habe ich in keiner Standard-Symbolleiste entdecken können, bei Bedarf muss man sich diese für „Breich aktualisieren“ selbst in eine vorhandene oder neue Symbolleiste konfigurieren.

Kurztipp: sysdba-Passwort nach Xubuntu-Neuinstallation

Während der Installation von firebird2.5-super unter Xubuntu 14.04.3 LTS öffnet sich ein Dialog zur Eingabe des Passworts des SYSDBA. Scheinbar hat die Installation hier einen Bug, denn selbst wenn man hier „masterkey“ eingibt, lautet das Passwort später anders:

dh@kiste:~$ sudo more /etc/firebird/2.5/SYSDBA.password
# Password for firebird SYSDBA user
#
# You may want to use the following commands for changing it:
#   dpkg-reconfigure firebird2.5-super
# or
#   dpkg-reconfigure firebird2.5-classic
#
# If you change the password manually with gsec, please update it here too.
# Keeping this file in sync with the security database is critical for the
# correct functioning of the init.d script and for the ability to change the
# password via `dpkg-reconfigure firebird2.5-super/classic\'

ISC_USER=sysdba
ISC_PASSWORD="c88cec96"

Folgendes ist zu tun: 1. Passwort mittels der Firebird-Bordmittel ändern und 2. das neue Passwort in die SYSDBA.password eintragen.

dh@kiste:~$ gsec -user sysdba -password c88cec96
GSEC> modify sysdba -pw masterkey
Warning - maximum 8 significant bytes of password used
GSEC> quit

dh@kiste:~$ sudo vi /etc/firebird/2.5/SYSDBA.password