Transcription

Datenbanken von MySQL zu PostgreSQLportierenPGDay.EU 2010 – 06-08.12.2010Andreas ’ads’ ScherbaumWeb:http://andreas.scherbaum.la/ / http://andreas.scherbaum.biz/E-Mail: andreas[at]scherbaum.bizPGP: 9F67 73D3 43AA B30E CA8F 56E5 3002 8D24 4813 B5FE06-08.12.2010

IntroMySQLPortieren PostgreSQLFragen & AntwortenWas ist PostgreSQL?Relationale Datenbank unter BSD LizenzWeltweit aktive CommunityZahlreiche Features und Funktionen (Foreign Keys,Transaktionen, Trigger)Läuft auf zahlreichen Betriebssystemen und diverser HardwareWeitgehendes Einhalten der SQL-Standards – Dokumentationder AbweichungenIm Schnitt pro Jahr ein Release mit neuen FeaturesVersion 9.1 wird derzeit fleißig entwickeltAndreas ’ads’ ScherbaumIntroMySQLMySQL PostgreSQLPortieren PostgreSQLFragen & AntwortenDer DozentDer DozentName: Andreas ScherbaumSelbstständig im Bereich Datenbanken, Linux aufKleingeräten, Entwicklung von WebanwendungenArbeit mit Datenbanken seit 1997, mit PostgreSQL seit 1998Gründungsmitglied der Deutschen und der EuropäischenPostgreSQL User GroupBoard of Directors – European PostgreSQL User GroupAndreas ’ads’ ScherbaumMySQL PostgreSQL

IntroMySQLPortieren PostgreSQLFragen & Antworten.laWas bedeutet dieses komische .la?http://andreas.scherbaum.la/.la ist die TLD von Laos.la wird von Los Angeles genutzt und verwaltetLA ist das KFZ-Kennzeichen von Landshut/NiederbayernDort habe ich längere Zeit gewohnt und meine Frau fand dieDomain schönAndreas ’ads’ ScherbaumIntroMySQLMySQL PostgreSQLPortieren PostgreSQLInhalte des VortragsInhalte des VortragsGeschichte von MySQLFallstricke beim PortierenHilfsmittelAndreas ’ads’ ScherbaumMySQL PostgreSQLFragen & Antworten

IntroMySQLPortieren PostgreSQLFragen & AntwortenGeschichte von MySQLDie (jüngere) Geschichte von MySQL1994: mit Versionsnummer 3.21 veröffentlichterlangte schnell Bedeutung im Web, zusammen mit PHP(LAMP)Oktober 2005: Oracle kauft InnoDB (Storage Engine fürMySQL)Februar 2006: Oracle kauft Sleepycat (u. a. Storage Enginefür MySQL)2006: versuchte Übernahme durch Oracle, HintergründeunklarFebruar 2008: von Sun Microsystems übernommenApril 2009: Oracle übernimmt Sun Microsystemsunter anderem: Java, MySQL, OpenSolaris, OpenOffice,GlassFishNovember 2010: Verwirrungen in der Presse überPreiserhöhungenAndreas ’ads’ ScherbaumIntroMySQLMySQL PostgreSQLPortieren PostgreSQLFragen & AntwortenVerwirrungenVerwirrungen auf Seiten der Anwenderkeine klare Aussage von Oracle zur Zukunft von MySQLVerwirrungen um PreiserhöhungenProbleme in anderen von Oracle geführten Projekten(OpenSolaris, OpenOffice, Hudson, .)diverse Forks mit unterschiedlicher Positionierungdiverse Storage Engines mit unterschiedlicher FunktionalitätAndreas ’ads’ ScherbaumMySQL PostgreSQL

IntroMySQLPortieren PostgreSQLFragen & AntwortenAlternativenAlternativen für AnwenderWechsel auf eine andere DatenbankAndreas ’ads’ ScherbaumIntroMySQLMySQL PostgreSQLPortieren PostgreSQLFragen & AntwortenPortieren auf PostgreSQLAnsatzpunkteFrameworks (z. B. Hybernate) erleichtern die ArbeitAnalyse der Anwendung(en), Aktualisieren der DokumentationPortieren der DatenbankPortieren der Anwendung(en)Andreas ’ads’ ScherbaumMySQL PostgreSQL

