WordPress Merge – Best Practice aus der Vorhölle

Quelle offsetten

Beginn der ID Anpassungen

Diese Updates laufen auf den Quelltabellen bevor du irgendwas in die Zieldatenbank kopierst. Ich hab einen Offset von 50.000 verwendet. Sprich alle relevanten ID’s werden um 50.000 aus der Quelldatenbank erhöht. Das vermeidet ID-Konflikte.

Warum 50.000?

Komm ich gleich drauf, zunächst holen wir uns mal die maximale PostID im Ziel. Sprich wie viel Posts habt ihr dort aktuell, bevor die anderen dazu kommen.

SELECT MAX(ID) AS max_id FROM wp_posts;
SELECT MIN(ID) AS min_attach, MAX(ID) AS max_attach FROM wp_posts WHERE post_type='attachment';

Bei mir bewegte sich das in einer 10.000er Range:

max_id: 11612
min_attach: 20
max_attach: 16001

Damit war klar: Mein Zielblog lag ID-mäßig komplett im Bereich 1…11612 und meine Attachments (überwiegend Bilder) lagen zwischen 20…11601.

Heißt im Umkehrschluss: Wenn der Quellblog auch irgendwo in diesem Bereich liegt – und das tut er fast immer – hast du sichere ID-Kollisionen. Gerade bei Attachments und Galerien.

Warum hab ich jetzt aber ein 50.000er Offset benutzt und kein 20.000er?

Mein Blog wird weiter wachsen. Spätere Imports/Merges könnten kollidieren. Die Merge-Daten starten bei über 50.000, dadurch könnt ihr auch während des Merges besser debuggen oder Rollbacks durchführen. 50.000 ist hier zukunftssicherer.

Kann ich keinen kleineren Offset verwenden und durch die Autoincrement-Anpassung wird am ende sowieso weiter gezählt?

Könnte man, AUTO_INCREMENT hilft aber dabei nicht Kollisionen zu vermeiden! AUTO_INCREMENT sorgt nur dafür, dass neue Datensätze künftig oberhalb der höchsten ID weiterlaufen (z.B. 51.619+ wenn wir den Merge durch haben). Es löst nicht das Problem: Bestehende IDs aus Quelle und Ziel überlappen.

Wie siehts mit der Postmeta-Tabelle aus?

Nun. Postmeta wird nirgendwo referenziert in WordPress. Nur Intern. meta_id selbst ist egal, wichtig wird später nur: post_id zeigt korrekt auf wp_posts.ID und dadurch bleiben die Referenzen in sich konsistent. Meta-IDs brauchen zudem keinen eigenen Offset, nur ein sauberes AUTO_INCREMENT.

Posts (inkl. Attachments) + Parent-Bezüge

Somit starten wir und bringen jetzt die ID’s der Quelle in Stellung. Dabei gehen wir auf die Tabellen:

  • src_posts
  • src_postmeta
  • src_comments
  • src_commentmeta

Um die Tax/Term-Tabellen (Kategorien, Tags) kümmern wir uns später! Los gehts!

Posts und Postsverbindungen (Parents) anreichern
UPDATE src_posts SET ID = ID + 50000;
UPDATE src_posts SET post_parent = post_parent + 50000 WHERE post_parent > 0;

Postmeta
UPDATE src_postmeta SET post_id = post_id + 50000;

Wie gesagt, die meta_id spielt keine Rolle. Wir lassen diese später beim „INSERT“ auch weg, diese soll die Datenbank (AUTO_INCREMENT) übernehmen.

Kommentare + Commentmeta
UPDATE src_comments
SET comment_ID = comment_ID + 50000,
    comment_post_ID = comment_post_ID + 50000,
    comment_parent = IF(comment_parent > 0, comment_parent + 50000, 0);

UPDATE src_commentmeta SET comment_id = comment_id + 50000;
dasFLOSEN Verfasst von:

Meine Name ist Florian. Sternzeit -338000.22768670303. Der Nerd der "Familie Schickischmi". Beruflich bin ich technikbegeisterter Papiervernichter. Privat natürlich ebenso der Tekkie im Familienuniversum, der aber trotzdem viel Zeit Draussen und beim Knipsen verbringt. Mir kanns nicht kalt und vom Reiseziel nördlich genug sein. Würde ich wählen, würde ich lieber die schorfen Klippen vom Ende der Welt wählen, als irgendeinen Südsee-Strand. Ich nehm also lieber die -20°C als alles über 25°C

Schreibe den ersten Kommentar

Kommentar verfassen