MySQL – konwersja baz danych z InnoDB do MyISAM

Właśnie natrafiłem na pewien problem przy przenoszeniu wielu baz danych z jednego serwera na drugi. Część baz była przechowywana w formacie InnoDB, a na nowym serwerze engine InnoDB został wyłąćzony. Czekała mnie konwersja setek tabel do MyISAM i pewnie spędziłbym nad tym parę godzin wklepując komendę za komendą, gdyby nie moje lenistwo. 😉 Postanowiłem poświęcić 10 minut swojego cennego czasu i napisać, krótki skrypt w PHP, który zrobi to za mnie. Oto on.


Database;
    $dbr2 = mysql_query("SHOW TABLE STATUS FROM $dbname",$db);
    while($dbrow2 = mysql_fetch_object($dbr2)){
        $tblname = $dbrow2->Name;
        $tblengine = $dbrow2->Engine;
        if($tblengine == "InnoDB"){
            echo $dbname.'.'.$tblname." Innodb -> MyISAM\n";
            mysql_query("ALTER TABLE $dbname.$tblname ENGINE=MyISAM",$db);
        }
    }
}
?>

Jak dokładnie działa? Najpierw pobiera listę wszystkich baz danych na serwerze. Potem w każdej z nich wywołuje komendę SHOW TABLE STATUS, która wyświetla tabele w bazie oraz dodatkowe dane takie jak m.in. wykorzystany silnik bazy (Engine). Jesli Engine = InnoDB to zamieniamy silnik z InnoDB na MyISAM z pomocą komendy ALTER TABLE. I to tyle 🙂

Jedna uwaga: skrypt nie jest w 100% skuteczny. Niektórych tabel nie da się zamienić na MyISAM – np. takie, które są powiązane z obcymi kluczami w innych tabelach. W takim przypadku tabele pozostaną w formacie InnoDB.

2 komentarze to “MySQL – konwersja baz danych z InnoDB do MyISAM

  • Ponieważ InnoDB oferuje kilka nowych opcji, to nie zawsze będzie można przenieść tabelę do MyISAM. Powyższy skrypt nie wyrzuca błędu, gdy trafi na taką tabelę, ale uruchamiając skrypt ponownie zobaczymy, które tabele nie zostały zmienione. Przeważnie przyczyną jest „ERROR 1217 Cannot delete or update a parent row: a foreign key constraint fails”. W takich przypadkach można jedynie ręcznie zmienić strukturę bazy, by nie odnosiła się do kluczy z innych tabel.

Trackbacks & Pings

  • Websites tagged "myisam" on Postsaver :

    […] – MySQL – konwersja baz danych z InnoDB do MyISAM saved by manuva2008-10-28 – php myadmin エラー saved by jokecamp2008-10-27 – MyISAM and InnoDB […]

    9 lat ago

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *