Sep 262013
 

Ajouter les paquets :

echo 'deb http://repo.percona.com/apt wheezy main' > /etc/apt/sources.list.d/percona.list
gpg --keyserver  hkp://keys.gnupg.net --recv-keys 1C4CBDCDCD2EFD2A ; gpg -a --export CD2EFD2A | apt-key add -
apt-get update
apt-get install percona-xtradb-cluster-server-5.5 xtrabackup

Ajouter la configuration au my.cnf:

# Cluster
wsrep_provider                  = /usr/lib/libgalera_smm.so
wsrep_cluster_address           = gcomm://192.168.0.211,192.168.0.212,192.168.0.213
wsrep_slave_threads             = 8
wsrep_sst_method				= xtrabackup
wsrep_sst_auth                  = debian-sys-maint:<password>
wsrep_cluster_name              = test_cluster
wsrep_node_name                 = M1
wsrep_node_address              = 192.168.0.211
binlog_format                   = ROW
default_storage_engine          = InnoDB
innodb_autoinc_lock_mode        = 2
innodb_locks_unsafe_for_binlog  = 1
transaction-isolation           = READ-COMMITTED
wsrep_causal_reads              = OFF

Pour démarrer le premier serveur du cluster la première fois, utiliser la commande :

/etc/init.d/mysql bootstrap-pxc

Il faut au minimum 3 serveurs pour éviter, quand cas de problème réseaux sur un des serveurs, que le noeud restant ne se voit autonome et bloque les requêtes.

Pour voir si le noeud du cluster est prêt à recevoir des requêtes :

mysql -e"show status like 'wsrep_ready'"

Pour voir plus en détail l’état du cluster :

mysql -e"show status like 'wsrep_%'"

Pour la description des variables, voir : http://galeracluster.com/documentation-webpages/galerastatusvariables.html

!! Attention !! Ce cluster ne fonctionne qu’avec des tables InnoDB, la réplication MyISAM n’est qu’en beta et n’est pas fonctionnelle (table non identique sur chaque noeud en cas de « duplicate entry »). Pour l’activer malgré tout :

wsrep_replicate_myisam          = 1

Maj 27/03/14 : Lien mort

Mai 112012
 
#!/bin/bash
# Nom du lv a backup
lv='var_lib_mysql'
 
# Connect mysql
mysql='/usr/bin/mysql -uroot -p'
 
# Chemin
chem='/mnt/snapshot'
backup='/var/backup'
rapport='/tmp/rapport_backup.txt'
log='/var/log/backup.log'
 
# Size
snapshot_size='30G'
 
# Bin
rsync='/usr/bin/rsync'
cut='/usr/bin/cut'
grep='/bin/grep'
awk='/usr/bin/awk'
lvs='/sbin/lvs'
vgs='/sbin/vgs'
lvdisplay='/sbin/lvdisplay'
lvcreate='/sbin/lvcreate'
lvremove='/sbin/lvremove'
mount='/bin/mount'
umount='/bin/umount'
rm='/bin/rm'
df='/bin/df'
 
# DATE
TODAY=$(date '+%Y.%m.%d')
DELETE=$(date -d now-1days '+%Y.%m.%d')
 
function quit {
	# Send rapport if error
	if [ -s /tmp/rapport_backup.txt ]; then
	        /usr/bin/mail -s "Erreur de backup $DATE" user@test.fr < /tmp/rapport_backup.txt
	        $rm /tmp/rapport_backup.txt
		exit 1
	fi
	$rm /tmp/rapport_backup.txt
	exit 0
}
 
echo "Debut des verifs et suppression des anciens backups : `date +%Y.%m.%d-%Hh%M`" >> $log
 
## Suppression rapport 
if [ -f $rapport ]; then
        $rm $rapport
fi
 
## Verifications paquet 
if ! dpkg -l rsync |grep ^ii >/dev/null ; then 
        apt-get install rsync --force-yes &> /dev/null
        if ! dpkg -l rsync |grep ^ii >/dev/null ; then
                echo "Erreur : Installation paquet rsync !!!!" >> $rapport
		quit
        fi
fi
 
# Verif lv existe
if ! $lvdisplay | $grep 'LV Name' | $cut -d/ -f4 | $grep $lv &> /dev/null ; then
	echo "Erreur : LV $lv n'existe pas" >> $rapport
	quit
fi
 
# Verif si chem existe
if [ ! -d $chem ] ; then
	/bin/mkdir $chem
fi
if [ ! -d $chem ] ; then
	echo "Erreur : Impossible de créer $chem" >> $rapport
	quit
fi
 
# Verif si backup existe
if [ ! -d $backup ] ; then
	/bin/mkdir $backup
fi
if [ ! -d $backup ] ; then
	echo "Erreur : Impossible de créer $backup" >> $rapport
	quit
fi
 
# Verif freespace for snap
VG=$($lvs | $grep $lv | $awk '{print $2}' | uniq )
VG_free=$($vgs | $grep $VG | $awk '{print $7}' | $cut -d'G' -f1 | $cut -d'g' -f1 | $cut -d',' -f1)
if [ $(echo $snapshot_size | $cut -d'G' -f1 | $cut -d'g' -f1 | $cut -d',' -f1) -ge $VG_free ] ; then
	echo "Erreur : Pas assez de place pour créer le snaphot" >> $rapport
	quit
