MysqlRebuild: Prendiamoci cura dei nostri DB

Mar, 31/10/2006 - 19:58

MysqlRebuild: Prendiamoci cura dei nostri DB

Inviato da paolo 4 commenti
Breve introduzione

Ciao, quello che vi presento oggi è un piccolo script, che utilizzo per controllare e riparare tutti i db del server di ILDN.

Partendo dal presupporto che tutti i DB, posso generare nel tempo stati di incosistenza su qualche tabella, abbiamo dunque la necessita di un qualche servizio che in automatico si prenda cura di controllare e riparare tutte le tabelle ISAM dei nostri cari database.

Dunque lo script è il seguente:

#!/bin/bash
 
# MysqlRebuild -- paolo@ildn.net
#
# The MysqlRebuild is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2, or (at your option) any later
# version.
#
# This program is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
# details.
#
# You should have received a copy of the GNU General Public License along with
# this program. If not, write to the Free Software Foundation, Inc., 59 Temple
# Place - Suite 330, Boston, MA 02111-1307, USA.
#
 
 
MYSQL="/var/lib/mysql"
MYSQL_INIT="/etc/init.d/mysql"
DEBUG=1; 
 
. /lib/lsb/init-functions # apt-get install lsb-base (debian/ubuntu)
 
root () {
if [ x"`id -u`" != "x0" ] ; then
log_failure_msg "Error: Only root can do this!"
exit 1
fi
return 0
}
 
 
start_rebuild() {
log_begin_msg "Starting mysqlrebuild..."
 
    #/etc/init.d/monit stop  
    $MYSQL_INIT stop
 
# myisamchk --silent -of $MYSQL/*/*.MYI // Pretty alternative :)
 
cd $MYSQL
for db in `ls`; do
    if [ $DEBUG = 1 ]; then
        echo "DB:" $db;
    fi
    cd $MYSQL/$db;
    myisamchk --silent -of *.MYI;
done
 
#/etc/init.d/monit start
$MYSQL_INIT start
log_end_msg 1
}
 
start() {
root
start_rebuild
}
 
start

Stoppare il server Mysql (eventualmente anche il servizio di monitoraggio come monit)
* Lanciare myisamchk su tutte le tabelle dei vostri DB
* Riavviare il server Mysql

Il mio consiglio dunque è, metterlo in cron.weekly ad una qualche ora mattutina (4/5) in cui il traffico del vostro server è minimo.

Il codice sicuramente non è ottimizzato, ma fa il suo sporco lavoro Smile

Spero vi sia utile.

Paolo





Commenti

Ritratto di mizi65
#1

Inviato da mizi65 il Lun, 06/11/2006 - 11:31.

correzioni

ho dovuto correggerlo così in 2 punti:

#!/bin/bash
 
# MysqlRebuild -- paolo@ildn.net
#
# The MysqlRebuild is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2, or (at your option) any later
# version.
#<
# This program is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
# details.
#
# You should have received a copy of the GNU General Public License along with
# this program. If not, write to the Free Software Foundation, Inc., 59 Temple
# Place - Suite 330, Boston, MA 02111-1307, USA.
#
 
MYSQL="/var/lib/mysql"
MYSQL_INIT="/etc/init.d/mysql"
DEBUG=1; 
 
. /lib/lsb/init-functions # apt-get install lsb-base (debian/ubuntu)
 
root () {
if [ x"`id -u`" != "x0" ] ; then
log_failure_msg "Error: Only root can do this!"
exit 1
fi
return 0
}
 
 
start_rebuild() {
log_begin_msg "Starting mysqlrebuild..."
 
    #/etc/init.d/monit stop  
    $MYSQL_INIT stop
 
# myisamchk --silent -of $MYSQL/*/*.MYI // Pretty alternative :)
 
cd $MYSQL for db in `ls`; do
    if [ $DEBUG = 1 ]; then
        echo "DB:" $db;
    fi
    cd $MYSQL$db;
    myisamchk --silent -of *.MYI;
done
#/etc/init.d/monit start
$MYSQL_INIT start
log_end_msg 1
}
 
start() {
root
start_rebuild
}
 
start



Ritratto di paolo
#2

Inviato da paolo il Lun, 06/11/2006 - 13:24.

Re:: correzioni

Mi sembra quel gioco "cerca le differenze" Smile

Ma non potresti evidenziare i cambiamenti e specificare il perchè ?

Grazie

Paolo Mainardi
CTO Twinbit http://www.twinbit.it
Vice Presidente -- ILDN - Italian Linux DIstro Network



Ritratto di mizi65
#3

Inviato da mizi65 il Lun, 06/11/2006 - 22:03.

Re:: correzioni

hai ragione, ma non avendo numeri di riga a disposizione ho creduto fosse + facile mettere il codice intero e lasciare che ognuno giochi con diff Wink
Cmq una modifica è stata qui:

#/etc/init.d/monit stop  
    MYSQL_INIT stop

diventato

    #/etc/init.d/monit stop  
        $MYSQL_INIT stop

mancava il $
l'altro è

        cd $db;
            myisamchk --silent -of *.MYI;
 

che è diventato
            cd $MYSQL/$db;
                myisamchk --silent -of *.MYI;

altrimenti mi trovava solo il primo db Smile

mi sono accorto ora che nella mia versione di codice completo avevo dimenticato lo / fra $MYSQL e $db



Ritratto di paolo
#4

Inviato da paolo il Gio, 09/11/2006 - 17:28.

Re:: correzioni

Perfetto cosi è molto più chiaro, aggiorno subito lo script Smile

Paolo

Paolo Mainardi
CTO Twinbit http://www.twinbit.it
Vice Presidente -- ILDN - Italian Linux DIstro Network