Datenbanken von MySQL zu PostgreSQL portieren PGDay.EU 2010 – 06-08.12.2010 Andreas ’ads’ Scherbaum Web: http://andreas.scherbaum.la/ / http://andreas.scherbaum.biz/ E-Mail: andreas[at]scherbaum.biz PGP: 9F67 73D3 43AA B30E CA8F 56E5 3002 8D24 4813 B5FE 06-08.12.2010 Intro MySQL Portieren → PostgreSQL Fragen & Antworten Was ist PostgreSQL? Relationale Datenbank unter BSD Lizenz Weltweit aktive Community Zahlreiche Features und Funktionen (Foreign Keys, Transaktionen, Trigger) Läuft auf zahlreichen Betriebssystemen und diverser Hardware Weitgehendes Einhalten der SQL-Standards – Dokumentation der Abweichungen Im Schnitt pro Jahr ein Release mit neuen Features Version 9.1 wird derzeit fleißig entwickelt Andreas ’ads’ Scherbaum Intro MySQL MySQL → PostgreSQL Portieren → PostgreSQL Fragen & Antworten Der Dozent Der Dozent Name: Andreas Scherbaum Selbstständig im Bereich Datenbanken, Linux auf Kleingeräten, Entwicklung von Webanwendungen Arbeit mit Datenbanken seit 1997, mit PostgreSQL seit 1998 Gründungsmitglied der Deutschen und der Europäischen PostgreSQL User Group Board of Directors – European PostgreSQL User Group Andreas ’ads’ Scherbaum MySQL → PostgreSQL Intro MySQL Portieren → PostgreSQL Fragen & Antworten .la Was bedeutet dieses komische .la? http://andreas.scherbaum.la/ .la ist die TLD von Laos .la wird von Los Angeles genutzt und verwaltet LA ist das KFZ-Kennzeichen von Landshut/Niederbayern Dort habe ich längere Zeit gewohnt und meine Frau fand die Domain schön Andreas ’ads’ Scherbaum Intro MySQL MySQL → PostgreSQL Portieren → PostgreSQL Inhalte des Vortrags Inhalte des Vortrags Geschichte von MySQL Fallstricke beim Portieren Hilfsmittel Andreas ’ads’ Scherbaum MySQL → PostgreSQL Fragen & Antworten Intro MySQL Portieren → PostgreSQL Fragen & Antworten Geschichte von MySQL Die (jüngere) Geschichte von MySQL 1994: mit Versionsnummer 3.21 veröffentlicht erlangte schnell Bedeutung im Web, zusammen mit PHP (LAMP) Oktober 2005: Oracle kauft InnoDB (Storage Engine für MySQL) Februar 2006: Oracle kauft Sleepycat (u. a. Storage Engine für MySQL) 2006: versuchte Übernahme durch Oracle, Hintergründe unklar Februar 2008: von Sun Microsystems übernommen April 2009: Oracle übernimmt Sun Microsystems unter anderem: Java, MySQL, OpenSolaris, OpenOffice, GlassFish November 2010: Verwirrungen in der Presse über Preiserhöhungen Andreas ’ads’ Scherbaum Intro MySQL MySQL → PostgreSQL Portieren → PostgreSQL Fragen & Antworten Verwirrungen Verwirrungen auf Seiten der Anwender keine klare Aussage von Oracle zur Zukunft von MySQL Verwirrungen um Preiserhöhungen Probleme in anderen von Oracle geführten Projekten (OpenSolaris, OpenOffice, Hudson, ...) diverse Forks mit unterschiedlicher Positionierung diverse Storage Engines mit unterschiedlicher Funktionalität Andreas ’ads’ Scherbaum MySQL → PostgreSQL Intro MySQL Portieren → PostgreSQL Fragen & Antworten Alternativen Alternativen für Anwender Wechsel auf eine andere Datenbank Andreas ’ads’ Scherbaum Intro MySQL MySQL → PostgreSQL Portieren → PostgreSQL Fragen & Antworten Portieren auf PostgreSQL Ansatzpunkte Frameworks (z. B. Hybernate) erleichtern die Arbeit Analyse der Anwendung(en), Aktualisieren der Dokumentation Portieren der Datenbank Portieren der Anwendung(en) Andreas ’ads’ Scherbaum MySQL → PostgreSQL Intro MySQL Portieren → PostgreSQL Fragen & Antworten Fallstricke AUTO INCREMENT AUTO INCREMENT zählt bei INSERTs um eins hoch Beispiel (AUTO INCREMENT) CREATE TABLE ... ( id INTEGER PRIMARY KEY AUTO_INCREMENT, ... ); Andreas ’ads’ Scherbaum Intro MySQL MySQL → PostgreSQL Portieren → PostgreSQL Fragen & Antworten Fallstricke AUTO INCREMENT Ersatz: SERIAL Sequenzen (SERIAL) in PostgreSQL bieten die gleiche Funktionalität ... und mehr Beispiel (SERIAL) CREATE TABLE ... ( id SERIAL ... ); PRIMARY KEY, Sequenzen können hoch und runter zählen ... können in größeren Schritten zählen ... können für mehrere Tabellen verwendet werden ... können unabhängig von einer Tabelle verwendet werden Andreas ’ads’ Scherbaum MySQL → PostgreSQL Intro MySQL Portieren → PostgreSQL Fragen & Antworten Fallstricke TIMESTAMP Die erste TIMESTAMP-Spalte einer Tabelle wird von MySQL automatisch gesetzt Beispiel (TIMESTAMP) CREATE TABLE ... ( geaendert_am TIMESTAMP, ... ); Nachteil: das ”Feature” lässt sich nicht deaktivieren Andreas ’ads’ Scherbaum Intro MySQL MySQL → PostgreSQL Portieren → PostgreSQL Fragen & Antworten Fallstricke TIMESTAMP Ersatz: Trigger Ein Trigger setzt zuverlässig den aktuellen Wert Beispiel (Trigger) CREATE TABLE ... ( geaendert_am TIMESTAMPTZ, ... ); CREATE TRIGGER trigger_zeitstempel BEFORE INSERT OR UPDATE ON ... FOR EACH ROW EXECUTE PROCEDURE trigger_zeitstempel(); PostgreSQL Vorteil: keine zweite Spalte notwendig Andreas ’ads’ Scherbaum MySQL → PostgreSQL Intro MySQL Portieren → PostgreSQL Fragen & Antworten Fallstricke TIMESTAMP Ersatz: Trigger Beispiel (Trigger) CREATE FUNCTION trigger_zeitstempel () RETURNS TRIGGER AS $$ BEGIN IF TG_OP = ’INSERT’ THEN NEW.eingefuegt_um := NOW(); NEW.geaendert_um := NOW(); END IF; IF TG_OP = ’UPDATE’ THEN NEW.eingefuegt_um := OLD.eingefuegt_um; NEW.geaendert_um := NOW(); END IF; RETURN NEW; END $$ LANGUAGE plpgsql; Andreas ’ads’ Scherbaum Intro MySQL MySQL → PostgreSQL Portieren → PostgreSQL Fallstricke CHECK-Klausel MySQL akzeptiert aber ignoriert CHECK-Klauseln Beispiel (TIMESTAMP) CREATE TABLE ... ( passwort CHAR(32) CHECK (LENGTH(passwort) = 32), ... ); Andreas ’ads’ Scherbaum MySQL → PostgreSQL Fragen & Antworten Intro MySQL Portieren → PostgreSQL Fragen & Antworten Fallstricke CHECK-Klausel PostgreSQL akzeptiert CHECK-Klauseln und wendet diese an Nachteil: Sie müssen jetzt CHECK-Klauseln schreiben ;-) Andreas ’ads’ Scherbaum Intro MySQL MySQL → PostgreSQL Portieren → PostgreSQL Fragen & Antworten Fallstricke DEFAULT-Werte DEFAULT-Werte werden ähnlich behandelt Sonderbehandlung für TIMESTAMP-Spalten Für NOT NULL-Spalten generiert MySQL automatisch einen DEFAULT-Wert: 0 für Zahlen "" (leerer String) für Texte bei ENUMs der erste Wert in PostgreSQL sind dafür explizit DEFAULT-Werte zu setzen ein INSERT ohne Angabe eines Wertes führt zu einem Fehler Andreas ’ads’ Scherbaum MySQL → PostgreSQL Intro MySQL Portieren → PostgreSQL Fragen & Antworten Fallstricke ZEROFILL MySQL kennt ZEROFILL, um Spalten mit 0 am Anfang aufzufüllen Beispiel (ZEROFILL) CREATE TABLE ... ( zahl INTEGER ZEROFILL, ... ); Beispiel (ZEROFILL) +------------+ | zahl | +------------+ | 0000000001 | +------------+ Andreas ’ads’ Scherbaum Intro MySQL MySQL → PostgreSQL Portieren → PostgreSQL Fragen & Antworten Fallstricke ZEROFILL Ersatz: passend formatierte Ausgabe in PostgreSQL ist das Zahlenformat Aufgabe der Ausgabe Beispiel (ZEROFILL) test=# SELECT lpad(1::TEXT, 10, ’0’); lpad -----------0000000001 (1 Zeile) Andreas ’ads’ Scherbaum MySQL → PostgreSQL Intro Portieren → PostgreSQL MySQL Fragen & Antworten Fallstricke GROUP BY MySQL erlaubt die Angabe einzelner Spalten bei GROUP BY Beispiel (GROUP BY) CREATE TABLE groupby_test ( id INTEGER PRIMARY KEY, daten VARCHAR(10) NOT NULL ); INSERT INSERT INSERT INSERT INSERT INTO INTO INTO INTO INTO groupby_test groupby_test groupby_test groupby_test groupby_test (id, (id, (id, (id, (id, daten) daten) daten) daten) daten) Andreas ’ads’ Scherbaum Intro MySQL VALUES VALUES VALUES VALUES VALUES (1, (2, (3, (4, (5, ’Auto’); ’Boot’); ’Flugzeug’); ’Auto’); ’Boot’); MySQL → PostgreSQL Portieren → PostgreSQL Fallstricke GROUP BY Beispiel (GROUP BY) mysql> SELECT id, daten FROM groupby_test GROUP BY daten; +----+----------+ | id | daten | +----+----------+ | 1 | Auto | | 2 | Boot | | 3 | Flugzeug | +----+----------+ 3 rows in set (0.00 sec) Wir erinnern uns: Auto hatte die IDs 1 und 4 ... Andreas ’ads’ Scherbaum MySQL → PostgreSQL Fragen & Antworten Intro MySQL Portieren → PostgreSQL Fragen & Antworten Fallstricke GROUP BY Ersatz: Anfragen richtig schreiben PostgreSQL verlangt: alle Spalten werden in GROUP BY aufgeführt oder in einer Aggregatfunktion verwendet Beispiel (GROUP BY) test=# SELECT id, daten FROM groupby_test GROUP BY daten; ERROR: column "groupby_test.id" must appear in the GROUP BY clause or be used in an aggregate function ZEILE 1: SELECT id, daten FROM groupby_test GROUP BY daten; Andreas ’ads’ Scherbaum Intro MySQL MySQL → PostgreSQL Portieren → PostgreSQL Fragen & Antworten Fallstricke GROUP BY Ersatz: Anfragen richtig schreiben Beispiel (GROUP BY) test=# SELECT MIN(id), daten FROM groupby_test GROUP BY daten; min | daten -----+---------2 | Boot 1 | Auto 3 | Flugzeug (3 Zeilen) Vorteil: eindeutige Ergebnisse Andreas ’ads’ Scherbaum MySQL → PostgreSQL Intro Portieren → PostgreSQL MySQL Fragen & Antworten Fallstricke Sortieren und NULL-Werte MySQL sortiert NULL-Werte an den Anfang der Ergebnisliste PostgreSQL an das Ende Beispiel (NULL) CREATE TABLE null_test ( id INTEGER daten VARCHAR(10) ); INSERT INSERT INSERT INSERT INSERT INTO INTO INTO INTO INTO null_test null_test null_test null_test null_test (id, (id, (id, (id, (id, PRIMARY KEY, daten) daten) daten) daten) daten) Andreas ’ads’ Scherbaum Intro MySQL VALUES VALUES VALUES VALUES VALUES (1, (2, (3, (4, (5, ’a’); NULL); ’b’); NULL); ’c’); MySQL → PostgreSQL Portieren → PostgreSQL Fallstricke Sortieren und NULL-Werte Beispiel (NULL: in MySQL) mysql> SELECT id, daten FROM null_test ORDER BY daten; +----+-------+ | id | daten | +----+-------+ | 2 | NULL | | 4 | NULL | | 1 | a | | 3 | b | | 5 | c | +----+-------+ 5 rows in set (0.06 sec) Andreas ’ads’ Scherbaum MySQL → PostgreSQL Fragen & Antworten Intro MySQL Portieren → PostgreSQL Fragen & Antworten Fallstricke Sortieren und NULL-Werte Beispiel (NULL: in PostgreSQL) test=# SELECT id, daten FROM null_test ORDER BY daten; id | daten ----+------1 | a 3 | b 5 | c 2 | 4 | (5 Zeilen) Andreas ’ads’ Scherbaum Intro MySQL MySQL → PostgreSQL Portieren → PostgreSQL Fragen & Antworten Fallstricke Sortieren und NULL-Werte: NULLS FIRST PostgreSQL verlangt: alle Spalten werden in GROUP BY aufgeführt oder in einer Aggregatfunktion verwendet Beispiel (NULL: NULLS FIRST) test=# SELECT id, daten FROM null_test ORDER BY daten NULLS FIRST; id | daten ----+------2 | 4 | 1 | a 3 | b 5 | c (5 Zeilen) Andreas ’ads’ Scherbaum MySQL → PostgreSQL Intro MySQL Portieren → PostgreSQL Fragen & Antworten Fallstricke IFNULL() MySQL kennt IFNULL() und COALESCE() unterscheiden sich jedoch nicht wesentlich Beispiel (IFNULL()) mysql> SELECT IFNULL(NULL, 10); +------------------+ | IFNULL(NULL, 10) | +------------------+ | 10 | +------------------+ 1 row in set (0.00 sec) Andreas ’ads’ Scherbaum Intro MySQL MySQL → PostgreSQL Portieren → PostgreSQL Fallstricke COALESCE() Beispiel (COALESCE()) mysql> SELECT COALESCE(NULL, 10, 20); +------------------------+ | COALESCE(NULL, 10, 20) | +------------------------+ | 10 | +------------------------+ 1 row in set (0.00 sec) Andreas ’ads’ Scherbaum MySQL → PostgreSQL Fragen & Antworten Intro MySQL Portieren → PostgreSQL Fragen & Antworten Fallstricke IFNULL() Ersatz: COALESCE() Einfach überall IFNULL() gegen COALESCE() austauschen Unterschied: IFNULL() kennt nur 2 Parameter COALESCE() kann mehrere Parameter verarbeiten Andreas ’ads’ Scherbaum Intro MySQL MySQL → PostgreSQL Portieren → PostgreSQL Fragen & Antworten Fallstricke Groß-/Kleinschreibung der Bezeichner In MySQL bestimmt (bei einigen Tabellentypen) das Dateisystem die Groß-/Kleinschreibung Unter Windows ist die Groß-/Kleinschreibung egal Unter einigen Unix-Systemen ist die Groß-/Kleinschreibung wichtig PostgreSQL ist das Dateisystem egal ;-) Andreas ’ads’ Scherbaum MySQL → PostgreSQL Intro MySQL Portieren → PostgreSQL Fragen & Antworten Fallstricke Groß-/Kleinschreibung der Bezeichner Der SQL-Standard schreibt alle Bezeichner groß PostgreSQL schreibt alle Bezeichner klein Beispiel (Groß-/Kleinschreibung) test# SELECT 1 AS GROSS; gross ------1 (1 Zeile) Beispiel (Groß-/Kleinschreibung) test# SELECT 1 AS GeMiScHt; gemischt ---------1 (1 Zeile) Andreas ’ads’ Scherbaum Intro MySQL MySQL → PostgreSQL Portieren → PostgreSQL Fragen & Antworten Fallstricke Groß-/Kleinschreibung der Bezeichner Möchte man Bezeichner groß schreiben sind ”” zu verwenden Beispiel (Groß-/Kleinschreibung) test# SELECT 1 AS "GeMiScHt"; GeMiScHt ---------1 (1 Zeile) Vorsicht bei der Verwendung von Frameworks Andreas ’ads’ Scherbaum MySQL → PostgreSQL Intro MySQL Portieren → PostgreSQL Fragen & Antworten Fallstricke CONSTRAINTs und REFERENCES Einige MySQL Tabellentypen kennen CONSTRAINTs und REFERENCES andere nicht Folge: kaum jemand setzt das ein Weitere Besonderheiten: beide Spalten müssen die gleiche Definition haben (gleicher Datentyp, NULL/NOT NULL) beide Spalten müssen einen Index haben Andreas ’ads’ Scherbaum Intro MySQL MySQL → PostgreSQL Portieren → PostgreSQL Fragen & Antworten Fallstricke Datums- und Zeitangaben Datentypen für Zeit- und Datumsangaben unterscheiden sehr stark Funktionen zum Formatieren der Ausgabe sind unterschiedlich TIMESTAMP in PostgreSQL hat eine Auflösung im Mikrosekundenbereich zusätzlich hat ein TIMESTAMPTZ eine Zeitzone Operationen mit Zeitangaben geben in PostgreSQL den Typ INTERVAL zurück Fazit: viel Detail- und Handarbeit notwendig :-( Andreas ’ads’ Scherbaum MySQL → PostgreSQL Intro MySQL Portieren → PostgreSQL Fragen & Antworten Fallstricke Datums- und Zeitangaben Beispiel: year(), month() und day() Beispiel (Datumsfunktionen) test=# SELECT to_char(NOW(), ’YYYY’) AS year, to_char(NOW(), ’MM’) AS month, to_char(NOW(), ’DD’) AS day; year | month | day ------+-------+----2010 | 12 | 03 (1 Zeile) Andreas ’ads’ Scherbaum Intro MySQL MySQL → PostgreSQL Portieren → PostgreSQL Fallstricke ORDER BY RAND() Funktion zum Erzeugen von Zufallszahlen in MySQL: RAND() in PostgreSQL: RANDOM() Suchen/Ersetzen sollte ausreichen Andreas ’ads’ Scherbaum MySQL → PostgreSQL Fragen & Antworten Intro MySQL Portieren → PostgreSQL Fragen & Antworten Fallstricke LIKE und ILIKE LIKE in MySQL unterscheidet nicht zwischen Groß-/Kleinschreibung LIKE in PostgreSQL ist case-sensitive für case-insensitive Suchen: ILIKE Andreas ’ads’ Scherbaum Intro MySQL MySQL → PostgreSQL Portieren → PostgreSQL Fallstricke LIKE und ILIKE Beispiel (LIKE) test# SELECT ’AUTO’ LIKE ’auto’; ?column? ---------f (1 Zeile) Beispiel (ILIKE) test# SELECT ’AUTO’ ILIKE ’auto’; ?column? ---------t (1 Zeile) Andreas ’ads’ Scherbaum MySQL → PostgreSQL Fragen & Antworten Intro MySQL Portieren → PostgreSQL Fragen & Antworten Fallstricke Boolesche Werte MySQL kennt keinen (richtigen) Boolean-Wert stattdessen wird ein SMALLINT(1) verwendet führt dazu das ein Boolean auch mal 7 verschiedene Werte haben kann ... PostgreSQL kennt einen richtigen BOOLEAN-Datentyp Andreas ’ads’ Scherbaum Intro MySQL MySQL → PostgreSQL Portieren → PostgreSQL Fragen & Antworten Fallstricke String-Verknüpfungen versus logische Operatoren MySQL verwendet den || Operator für ”logisch ODER” Der SQL-Standard – und PostgreSQL– verwenden || für Textverknüpfungen Spaß ist vorprogrammiert ”logisch ODER” wird in PostgreSQL mit Hilfe des OR-Operators durchgeführt Andreas ’ads’ Scherbaum MySQL → PostgreSQL Intro MySQL Portieren → PostgreSQL Fragen & Antworten Fallstricke String-Verknüpfungen versus logische Operatoren MySQL kennt auch && für ”logisch UND” das hat jedoch keine Entsprechung in anderen Datenbanken ist daher einfach zu finden und zu beseitigen Andreas ’ads’ Scherbaum Intro MySQL MySQL → PostgreSQL Portieren → PostgreSQL Fragen & Antworten Fallstricke Binäre Daten MySQL verwendet VARBINARY oder BINARY PostgreSQL verwendet BYTEA Anwendung wird primär durch die Anwendung bestimmt Andreas ’ads’ Scherbaum MySQL → PostgreSQL Intro MySQL Portieren → PostgreSQL Fragen & Antworten Fallstricke INSERT IGNORE und REPLACE MySQL erlaubt mittels INSERT IGNORE das Überspringen von Unique-Key Verletzungen PostgreSQL erlaubt das nicht REPLACE überschreibt die Zeile mit dem Primärschlüssel mit den neuen Daten Quasi ein INSERT ODER UPDATE Nachteil: kein SQL-Standard Andreas ’ads’ Scherbaum Intro MySQL MySQL → PostgreSQL Portieren → PostgreSQL Fallstricke INSERT IGNORE und REPLACE Ersatz Abhilfe für INSERT IGNORE die PostgreSQL Online-Dokumentation enthält eine Beispielfunktion Stichwort: UPSERT Abhilfe für REPLACE: MERGE Demnächst auch in ihrer bevorzugten Datenbank Andreas ’ads’ Scherbaum MySQL → PostgreSQL Fragen & Antworten Intro MySQL Portieren → PostgreSQL Fragen & Antworten Fallstricke Daten aus Datei laden MySQL verwendet LOAD DATA zum Importieren von Daten PostgreSQL verwendet COPY Anwendung ist ähnlich Andreas ’ads’ Scherbaum Intro MySQL MySQL → PostgreSQL Portieren → PostgreSQL Fallstricke Daten in Datei schreiben MySQL verwendet SELECT ... Exportieren von Daten INTO OUTFILE zum PostgreSQL verwendet wiederum COPY Andreas ’ads’ Scherbaum MySQL → PostgreSQL Fragen & Antworten Intro MySQL Portieren → PostgreSQL Fragen & Antworten Fallstricke Kommentare MySQL versteht als Kommentar: die Raute: # doppelte Bindestriche: -für mehrzeilige Kommentare: /* ... */ PostgreSQL versteht die Raute (#) nicht als Kommentar Andreas ’ads’ Scherbaum Intro MySQL MySQL → PostgreSQL Portieren → PostgreSQL Fragen & Antworten Fallstricke Anführungszeichen MySQL erlaubt die Verwendung von einfachen und doppelten Anführungszeichen für Daten und Bezeichner PostgreSQL verlangt einfache Hochkommas für Daten (laut SQL-Standard) PostgreSQL verlangt doppelte Anführungszeichen für Bezeichner (laut SQL-Standard) MySQL erlaubt die Verwendung von Akzentmarkern (Backticks) für Bezeichner Ein Anfang wäre das Exportieren mittels ”ansi”: Beispiel (mysqldump) mysqldump --compatible=ansi Andreas ’ads’ Scherbaum MySQL → PostgreSQL Intro MySQL Portieren → PostgreSQL Fragen & Antworten Fallstricke Storage-Engines MySQL kennt verschiedene Storage-Engines: MyISAM, Innodb, Memory, Archive, CSV, PBXT, Solid, Falcon, NDB, GEMINI, BerkeleyDB, Blackhole, Federated, Merge, IBMDB2I, Maria, ScaleDB, XtraDB, Calpont, InfoBright, Kickfire, TokuDB, HEAP, Example, Isam, Q4M, OQGraph, FederatedX, Spider, Sphinx, AWSS3 Problem: jede Storage Engine bietet andere Vor- und Nachteile Implementierungsdetails (Volltextsuche, Transaktionen, Foreign Keys, Check Constraints, Groß-/Kleinschreibung, ...) sind abhängig von der Engine Viel Spaß bei der Auswahl des passenden Typs :-( Andreas ’ads’ Scherbaum Intro MySQL MySQL → PostgreSQL Portieren → PostgreSQL Fragen & Antworten Fallstricke Storage-Engines in PostgreSQL PostgreSQL kennt keine Storage-Engines ;-) jede Tabelle kann alle Features Alle ENGINE- oder TYPE-Parameter können entfernt werden Andreas ’ads’ Scherbaum MySQL → PostgreSQL Intro MySQL Portieren → PostgreSQL Fragen & Antworten Fallstricke Transaktionen MySQL kennt Transaktionen – bei einigen Storage Engines PostgreSQL nutzt überall Transaktionen Nutzen Sie das! Andreas ’ads’ Scherbaum Intro MySQL MySQL → PostgreSQL Portieren → PostgreSQL Fragen & Antworten Fallstricke Storage-Engines in PostgreSQL PostgreSQL kennt keine Storage-Engines ;-) jede Tabelle kann alle Features Alle ENGINE- oder TYPE-Parameter können entfernt werden Andreas ’ads’ Scherbaum MySQL → PostgreSQL Intro Portieren → PostgreSQL MySQL Fragen & Antworten Fallstricke Datentypen Die Datentypen unterscheiden sich, teilweise sogar sehr stark Datentyp TINYINT SMALLINT MEDIUMINT INT BIGINT INT(1) INT(4) INT(11) FLOAT DOUBLE REAL FLOAT(4,7) NUMERIC DECIMAL Ersatz SMALLINT SMALLINT INTEGER INTEGER BIGINT BOOLEAN oder SMALLINT INTEGER BIGINT FLOAT DOUBLE PRECISION DOUBLE PRECISION FLOAT NUMERIC DECIMAL Andreas ’ads’ Scherbaum Intro MySQL MySQL → PostgreSQL Portieren → PostgreSQL Fallstricke Datentypen Datentyp CHAR VARCHAR BINARY VARBINARY BLOB TEXT LONG ENUM SET Ersatz CHAR VARCHAR BYTEA oder TEXT BYTEA oder TEXT TEXT TEXT TEXT ENUM oder 1:n-Tabelle kein Ersatz, 1:n-Tabelle möglich Andreas ’ads’ Scherbaum MySQL → PostgreSQL Fragen & Antworten Intro Portieren → PostgreSQL MySQL Fragen & Antworten Fallstricke Datentypen Datentyp DATETIME DATE TIMESTAMP TIME YEAR Datentyp BIT Ersatz TIMESTAMP oder TIMESTAMPTZ DATE TIMESTAMP oder TIMESTAMPTZ TIME DATE Ersatz BIT oder BIT VARYING Andreas ’ads’ Scherbaum Intro MySQL MySQL → PostgreSQL Portieren → PostgreSQL Fragen & Antworten Hilfsmittel mysql2pgsql mysql2pgsql kann einen Datenbankdump portieren funktioniert recht gut, trotzdem ist Handarbeit notwendig Import dauert länger, da INSERTs statt COPY verwendet werden Webseite: http://pgfoundry.org/projects/mysql2pgsql/ Andreas ’ads’ Scherbaum MySQL → PostgreSQL Intro MySQL Portieren → PostgreSQL Fragen & Antworten Hilfsmittel mysql2pgsql Beispiel (mysql2pgsql) perl mysql2pgsql.perl mysql-dump.sql pg-dump.sql Andreas ’ads’ Scherbaum Intro MySQL MySQL → PostgreSQL Portieren → PostgreSQL Hilfsmittel mysql2pgsql – nützliche Optionen --debug liefert umfangreiche Ausgaben --char2varchar wandelt alle CHAR-Spalten in VARCHAR-Typen um --nodrop entfernt alle DROP TABLE-Anweisungen --schema gibt ein Schema für Objekte an --enc in Charset des MySQL-Dumps --enc out Charset der Ausgabedatei für PostgreSQL Andreas ’ads’ Scherbaum MySQL → PostgreSQL Fragen & Antworten Intro MySQL Portieren → PostgreSQL Fragen & Antworten Indexes mehrere Indexes PostgreSQL kann mehrere Indexes pro Anfrage verwenden Andreas ’ads’ Scherbaum Intro MySQL MySQL → PostgreSQL Portieren → PostgreSQL Feedback Feedback ist wichtig für: die Konferenz den Vortragenden Webseite: http://2010.pgday.eu/feedback Andreas ’ads’ Scherbaum MySQL → PostgreSQL Fragen & Antworten Intro MySQL Portieren → PostgreSQL Fragen & Antworten Wichtiger Termin Wichtiger Termin FOSDEM 2011 – PostgreSQL Devroom 5.-6. Februar 2011 in Brüssel Webseite: http://www.fosdem.org/ Andreas ’ads’ Scherbaum Intro MySQL MySQL → PostgreSQL Portieren → PostgreSQL Fragen & Antworten PostgreSQL Buch PostgreSQL – Datenbankpraxis für Anwender, Administratoren und Entwickler Erschien im Juli 2009 Verlag Open Source Press Umfang: ca. 520 Seiten Andreas ’ads’ Scherbaum MySQL → PostgreSQL im Intro MySQL Portieren → PostgreSQL Ende http://andreas.scherbaum.biz/ http://andreas.scherbaum.la/ Fragen? Andreas ’ads’ Scherbaum <[email protected]> PostgreSQL User Group Germany European PostgreSQL User Group PostgreSQL Service & Support Andreas ’ads’ Scherbaum MySQL → PostgreSQL Fragen & Antworten