fi
 
# Verif si snap existe
if $lvs | $grep $VG | $grep lvmsnap &> /dev/null ; then
	echo "Erreur : LV lvmsnap existe" >> $rapport
	quit
fi
 
# Verif si chem déjà monté
if $mount | $grep $chem &> /dev/null ; then
	echo "Erreur : $chem déjà monté">> $rapport
        quit
fi
 
# Delete old backup
if [ -d $backup/$DELETE ] ; then
	$rm -r $backup/$DELETE
fi
if [ -d $backup/$DELETE ] ; then
	echo "Erreur : Impossible de supprimer $backup/$DELETE" >> $rapport
	quit
fi
 
# Chemin lv mapper
LVmapper=$(echo $lv | sed 's/-/--/' )
 
# Compare freespace backup > usedspace source (if source mount)
if $mount | $grep $LVmapper &> /dev/null ; then
	LVmount=$($mount | $grep $LVmapper | $awk '{print $3}')
	if [ $($df -P $backup | $grep '/' | $awk '{print $4}') -lt $($df -P $LVmount | $grep '/' | $awk '{print $3}') ] ; then
		echo "Erreur : Espace restant sur la destination du backup non suffisant" >> $rapport
		quit
	fi
fi
 
 
# Backup
	## Log time 
        echo "Debut du backup : `date +%Y.%m.%d-%Hh%M`" >> $log
 
	# Chemin dev lv
	LVS=$($lvdisplay | $grep 'LV Name' | $grep $lv | $awk '{print $3}')
 
	# Stop replication
	$mysql -e"stop slave;"
	if ! $mysql -e"show slave status\G" | $grep "Slave_SQL_Running" | $grep "No" &> /dev/null ; then
		echo "Erreur : La réplication ne s'arrête pas avant le snaphost" >> $rapport
                quit
        fi
	# Create snap
	$lvcreate -L$snapshot_size -s -n lvmsnap $LVS
 
	# Start replication
	$mysql -e"start slave;"
	if ! $mysql -e"show slave status\G" | $grep "Slave_SQL_Running" | $grep "Yes" &> /dev/null ; then
                echo "Waring : La réplication ne démarre pas après le snapshot" >> $rapport
        fi
	SNAP=$($lvdisplay | $grep 'LV Name' | $grep lvmsnap | $awk '{print $3}')
	if [ ! $SNAP ] ; then
		echo "Erreur : Impossible de créer le snaphost"  >> $rapport
		quit
	fi
 
	$mount $SNAP $chem
 
	# Copy
	$rsync -a $chem/ $backup/$TODAY/ >> $rapport
 
	$umount $chem
 
	# Check snapshot used
	if [ $($lvs | $grep lvmsnap | $awk '{print $6}') = 100.00 ] ; then
		echo "Erreur : Snapshot plein à la fin du backup" >> $rapport
		$rm -rf $backup/$TODAY
		$lvremove -f $SNAP
		quit
	fi
	if [ $($df $backup/$TODAY | $grep '/' | $awk '{print $3}') -le 0 ] ; then
		echo "Erreur : Destination du backup plein après la copie" >> $rapport
                $rm -rf $backup/$TODAY
		$lvremove -f $SNAP
		quit
        fi
	$lvremove -f $SNAP
 
	## Log time 
        echo "Fin du backup : `date +%Y.%m.%d-%Hh%M`" >> $log
 
quit
Avr 192012
 

Créez ce script et lancez le régulièrement avec un cron :

#!/bin/bash
 
USER=root
PASS=XXXXXX
TIME=120
mysql=/usr/bin/mysql
grep=/bin/grep
mysqladmin=/usr/bin/mysqladmin
 
## KILL SLEEP > $TIME
for requete in $($mysql -u$USER -p$PASS INFORMATION_SCHEMA -B -e'select id from PROCESSLIST where Command like "Sleep" and TIME >= "'$TIME'"'| $grep -v id); do 
       $mysqladmin -u$USER -p$PASS kill $requete 
done
 
## KILL SELECT > $TIME
for requete in $($mysql -u$USER -p$PASS INFORMATION_SCHEMA -B -e'select id from PROCESSLIST where INFO like "select%" and TIME >= "'$TIME'"'| $grep -v id); do 
       $mysqladmin -u$USER -p$PASS kill $requete 
done
Fév 192012
 

Kill tous les sleeps de plus de 10s :

for requete in $(mysql INFORMATION_SCHEMA -B -e'select id from PROCESSLIST where Command like "Sleep" and TIME >= "10"'| grep -v id); do /usr/bin/mysqladmin kill $requete ; done

Kill tous les selects de plus de 10s :

for requete in $(mysql INFORMATION_SCHEMA -B -e'select id from PROCESSLIST where INFO like "select%" and TIME >= "10"'| grep -v id); do /usr/bin/mysqladmin kill $requete ; done

Voir les requêtes en cours :

mysqladmin pro

ou

 mysql -e"show processlist"

Voir les requêtes en cours en entier :

 mysql -e"show full processlist"