Backup kann nicht in PostgreSQL Datenbank zurück gespielt werden
Sporadisch kommt es vor, dass Backups in PostgreSQL Datenbanken nicht zurück gespielt werden können. Hier erfahren Sie, wie man das Problem behebt.
Problem
Das Rückspielen eines Backups schlägt mit folgender Meldung fehl:
Could not restore database from Backup: Wert zu lang für Typ character varying(255)
Hier ist das Problem, dass ein Feld welches auf max. 255 Zeichen beschränkt ist mehr Zeichen beinhaltet. Da SQLite dies nicht prüft, kann das Backup dort problemlos zurückgespielt werden. PostgreSQL hingegen stellt dieses Problem fest und blockiert den Restore.
Info
Da die Backups technisch gesehen, SQLite Datenbanken sind wird hier von Datenbank gesprochen. Die unten geschilderten Schritte können also sowohl mit einer Datenbank als auch mit einem Backup durchgeführt werden.
Analyse
Zunächst muss analysiert werden, welche Felder betroffen sind. Hierfür muss das Backup zunächst entschlüsselt werden. Öffnen Sie das Backup hierfür in einem Editor. In diesem Beispiel verwenden wir den SQLite Manager
Im SQLite Manager kann die Verschlüsselung über Database - Encryption - Remove entfernt werden. Sobald die Verschlüsselung entfernt wurde, kann der Editor beendet werden.
Nun wird das Skript zu Analyse benötigt. Dies können Sie hier herunterladen: SQLite Analyse Skript
Nach dem Download kann das Skript über Rechtsklick - Bearbeiten geöffnet werden. In Zeile 40 des Skripts ist der Pfad der zu prüfenden Datenbank zu finden. Dieser kann entsprechend angepasst werden.

Achtung!
Bearbeiten Sie nie die produktive Datenbank. Erstellen Sie entweder eine Kopie der Datenbank oder verwenden ein Backup. Beides ist möglich.
Sobald der Pfad angepasst wurde, kann das Skript über den Play Button gestartet werden. Das Skript geht nun alle Felder durch und gibt dann diejenigen Felder aus, welche zu reparieren sind.
Bereinigung
Das Skript gibt aus, welche Datensätze betroffen sind. Dies könnte z.B. wie folgt aussehen:

Hier ist zu sehen, dass in der Tabelle User ein Feld in der Spalte Email betroffen ist. Zum Bereinigen muss die Datenbank wieder im SQLite Manager geöffnet werden. Über den Button SQL kann die Datenbank nun bearbeitet werden. Hierfür muss folgendes Skript angepasst werden:
update "Tabelle"
set "Feldname" = substr("Feldname",1,255)
where length("Feldname") > 255
Im Skript müssen lediglich die Tabelle und der Feldname aus der Analyse übernommen werden. In unserem Beispiel Tabelle User und Spalte Email:
update "User"
set "Email" = substr("Email",1,255)
where length("Email") > 255
Im SQLite Manager sieht das Ganze wie folgt aus:
Die Datenbank ist nun bearbeitet. Anschließend muss die Datenbank erneut über einen SQLight Manager geöffnet und wieder verschlüsselt werden. Abschließend kann sie als Backup zurückgespielt werden.