Zu Content springen
Deutsch
  • Es gibt keine Vorschläge, da das Suchfeld leer ist.

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.