Joina två databaser

Tråden skapades och har fått 3 svar. Det senaste inlägget skrevs .
1

Jag har två stycken phpbb3-databaser som jag skulle vilja sammanfoga till en. Den ena innehåller just nu det skarpa forumet och den andra innehåller grunden till en portal.

Hur kan man enklast sammanfoga dess två databaser?

  • Medlem
  • Gävle
  • 2008-05-09 09:51

Är inte bekant med phpbb-databaser så jag kan inte säga på rak arm. Hur ser tabellstrukturer och sånt ut? Är det två nästan identiska forum som ska slås ihop eller är det två väldigt olika?

Vad är problemet?
Antagande: Du har två databaser, du vill sammanfoga dessa och bevara användare, forum, trådar och inlägg i båda. Det finns ingen funktion i phpbb (att sammanfoga två databaser), du måste göra det "för hand".

Bara för att vara lite övertydlig och ge en bra förklaring på vad som är vad, vad som kan gå fel och vad problemet är med att sammanfoga två tabeller med kolliderande data till en, så tänkte jag börja med att förklara vad problemet är du måste lösa: Problemet är att du har ID som krockar. Du har ju samma tabeller i båda, och dessa har börjat räkna från 1 allihopa. Varje gång en ny användare, forum eller tråd har skapats så har dessa fått ett nummer. Dessa nummer är i nummerordning, och därmed så finns det kanske användare nr 7 i båda databaserna i tabellen users, men i den ena databasen (källan) heter användare 7 Albert Einstein och i den andra databasen (målet) heter användare 7 George W Bush (aka Bozo the clown).

Om du gör fel här så kommer alltså alla inlägg skrivna av nr 7 att få en ny skribent, Albert Einsten kanske byts till George W Bush.

Eftersom varje forum har ett id (löpnummer), varje tråd i forumet bar både ett eget id (löpnummer) och även ett id på forumet det tillhör, varje inlägg har ett eget id (löpnummer) och lagrar även id på forumet, tråden och användaren som skrev det, så är det alltså på flera ställen man måste justera dessa ID så att det inte krockar.

Det gör man alltså i källan, sedan exporterar man data, importerar dem målet och så skall det förhoppningsvis vara klart då inga ID krockar.

Arbetsgången
Antagande: Du har tillgång till något MySQL-admin-verktyg (gärna PHPMyAdmin) och du har lite kunskaper i SQL, databaser mm.

1. Var noga med att det är samma version av phpbb i det jag kallar källan (den gamla db'n som skall in i den nya) och målet (den som skall innehålla alla data från två databaser).

Kanske den ena eller båda behöver uppgraderas först (med en backup före det i vanlig ordning).

Det kan bli väldans jobbigt om ena versionen har fält som inte finns i den andra.

2. Gör en backup först, flera stycken helst. Kolla att backupen har fungerat och är OK (både data och tabellstruktur är med). Självklart, eller hur?

3. Bekanta dig med tabellstrukturen, använd tex PHPMyAdmin för detta (eller något annat verktyg där du kan titta på tabellerna). Notera tex vad tabellerna heter som innehåller användare, forum, inlägg mm heter. Du behöver ha de exakta namnen senare.

4. Upprätta en lista på information ur källan enligt följande:

  • Namnet på tabellen

  • Namnet på ID-fältet (löpnummer, vanligen autoincrement)

  • Den aktuella nummerserien (startar oftast med 1), avrunda uppåt på slutet (497 kan du avrunda till 600, jepp 100 extra)

  • Namnet på andra fält i samma tabell som innehåller ID från andra tabeller (tabellen inlägg har säkerligen användarens id, forumets id, trådens id tex).

Det kan se ut så här (nu använder jag en annan forumprogramvara, FireBoard för Joomla):

jos_fb_messages (tabellens namn)

  • id 1-2 (namn på fältet med autoincrement och vilka ID som finns)

  • parent (fält med ID från annan tabell)

  • thread (fält med ID från annan tabell)

  • catid (fält med ID från annan tabell)

  • userid (fält med ID från annan tabell)

5. Dags att SQL'a lite (i din kopia!)

Om du kommit fram till att samma tabell jos_fb_messages i destinationen har id 1-52, så kan det vara lämpligt att uppdatera alla id i jos_fb_messages med tex 200. För userID's så gäller det med 500 och för parents gäller 300 osv...

Skapa en textfil med SQL-kommandon på följande sätt:

/* 
Uppdatera tabellen jos_fb_messages 
*/
UPDATE `jos_fb_messages `
SET ID = ID+200;

UPDATE `jos_fb_messages `
SET parent = parent +300;

UPDATE `jos_fb_messages `
SET userid = userid +500;

6. Kolla filen noga och gör detta för alla tabeller och alla fält i tabeller som behöver få sin ID-nummer-serie uppdaterat/flyttad. Om ett ID från en tabell förekommer i andra tabeller, måste samma faktor plussas på id't även i de andra tabellerna.

Kör sedan filen du skapat genom att i PHPMyadmin först välja din kopia av databasen, > Importera > Välj fil. Peka på din fil, den laddas upp och jobbar på den databas och de tabeller du specat i filen.

Använder du inte PHPMyadmin, så finns det motsvarande ställen där man kan peka på en fil med SQL-kommandon och instruera programmet att skicka dessa kommandon till MySQL.

7. Om allt gick åt skogen, justera, upprepa, kolla osv...

8. Exportera alla data (inte fältdefinitioner mm) från de olika tabellerna som krävs (user, posts, forums mm).

I PhpMyAdmin så kan du göra en sk sqldump genom att gå till > Exportera. Tag bort krysset för "Struktur", behåll det för "Data" och markera bara de tabeller som behövs. Det är förmodligen inte alla. Kryssa för "Spara till fil".

9. På skrivbordet får du en fil, denna skall du ladda upp till målet. Fortfarade i PhpMyAdmin: Välj din databasen som är din kopia av målet, var noga med att välja rätt databas här, tryck sedan på Importera > Välj fil > Kör.

Detta får alla inlägg, users mm (vad du nu valt) att skjutas in i målet med ID-nummer-serier som inte krockar.

MySQL verkar vara "snäll" och justerar automatiskt det sk auto_incremement-värdet i alla tabeller som har ett sådant när man gör en det där update-kommandot ovan.

Jag testade att skapa en ny post med PHPMyADmin i en tabell jag testat detta på och den fick nästa nummer i serien som den skulle ha.

10. Testa, testa och kolla att det blev rätt. Ha gärna några specifika poster i det gamla och nya som du söker fram och ser att de har rätt text, rätt skribent osv.

11. Justera, göra om tills det är perfekt. När det är perfekt, gör det på orginalet och det är dags att köra!

Lycka till!

Senast redigerat 2008-05-10 14:28

Hur gick det med detta?

1
Bevaka tråden