IntroMySQLPortieren PostgreSQLFragen & AntwortenFallstrickeAUTO INCREMENTAUTO INCREMENT zählt bei INSERTs um eins hochBeispiel (AUTO INCREMENT)CREATE TABLE . (idINTEGERPRIMARY KEYAUTO INCREMENT,.);Andreas ’ads’ ScherbaumIntroMySQLMySQL PostgreSQLPortieren PostgreSQLFragen & AntwortenFallstrickeAUTO INCREMENT Ersatz: SERIALSequenzen (SERIAL) in PostgreSQL bieten die gleicheFunktionalität . und mehrBeispiel (SERIAL)CREATE TABLE . (idSERIAL.);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 werdenAndreas ’ads’ ScherbaumMySQL PostgreSQL

IntroMySQLPortieren PostgreSQLFragen & AntwortenFallstrickeTIMESTAMPDie erste TIMESTAMP-Spalte einer Tabelle wird von MySQLautomatisch gesetztBeispiel (TIMESTAMP)CREATE TABLE . (geaendert amTIMESTAMP,.);Nachteil: das ”Feature” lässt sich nicht deaktivierenAndreas ’ads’ ScherbaumIntroMySQLMySQL PostgreSQLPortieren PostgreSQLFragen & AntwortenFallstrickeTIMESTAMP Ersatz: TriggerEin Trigger setzt zuverlässig den aktuellen WertBeispiel (Trigger)CREATE TABLE . (geaendert amTIMESTAMPTZ,.);CREATE TRIGGER trigger zeitstempelBEFORE INSERT OR UPDATE ON .FOR EACH ROW EXECUTE PROCEDURE trigger zeitstempel();PostgreSQL Vorteil: keine zweite Spalte notwendigAndreas ’ads’ ScherbaumMySQL PostgreSQL

IntroMySQLPortieren PostgreSQLFragen & AntwortenFallstrickeTIMESTAMP Ersatz: TriggerBeispiel (Trigger)CREATE FUNCTION trigger zeitstempel ()RETURNS TRIGGER AS BEGINIF TG OP ’INSERT’ THENNEW.eingefuegt um : NOW();NEW.geaendert um : NOW();END IF;IF TG OP ’UPDATE’ THENNEW.eingefuegt um : OLD.eingefuegt um;NEW.geaendert um : NOW();END IF;RETURN NEW;END LANGUAGE plpgsql;Andreas ’ads’ ScherbaumIntroMySQLMySQL PostgreSQLPortieren PostgreSQLFallstrickeCHECK-KlauselMySQL akzeptiert aber ignoriert CHECK-KlauselnBeispiel (TIMESTAMP)CREATE TABLE . (passwortCHAR(32)CHECK (LENGTH(passwort) 32),.);Andreas ’ads’ ScherbaumMySQL PostgreSQLFragen & Antworten

IntroMySQLPortieren PostgreSQLFragen & AntwortenFallstrickeCHECK-KlauselPostgreSQL akzeptiert CHECK-Klauseln und wendet diese anNachteil: Sie müssen jetzt CHECK-Klauseln schreiben ;-)Andreas ’ads’ ScherbaumIntroMySQLMySQL PostgreSQLPortieren PostgreSQLFragen & AntwortenFallstrickeDEFAULT-WerteDEFAULT-Werte werden ähnlich behandeltSonderbehandlung für TIMESTAMP-SpaltenFür NOT NULL-Spalten generiert MySQL automatisch einenDEFAULT-Wert:0 für Zahlen"" (leerer String) für Textebei ENUMs der erste Wertin PostgreSQL sind dafür explizit DEFAULT-Werte zu setzenein INSERT ohne Angabe eines Wertes führt zu einem FehlerAndreas ’ads’ ScherbaumMySQL PostgreSQL

IntroMySQLPortieren PostgreSQLFragen & AntwortenFallstrickeZEROFILLMySQL kennt ZEROFILL, um Spalten mit 0 am AnfangaufzufüllenBeispiel (ZEROFILL)CREATE TABLE . (zahlINTEGER ZEROFILL,.);Beispiel (ZEROFILL) ------------ zahl ------------ 0000000001 ------------ Andreas ’ads’ ScherbaumIntroMySQLMySQL PostgreSQLPortieren PostgreSQLFragen & AntwortenFallstrickeZEROFILL Ersatz: passend formatierte Ausgabein PostgreSQL ist das Zahlenformat Aufgabe der AusgabeBeispiel (ZEROFILL)test # SELECT lpad(1::TEXT, 10, ’0’);lpad-----------0000000001(1 Zeile)Andreas ’ads’ ScherbaumMySQL PostgreSQL

