Es kann schon mal vorkommen, dass nach einem Reboot oder Hard-Reset eines Servers der mysql-Server meldet, dass einige Tabellen defekt sind. Die Datenbank startet dann zwar ganz normal, einige Queries auf defekte/korrupte Tabellen können dann jedoch nicht mehr ausgeführt werden.
Um diese defekten Tabellen zu reparieren, kann man z.B. myisamchk mit den Optionen -rf im Datenverzeichnis von mySQL (unter Debian /var/lib/mysql) die Datenbanken reparieren. Alternativ kann man dies jedoch auch direkt mit mySQL erledigen, der Syntax lautet dann REPAIR TABLE <tabellenname>.
Dies jedoch manuell über alle Tabellen auszuführen, ist lästig, weshalb ich hier einen Code-Schnipsel bereitstelle, der alle Tabellen in allen Datenbanken repariert – dies funktioniert jedoch nur mit der Datenbank Engine MYISAM:
<?php
$db=mysql_connect(“localhost”,”root”,”<passwort>”);
$sql = “show databases;”;
$res_db = mysql_query($sql,$db);
while ($dat_db = mysql_fetch_array($res_db)) {
$datab = $dat_db[“Database”];
mysql_select_db($datab,$db);
$sql = “show tables;”;
$res = mysql_query($sql,$db);
while ($dat = mysql_fetch_array($res)) {
$table = $dat[0];
$sql2 = “repair table $table”;
$res2 = mysql_query($sql2,$db);
}
}
?>
Man kann dieses Script speichern, die Modes auf executable setzen und es am Ende in /etc/init.d/mysql anfügen, damit die Tabellen automatisch nach jedem Start von mysql repariert werden.
Wäre es nicht besser dieses hier auszuführen?
mysqlcheck -u root -p$dbpassword –all-databases –optimize –auto-repair –silent
Bin mir nicht ganz sicher …
lga
Viele Wege führen zum Erfolg.