Datenbanken von MySQL zu PostgreSQL portieren

Werbung
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
Herunterladen