IntroPortieren PostgreSQLMySQLFragen & AntwortenFallstrickeGROUP BYMySQL erlaubt die Angabe einzelner Spalten bei GROUP BYBeispiel (GROUP BY)CREATE TABLE groupby test (idINTEGERPRIMARY KEY,datenVARCHAR(10) NOT TOINTOgroupby testgroupby testgroupby testgroupby testgroupby ten)Andreas ’ads’ );’Auto’);’Boot’);MySQL PostgreSQLPortieren PostgreSQLFallstrickeGROUP BYBeispiel (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’ ScherbaumMySQL PostgreSQLFragen & Antworten

IntroMySQLPortieren PostgreSQLFragen & AntwortenFallstrickeGROUP BY Ersatz: Anfragen richtig schreibenPostgreSQL verlangt:alle Spalten werden in GROUP BY aufgeführtoder in einer Aggregatfunktion verwendetBeispiel (GROUP BY)test # SELECT id, daten FROM groupby test GROUP BY daten;ERROR: column "groupby test.id" must appear in the GROUP BYclause or be used in an aggregate functionZEILE 1: SELECT id, daten FROM groupby test GROUP BY daten;Andreas ’ads’ ScherbaumIntroMySQLMySQL PostgreSQLPortieren PostgreSQLFragen & AntwortenFallstrickeGROUP BY Ersatz: Anfragen richtig schreibenBeispiel (GROUP BY)test # SELECT MIN(id), daten FROM groupby test GROUP BY daten;min daten----- ---------2 Boot1 Auto3 Flugzeug(3 Zeilen)Vorteil: eindeutige ErgebnisseAndreas ’ads’ ScherbaumMySQL PostgreSQL

IntroPortieren PostgreSQLMySQLFragen & AntwortenFallstrickeSortieren und NULL-WerteMySQL sortiert NULL-Werte an den Anfang der ErgebnislistePostgreSQL an das EndeBeispiel (NULL)CREATE TABLE null test RTINSERTINTOINTOINTOINTOINTOnull testnull testnull testnull testnull test(id,(id,(id,(id,(id,PRIMARY KEY,daten)daten)daten)daten)daten)Andreas ’ads’ );MySQL PostgreSQLPortieren PostgreSQLFallstrickeSortieren und NULL-WerteBeispiel (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’ ScherbaumMySQL PostgreSQLFragen & Antworten

IntroMySQLPortieren PostgreSQLFragen & AntwortenFallstrickeSortieren und NULL-WerteBeispiel (NULL: in PostgreSQL)test # SELECT id, daten FROM null test ORDER BY daten;id daten---- ------1 a3 b5 c2 4 (5 Zeilen)Andreas ’ads’ ScherbaumIntroMySQLMySQL PostgreSQLPortieren PostgreSQLFragen & AntwortenFallstrickeSortieren und NULL-Werte: NULLS FIRSTPostgreSQL verlangt:alle Spalten werden in GROUP BY aufgeführtoder in einer Aggregatfunktion verwendetBeispiel (NULL: NULLS FIRST)test # SELECT id, daten FROM null test ORDER BY daten NULLS FIRST;id daten---- ------2 4 1 a3 b5 c(5 Zeilen)Andreas ’ads’ ScherbaumMySQL PostgreSQL

IntroMySQLPortieren PostgreSQLFragen & AntwortenFallstrickeIFNULL()MySQL kennt IFNULL() und COALESCE()unterscheiden sich jedoch nicht wesentlichBeispiel (IFNULL())mysql SELECT IFNULL(NULL, 10); ------------------ IFNULL(NULL, 10) ------------------ 10 ------------------ 1 row in set (0.00 sec)Andreas ’ads’ ScherbaumIntroMySQLMySQL PostgreSQLPortieren PostgreSQLFallstrickeCOALESCE()Beispiel (COALESCE())mysql SELECT COALESCE(NULL, 10, 20); ------------------------ COALESCE(NULL, 10, 20) ------------------------ 10 ------------------------ 1 row in set (0.00 sec)Andreas ’ads’ ScherbaumMySQL PostgreSQLFragen & Antworten

IntroMySQLPortieren PostgreSQLFragen & AntwortenFallstrickeIFNULL() Ersatz: COALESCE()Einfach überall IFNULL() gegen COALESCE() austauschenUnterschied:IFNULL() kennt nur 2 ParameterCOALESCE() kann mehrere Parameter verarbeitenAndreas ’ads’ ScherbaumIntroMySQLMySQL PostgreSQLPortieren PostgreSQLFragen & AntwortenFallstrickeGroß-/Kleinschreibung der BezeichnerIn MySQL bestimmt (bei einigen Tabellentypen) dasDateisystem die Groß-/KleinschreibungUnter Windows ist die Groß-/Kleinschreibung egalUnter einigen Unix-Systemen ist die Groß-/KleinschreibungwichtigPostgreSQL ist das Dateisystem egal ;-)Andreas ’ads’ ScherbaumMySQL PostgreSQL

