Table des matières

MySQL

Benchmark de MySQL

SELECT benchmark(100000000,1+2);

Reset un mot de passe root perdu

sudo /etc/init.d/mysql stop
sudo mysqld_safe --skip-grant-tables &
mysql
UPDATE mysql.user SET password = password('VOTRENOUVEAUMOTDEPASSE') WHERE USER = 'root';
FLUSH privileges;
exit
sudo /etc/init.d/mysql stop
sudo /etc/init.d/mysql start

Dump des privilèges des utilisateurs

mysql -B -N $@ -e "SELECT DISTINCT CONCAT(
'SHOW GRANTS FOR ''', user, '''@''', host, ''';'
) AS query FROM mysql.user" | \
mysql $@ | \
sed 's/\(GRANT .*\)/\1;/;s/^\(Grants for .*\)/## \1 ##/;/##/{x;p;x;}'

Réplication Master-Master

Principe : Le serveur 1 sera à la fois master pour le serveur 2 et le slave pour serveur 2 et inversement.

Remarque : Il est possible en adaptant un peu cette configuration de synchroniser que certaine bases.

A partir de MySQL 5.7, cette configuration est faite à l'aide de la requête SQL suivante :
CHANGE MASTER TO MASTER_HOST='192.168.88.101', MASTER_USER='replication', MASTER_PASSWORD='mdpslave';

La synchronisation est normalement opérationnel.

Si ça se passe mal

Could not find first log file name in binary log index file

Si vous rencontrez une erreur du type :

 Last_IO_Errno: 1236
 Last_IO_Error: Got fatal error 1236 from master when reading data from binary log: ‘Could not find first log file name in binary log index file’

Voici la solution à appliquer :

Resynchro complète d'une des machines sur l'autre

Optimiser MySQL

Utiliser l'outil mysqltuner qui vous dira que faire. Si il vous en parle, pour défragmenter vos tables, utiliser le script suivant :

#!/bin/bash
 
# Get a list of all fragmented tables
FRAGMENTED_TABLES="$( mysql -e "use information_schema; SELECT TABLE_SCHEMA,TABLE_NAME FROM TABLES WHERE TABLE_SCHEMA NOT IN ('information_schema','mysql') AND Data_free > 0;" | grep -v '^+' | sed 's,\t,.,' )"
 
# Run Optimize on
for fragment in $FRAGMENTED_TABLES; do
  database="$( echo $fragment | cut -d. -f1 )"
  table="$( echo $fragment | cut -d. -f2 )"
  [ $fragment != 'TABLE_SCHEMA.TABLE_NAME' ] && mysql -e "USE $database; OPTIMIZE TABLE $table;" > /dev/null 2>&1
done

Source : http://blog.barfoo.org/2008/09/19/defragmenting-all-fragmented-myisam-tables/

Recrée l'utilisateur debian-sys-maint

GRANT ALL PRIVILEGES ON *.* TO 'debian-sys-maint'@'localhost' IDENTIFIED BY '<password>' WITH GRANT OPTION;

Extraire les dumps DB par DB d'un dump complet

Le script ci-dessous automatise cela :

#!/bin/bash
 
IN="$1"
[ -z "$IN" -o ! -r "$IN" ] && echo "Usage : $0 input.sql" && exit 1
 
currentdb=""
dbline=""
endline=""
nbextracted=0
headend=""
function extract() {
        headend="$1"
        db="$2"
        f="$3"
        e="$4"
        file=db_$( echo "$db"|sed 's/[^A-Za-z\-\_]//g' ).sql
        echo -n "Extract DB $db (from $f to $e) to $file ... "
        sed -n 1,${headend}p $IN > $file
        sed -n ${f},${e}p $IN >> $file
        echo "end."
        let nbextracted=nbextracted+1
}
 
IFS="
"
for line in $( grep -n '\-\- Current Database:' $IN )
do
        nbline=$( echo "$line"|cut -d':' -f1 )
        if [ ! -z "$currentdb" ]
        then
                let f=dbline-1
                let e=nbline-2
                extract "$headend" "$currentdb" $f $e
        else
                let headend=nbline-2
        fi
        dbline=$nbline
        currentdb=$( echo "$line"|cut -d'`' -f2 )
done
 
if [ ! -z "$currentdb" ]
then
        let f=dbline-1
        e=$( wc -l $IN|awk '{print $1}' )
        extract "$headend" "$currentdb" $f $e
fi
 
echo "$nbextracted extracted DB(s) from $IN"