MyISAM to InnoDB Modul

Alles rund um Module und Plugins in CONTENIDO 4.10.
Antworten
Faar
Beiträge: 1915
Registriert: Sa 8. Sep 2007, 16:23
Wohnort: Brandenburg
Kontaktdaten:

MyISAM to InnoDB Modul

Beitrag von Faar » Di 8. Aug 2023, 15:17

Also, ich habe notgedrungen* ein Quick & Dirty Modul geschrieben, das mir alle MyISAM Tabellen in InnoDB umwandelt.
Bei älteren Installationen sind die meisten Tabellen noch MyISAM und das führt zum Beispiel bei einem Setup auf die neueren Versionen zu einem MySQL Fehler mit Abbruch des Setup Vorganges, weil der 1000 byte Speicher (MyISAM) für Indexe dank UTF-8 Zeichensatz nicht mehr reicht.
InnoDB hat von Haus aus mehr Speicher dafür zur Verfügung und dann klappt das mit dem Setup reibungslos.
Dafür aber sollten vor dem Setup alle Tabellen bereits InnoDB sein.

* wer das von Hand mal gemacht hat, klickt sich blöde bis alle Tabellen InnoDB sind und hat danach einen Mausarm.

Also darum mein Modulcode, für das ich absolut keine Garantie übernehme, versteht sich, das alle MyISAM Tabellen in der aktuellen Contenido DB findet und in InnoDB umwandelt.
Was muss man dafür tun?
Man nehme den Code, erzeuge ein neues Modul und füge den in den OUTPUT ein, geben dem einen passenden Namen und speichere es als "content"-Modul ab.
Dann erzeugt man eine Vorlage, fülle dieses und jenes Modul für Navi, Überschrift ein oder auch nicht, aber Hauptsache, das Modul wird in einem freien content-Container eingefügt.
Danach erstellt man sich in einer unbedeutenden Kategorie (Systemseiten z.B.) einen Artikel (nicht Startartikel) mit dieser Vorlage, macht den online aber nicht durchsuchbar und nicht durch Google indexierbar und benützt in den Artikel "Eigenschaften" den Artikellink und "öffnet" die Seite.
Dort wird im besten Fall dann was angezeigt und fertig.
Einmal sollte reichen.

Kontrolliert werden sollte das noch in der DB mittels phpmyadmin zum Beispiel, weil wie gesagt, keine Verantwortung für meinen Code.
Und ja, den Code kann man verbessern, werd ich vermutlich auch noch aber es musste schnell gehen, kennt ihr ja.

Code: Alles auswählen

<?php
/**
* Frank Koenig (dfabig.de)
* 04.08.2023
* Version 0.3
* Contenido 4.10.2-dev
*/

// Init vars and objects
$config = cRegistry::getConfig();
$DB1 = cRegistry::getDb();
$DB2 = cRegistry::getDb();


// Code starts here 
$databasename = $config['db']['connection']['database'];

$sql1 = "SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
  WHERE TABLE_SCHEMA = '".$databasename."' 
  AND ENGINE = 'MyISAM'";

$DB1->query($sql1);
$numbers = $DB1->numRows();
if ($numbers > 0) {
   $i = 0;
   $j = 0;
   $names = array();
   while($DB1->nextRecord()) {
      $tablename = $DB1->f(0);
      $sql2 = "ALTER TABLE `".$tablename."` ENGINE=INNODB";
      $names[] = $tablename;
      if($DB2->query($sql2)) {
         $i++;
      } else {
         $j++;
      }
   }
   echo "<br>".$numbers." of Tables with MyISAM were found<br>";
   echo '<pre>';
   print_r($names);
   echo "</pre>";
   echo "<br>Finished";
   echo "<br>succes ".$i;
   echo "<br>failed ".$j;
} else {
   echo "No MyISAM Tables were found";
}
?>
Ich werde noch anregen, dass man diese Funktion ins Setup übernimmt, da hier noch keine bestehenden Tabelle umgewandelt werden.
Fliegt der Bauer übers Dach, ist der Wind weißgott nicht schwach.

Oldperl
Beiträge: 4255
Registriert: Do 30. Jun 2005, 22:56
Wohnort: Eltmann, Unterfranken, Bayern
Kontaktdaten:

Re: MyISAM to InnoDB Modul

Beitrag von Oldperl » Mi 9. Aug 2023, 20:58

Hallo Frank,