IntroMySQLPortieren PostgreSQLFragen & AntwortenFallstrickeGroß-/Kleinschreibung der BezeichnerDer SQL-Standard schreibt alle Bezeichner großPostgreSQL schreibt alle Bezeichner kleinBeispiel (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’ ScherbaumIntroMySQLMySQL PostgreSQLPortieren PostgreSQLFragen & AntwortenFallstrickeGroß-/Kleinschreibung der BezeichnerMöchte man Bezeichner groß schreiben sind ”” zu verwendenBeispiel (Groß-/Kleinschreibung)test# SELECT 1 AS "GeMiScHt";GeMiScHt---------1(1 Zeile)Vorsicht bei der Verwendung von FrameworksAndreas ’ads’ ScherbaumMySQL PostgreSQL

IntroMySQLPortieren PostgreSQLFragen & AntwortenFallstrickeCONSTRAINTs und REFERENCESEinige MySQL Tabellentypen kennen CONSTRAINTs undREFERENCESandere nichtFolge: kaum jemand setzt das einWeitere Besonderheiten:beide Spalten müssen die gleiche Definition haben (gleicherDatentyp, NULL/NOT NULL)beide Spalten müssen einen Index habenAndreas ’ads’ ScherbaumIntroMySQLMySQL PostgreSQLPortieren PostgreSQLFragen & AntwortenFallstrickeDatums- und ZeitangabenDatentypen für Zeit- und Datumsangaben unterscheiden sehrstarkFunktionen zum Formatieren der Ausgabe sind unterschiedlichTIMESTAMP in PostgreSQL hat eine Auflösung imMikrosekundenbereichzusätzlich hat ein TIMESTAMPTZ eine ZeitzoneOperationen mit Zeitangaben geben in PostgreSQL den TypINTERVAL zurückFazit: viel Detail- und Handarbeit notwendig :-(Andreas ’ads’ ScherbaumMySQL PostgreSQL

IntroMySQLPortieren PostgreSQLFragen & AntwortenFallstrickeDatums- und ZeitangabenBeispiel: 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’ ScherbaumIntroMySQLMySQL PostgreSQLPortieren PostgreSQLFallstrickeORDER BY RAND()Funktion zum Erzeugen von Zufallszahlenin MySQL: RAND()in PostgreSQL: RANDOM()Suchen/Ersetzen sollte ausreichenAndreas ’ads’ ScherbaumMySQL PostgreSQLFragen & Antworten

IntroMySQLPortieren PostgreSQLFragen & AntwortenFallstrickeLIKE und ILIKELIKE in MySQL unterscheidet nicht zwischenGroß-/KleinschreibungLIKE in PostgreSQL ist case-sensitivefür case-insensitive Suchen: ILIKEAndreas ’ads’ ScherbaumIntroMySQLMySQL PostgreSQLPortieren PostgreSQLFallstrickeLIKE und ILIKEBeispiel (LIKE)test# SELECT ’AUTO’ LIKE ’auto’;?column?---------f(1 Zeile)Beispiel (ILIKE)test# SELECT ’AUTO’ ILIKE ’auto’;?column?---------t(1 Zeile)Andreas ’ads’ ScherbaumMySQL PostgreSQLFragen & Antworten

IntroMySQLPortieren PostgreSQLFragen & AntwortenFallstrickeBoolesche WerteMySQL kennt keinen (richtigen) Boolean-Wertstattdessen wird ein SMALLINT(1) verwendetführt dazu das ein Boolean auch mal 7 verschiedene Wertehaben kann .PostgreSQL kennt einen richtigen BOOLEAN-DatentypAndreas ’ads’ ScherbaumIntroMySQLMySQL PostgreSQLPortieren PostgreSQLFragen & AntwortenFallstrickeString-Verknüpfungen versus logische OperatorenMySQL verwendet den Operator für ”logisch ODER”Der SQL-Standard – und PostgreSQL– verwenden fürTextverknüpfungenSpaß ist vorprogrammiert”logisch ODER” wird in PostgreSQL mit Hilfe desOR-Operators durchgeführtAndreas ’ads’ ScherbaumMySQL PostgreSQL

IntroMySQLPortieren PostgreSQLFragen & AntwortenFallstrickeString-Verknüpfungen versus logische OperatorenMySQL kennt auch && für ”logisch UND”das hat jedoch keine Entsprechung in anderen Datenbankenist daher einfach zu finden und zu beseitigenAndreas ’ads’ ScherbaumIntroMySQLMySQL PostgreSQLPortieren PostgreSQLFragen & AntwortenFallstrickeBinäre DatenMySQL verwendet VARBINARY oder BINARYPostgreSQL verwendet BYTEAAnwendung wird primär durch die Anwendung bestimmtAndreas ’ads’ ScherbaumMySQL PostgreSQL

IntroMySQLPortieren PostgreSQLFragen & AntwortenFallstrickeINSERT IGNORE und REPLACEMySQL erlaubt mittels INSERT IGNORE das Überspringen vonUnique-Key VerletzungenPostgreSQL erlaubt das nichtREPLACE überschreibt die Zeile mit dem Primärschlüssel mitden neuen DatenQuasi ein INSERT ODER UPDATENachteil: kein SQL-StandardAndreas ’ads’ ScherbaumIntroMySQLMySQL PostgreSQLPortieren PostgreSQLFallstrickeINSERT IGNORE und REPLACE ErsatzAbhilfe für INSERT IGNOREdie PostgreSQL Online-Dokumentation enthält eineBeispielfunktionStichwort: UPSERTAbhilfe für REPLACE: MERGEDemnächst auch in ihrer bevorzugten DatenbankAndreas ’ads’ ScherbaumMySQL PostgreSQLFragen & Antworten

IntroMySQLPortieren PostgreSQLFragen & AntwortenFallstrickeDaten aus Datei ladenMySQL verwendet LOAD DATA zum Importieren von DatenPostgreSQL verwendet COPYAnwendung ist ähnlichAndreas ’ads’ ScherbaumIntroMySQLMySQL PostgreSQLPortieren PostgreSQLFallstrickeDaten in Datei schreibenMySQL verwendet SELECT .Exportieren von DatenINTO OUTFILE zumPostgreSQL verwendet wiederum COPYAndreas ’ads’ ScherbaumMySQL PostgreSQLFragen & Antworten

IntroMySQLPortieren PostgreSQLFragen & AntwortenFallstrickeKommentareMySQL versteht als Kommentar:die Raute: #doppelte Bindestriche: -für mehrzeilige Kommentare: /* . */PostgreSQL versteht die Raute (#) nicht als KommentarAndreas ’ads’ ScherbaumIntroMySQLMySQL PostgreSQLPortieren PostgreSQLFragen & AntwortenFallstrickeAnführungszeichenMySQL erlaubt die Verwendung von einfachen und doppeltenAnführungszeichen für Daten und BezeichnerPostgreSQL verlangt einfache Hochkommas für Daten (lautSQL-Standard)PostgreSQL verlangt doppelte Anführungszeichen fürBezeichner (laut SQL-Standard)MySQL erlaubt die Verwendung von Akzentmarkern(Backticks) für BezeichnerEin Anfang wäre das Exportieren mittels ”ansi”:Beispiel (mysqldump)mysqldump --compatible ansiAndreas ’ads’ ScherbaumMySQL PostgreSQL

IntroMySQLPortieren PostgreSQLFragen & AntwortenFallstrickeStorage-EnginesMySQL 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, AWSS3Problem: jede Storage Engine bietet andere Vor- undNachteileImplementierungsdetails (Volltextsuche, Transaktionen,Foreign Keys, Check Constraints, Groß-/Kleinschreibung, .)sind abhängig von der EngineViel Spaß bei der Auswahl des passenden Typs :-(Andreas ’ads’ ScherbaumIntroMySQLMySQL PostgreSQLPortieren PostgreSQLFragen & AntwortenFallstrickeStorage-Engines in PostgreSQLPostgreSQL kennt keine Storage-Engines ;-)jede Tabelle kann alle FeaturesAlle ENGINE- oder TYPE-Parameter können entfernt werdenAndreas ’ads’ ScherbaumMySQL PostgreSQL

IntroMySQLPortieren PostgreSQLFragen & AntwortenFallstrickeTransaktionenMySQL kennt Transaktionen – bei einigen Storage EnginesPostgreSQL nutzt überall TransaktionenNutzen Sie das!Andreas ’ads’ ScherbaumIntroMySQLMySQL PostgreSQLPortieren PostgreSQLFragen & AntwortenFallstrickeStorage-Engines in PostgreSQLPostgreSQL kennt keine Storage-Engines ;-)jede Tabelle kann alle FeaturesAlle ENGINE- oder TYPE-Parameter können entfernt werdenAndreas ’ads’ ScherbaumMySQL PostgreSQL

IntroPortieren PostgreSQLMySQLFragen & AntwortenFallstrickeDatentypenDie Datentypen unterscheiden sich, teilweise sogar sehr EAN oder SMALLINTINTEGERBIGINTFLOATDOUBLE PRECISIONDOUBLE PRECISIONFLOATNUMERICDECIMALAndreas ’ads’ ScherbaumIntroMySQLMySQL PostgreSQLPortieren RBYTEA oder TEXTBYTEA oder TEXTTEXTTEXTTEXTENUM oder 1:n-Tabellekein Ersatz, 1:n-Tabelle möglichAndreas ’ads’ ScherbaumMySQL PostgreSQLFragen & Antworten

IntroPortieren PostgreSQLMySQLFragen & TIMESTAMPTIMEYEARDatentypBITErsatzTIMESTAMP oder TIMESTAMPTZDATETIMESTAMP oder TIMESTAMPTZTIMEDATEErsatzBIT oder BIT VARYINGAndreas ’ads’ ScherbaumIntroMySQLMySQL PostgreSQLPortieren PostgreSQLFragen & AntwortenHilfsmittelmysql2pgsqlmysql2pgsql kann einen Datenbankdump portierenfunktioniert recht gut, trotzdem ist Handarbeit notwendigImport dauert länger, da INSERTs statt COPY verwendetwerdenWebseite: http://pgfoundry.org/projects/mysql2pgsql/Andreas ’ads’ ScherbaumMySQL PostgreSQL

IntroMySQLPortieren PostgreSQLFragen & AntwortenHilfsmittelmysql2pgsqlBeispiel (mysql2pgsql)perl mysql2pgsql.perl mysql-dump.sql pg-dump.sqlAndreas ’ads’ ScherbaumIntroMySQLMySQL PostgreSQLPortieren PostgreSQLHilfsmittelmysql2pgsql – nützliche Optionen--debug liefert umfangreiche Ausgaben--char2varchar wandelt alle CHAR-Spalten inVARCHAR-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 PostgreSQLAndreas ’ads’ ScherbaumMySQL PostgreSQLFragen & Antworten

IntroMySQLPortieren PostgreSQLFragen & AntwortenIndexesmehrere IndexesPostgreSQL kann mehrere Indexes pro Anfrage verwendenAndreas ’ads’ ScherbaumIntroMySQLMySQL PostgreSQLPortieren PostgreSQLFeedbackFeedback ist wichtig für:die Konferenzden VortragendenWebseite: http://2010.pgday.eu/feedbackAndreas ’ads’ ScherbaumMySQL PostgreSQLFragen & Antworten

IntroMySQLPortieren PostgreSQLFragen & AntwortenWichtiger TerminWichtiger TerminFOSDEM 2011 – PostgreSQL Devroom5.-6. Februar 2011in BrüsselWebseite: http://www.fosdem.org/Andreas ’ads’ ScherbaumIntroMySQLMySQL PostgreSQLPortieren PostgreSQLFragen & AntwortenPostgreSQL BuchPostgreSQL – Datenbankpraxisfür Anwender, Administratorenund EntwicklerErschien im Juli 2009Verlag Open Source PressUmfang: ca. 520 SeitenAndreas ’ads’ ScherbaumMySQL PostgreSQLim

IntroMySQLPortieren andreas.scherbaum.la/Fragen?Andreas ’ads’ Scherbaum [email protected] PostgreSQL User Group GermanyEuropean PostgreSQL User GroupPostgreSQL Service & SupportAndreas ’ads’ ScherbaumMySQL PostgreSQLFragen & Antworten

Relationale Datenbank unter BSD Lizenz Weltweit aktive Community Zahlreiche Features und Funktionen (Foreign Keys, Transaktionen, Trigger) La uft auf zahlreichen Betriebssystemen und diverser Hardware Weitgehendes Einhalten der SQL-Standards { Dokumentation der Abweichungen Im Schnitt pro Jah