Drupal adatbázis migráció MySQL-ről Postgresql-re

Költözik a céges infrastruktúra. Előfordul az ilyen. Sőt az is előfordul, hogy az adatbázis szerver típusa is változik. Jelen esetben MySQL-t cseréljük Postgresql-re. A váltásnak kismillió oka van, de erről majd máskor. Most arra vállalkozom, hogy bemutassam lépésről lépésre, hogyan lehet egy működő Drupal portált átköltöztetni ilyen feltételek mellett.

  • Mindenek előtt szögezzük le, hogy közvetlen hozzáférésre lesz szükségünk a MySQL adatbázishoz, hogy a mysqldump parancsot futtathassuk megfelelő paraméterekkel.

Ha nem rendelkezünk ilyen hozzáféréssel, akkor előbb telepítsünk egy MySQL szervert valami desktop gépen, migráljuk az adatbázist előbb oda (MySQL és MySQL között kisebb gondok lehetnek csak), aztán onnan tovább a Postgresql szerverre. Ez főleg olyan esetekben lehet szükséges, ha az adatbázis szerver egy hosting szolgáltatónál van, ahol nem férünk hozza az adatbázishoz a kívánt módon. Presze, ha jó a kapcsolatunk a hosting szolgáltatóval, akkor kérhetjük tőlük az első jól célzott mysqldump parancs kiadását és az eredmény postázását. Az a bizonyos parancs, amit pedig futtatni kell az alábbi:

mysqldump \
    -u root -p -tv \
    --default-character-set=utf8 \
    --quote-names=false \
    --add-locks=false \
    --complete-insert \
    --compatible=postgresql \
    --extended-insert=false drupal > drupal_to_pgsql.dump

Nyilván a kulcs a compatible kapcsoló. Hurrá megvan a dump!

  • Hozzuk létre a Postgresql-ben a cél adatbázist és hozzá tartozó felhasználót:
$ createuser -S -D -R -P -E drupal
$ createdb -O drupal drupal

A fenti parancsokat szokás szerint a Postgresql admin felhasználója nevében kell kiadni (Debian Linux rendszeren ez nem meglepő módon a postgres felhasználó)

  • A céladatbázis feltöltése két lépésben zajlik. Először az alap drupal rendszer és az esetleges extra modulok adatbázis definícióit és alapértelmezett értékeit töltjük be:
psql -h localhost -q -f database/database.pgsql drupal drupal

Itt még jöhet pár olyan modul inicializálása hasonló módon, aminek vannak saját adatbázis táblái.

  • Második lépésben a dump-ot töltjük be:
psql -h localhost -q -f drupal_to_pgsql.dump drupal drupal

(kapunk egy rakat kulcs ütközést, egyenlőre nem törődünk vele)

  • Ha eddig nem volt nagy varázslat, akkor most kell egy kis kézimunka. A fő problémát a SEQUNECE-k kezdőértékeinek inicializálása jelenti. Amikor ezek létrejöttek 0-ról indulnak. Mivel MySQL-ben ilyenek nincsenek, így a dump nem is fogja megfelelő értékre beállítani őket. Kénytelenek leszünk kézzel. Erre készítettem gyorsan egy nem kifejezetten szép, de a célnak megfelelő Perl scriptet, ami a sequnece-hez tartozó adatbázisban a sequence jelenlegi maximális értékénél eggyel nagyobbra állítja a számláló értékét:
#!/usr/bin/env perl
$psql='psql -t -d drupal -c';
@seqs=split('\n', `$psql '\\ds'`);
foreach $s (@seqs) {
        chop $s;
        @words = split(' | ', $s);
        $s = $words[3];
        # create table and column_id name form sequence name
        @words2 = split('_', $s);
        $table = $words2[0];
        for($i=1; $i < $#words2 - 1; $i++) {
                $table = $table . "_" . $words2[$i]; 
        }
        $column_id=$words2[$#words2 - 1];
        $cmd="$psql 'select MAX($column_id) from $table'";
        $max =`$cmd`;
        $max=int($max);
        if ($max > 0) {
                $max++;
        }
        $cmd = "$psql 'alter sequence $s restart with $max'";
        `$cmd`
}

Perl guruk perlesebbé tehetik, optimalizálhatják, "kenyérre is kenhetik, süteményben is tehetik".

  • Opcionálisan célszerű az alábbi átmeneti adatokat tartalmazó adatbázis táblákat üríteni: cache; sessions; watchdog; accesslog;
  • Végül nincs más dolgunk, mint a settings.php állományban a db_url változót átírni.

Források

http://artisan.karma-lab.net/cas-de-migration-mysql-vers-postgresql-drupal http://heron.snell.clarkson.edu/~horn/classes/cards/perlrefcard.pdf

Szalai Ferenc | 2007, április 19 - 14:59 |
TLoF (nem ellenőrzött), 2007, április 20 - 18:31

Engem főleg a DB szerver cseréjének oka érdekelne.

dido (nem ellenőrzött), 2010, január 13 - 10:33

Very good post, thanks a lot.

Szalai Ferenc, 2007, április 21 - 09:01

Nem klasszikus okai voltak. A migráció nem csak adatbázisban, de fizikai helyben is megnyilvánult és az új helyen már futott egy Postgresql. Ott pedig azért futott mert egy annak képességeit jól kihasználó web alkalmazás fut rajta. Jómagam a Postgresql-t preferálom, de igazából azt értem meg nehezen, hogy miért kell adatbázis függő kódot írni. A legtöbb web alkalmazás nem használja ki az alul fekvő adatbázis szerver képességeit többek között azért sem, mert a MySQL képességei (amin a legtöbben felnőnek és tanulnak) meglehetősen szegényesek tudnak lenni. De ez innentől már flame :)

Érdekesség képen:
http://monstera.man.poznan.pl/wiki/index.php/Mysql_vs_postgres

Hozzászólás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.