ein einfaches Modul, das seinen Zweck erfüllt. Jedoch möchte ich folgende Punkte zu beachten geben:
  • Die Umwandlung funktioniert nur, wenn der Datenbank-Benutzer auch die entsprechenden Datenbankrechte hat. Dies ist nicht immer der Fall.
  • Dieses Modul sollte ausschließlich im Entwicklungs-Bereich genutzt werden, nicht im Live-Betrieb. Bei Fehlern kann es zu einer korrupten Datenbank kommen.
  • Natürlich ist, wie eigentlich immer, ein vorheriges Backup Pflicht.
  • Von einer Integration ins Setup möchte ich abraten. Das Setup ist nicht dafür vorgesehen solche Operationen, in der Regel am Live-System, durchzuführen. Die möglichen Risiken sowie die Zahl der unterschiedlichen zu berücksichtigenden Zustände und Fälle ist einfach zu hoch und nicht im Setup zu prüfen bzw. zu beachten. Hier gehört in persona Hand angelegt.
Alternative: Generell besteht auch die Möglichkeit eines SQL-Dump, bei dem man in der Datei per Copy&Paste die DB-Engine austauscht und die SQL-Datei danach wieder importiert.

Gruß aus Franken

Ortwin
ConLite 2.1, alternatives und stabiles Update von Contenido 4.8.x unter PHP 7.x - Download und Repo auf Gitport.de
phpBO Search Advanced - das Suchwort-Plugin für CONTENIDO 4.9
Mein Entwickler-Blog

Faar
Beiträge: 1915
Registriert: Sa 8. Sep 2007, 16:23
Wohnort: Brandenburg
Kontaktdaten:

Re: MyISAM to InnoDB Modul

Beitrag von Faar » Do 10. Aug 2023, 09:59

Hallo Ortwin,
danke für die Kritik.
Das Modul ist nicht perfekt und nicht wirklich fertig, siehe Versionsnummer. Es ist eine Notlösung, weil alle Tabellen manuell umzustellen eine üble Klickarbeit ist.

Diese DB-Rechte sollte jeder Contenido-Betreiber haben, weil Contenido beim Setup bereits "ALTER TABLE" macht.

Ja, es ist erheblich sicherer, es im Entwicklungsbereich zu betreiben oder vorher auszuprobieren. Im Live Betrieb sollte zumindest die Seite Offline geschaltet sein und natürlich wie immer, das obligatorische Backup.

Es wird ins Setup integriert werden, dafür sorge ich, weil die Contenido eigenen Tabellen inzwischen bereits von Haus aus InnoDB sind und MyISAM nicht mehr weiter entwickelt wird und irgendwann mal abgesägt.
Das Setup führt bereits so eine Aktion durch, ein Blick in die Setup-SQL macht schlau.
Ohne das würde und wird das Setup gar nicht mehr durchlaufen bei Updates etwas älterer Seiten die noch MyISAM haben.
Das war auch der Grund, das jetzt mal als Modul aufzugreifen, weil eine doofe MyISAM Tabelle mein Setup immer abbrechen ließ.

InnoDB ist die Standard-Engine von MySQL und MyISAM ist veraltet und die neueren Contenido Versionen laufen alle bereits mit InnoDB.
InnoDB hat inzwischen auch die Volltextsuche: https://dev.mysql.com/doc/refman/8.0/en ... earch.html

Was im Setup aber sinnvoll ist, das ist ein ALTER TABLE ausschließlich nur für die Contenido Tabellen, die sowieso schon InnoDB sind. Also eine Liste der Tabellen, die abzuarbeiten ist, weil Contenido "weiß" welche Tabellen es benützt.
Bevor das passiert, sollte im Setup ein Haken entfernt oder gesetzt werden können, ob man das möchte.
Ich tendiere zum "entfernen", weil die meisten User gar nicht wissen, ob sie noch MyISAM brauchen.
Andere Tabellen, die von externen Programmen sind oder von eigenen Plugins und Modulen, die werden dann gar nicht davon berührt.
Es geht dann nur um die Tabellen, die jetzt schon im Setup InnoDB sind. Es ist ein Manko, dass die noch nicht beim Update umgewandelt werden.

Da komme ich nochmal auf mein Modul zurück:
Es ist meine Idee, das so auszubauen, dass es eine Lister alle MyISAM Tabellen auflistet, ähnlich wie in phpmyadmin, wo man dann alle Tabellen anwählen und abwählen kann und auch einzeln.
Luxuriöserweise kann man auch noch eine Liste im Modul führen, die nur die Contenido eigenen Tabellen mit den gefundenen abgleicht und nur diesen ein Häkchen setzt. Dann sieht man auch, wo noch ein Häkchen fehlt.
Aber das ist halt eine Fleißarbeit.
Es musste schnell gehen und ich brauchte das Zeug :roll:
Fliegt der Bauer übers Dach, ist der Wind weißgott nicht schwach.

Antworten