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.
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!
$ 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ó)
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.
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)
#!/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".
http://artisan.karma-lab.net/cas-de-migration-mysql-vers-postgresql-drupal http://heron.snell.clarkson.edu/~horn/classes/cards/perlrefcard.pdf
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
Engem főleg a DB szerver cseréjének oka érdekelne.