informatique:db:mysql

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentes Révision précédente
Prochaine révision
Révision précédente
Prochaine révisionLes deux révisions suivantes
informatique:db:mysql [2012/02/03 14:29] bn8informatique:db:mysql [2016/08/05 08:42] – [Could not find first log file name in binary log index file] bn8
Ligne 16: Ligne 16:
   sudo /etc/init.d/mysql start     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 ===== ===== Réplication Master-Master =====
  
Ligne 96: Ligne 103:
 La synchronisation est normalement opérationnel. 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 :
 +
 +  * Sur le slave : <code sql>stop slave;</code>
 +  * Sur le master : 
 +    * Exécuter : <code sql>flush logs;
 +show master status;</code>
 +    * Noter le nom du log et la position
 +  *Sur le slave : <code sql>CHANGE MASTER TO MASTER_LOG_FILE=’log-bin.00000X′, MASTER_LOG_POS=106;
 +start slave;</code> 
 +==== Resynchro complète d'une des machines sur l'autre ====
 +
 +  * Sur une des deux machines que l'on choisira comme étant **master** : 
 +    * Exécuter les commandes SQL suivantes : <code sql>RESET MASTER;
 +FLUSH TABLES WITH READ LOCK;
 +SHOW MASTER STATUS;</code>
 +    * Copier le résultat de la dernière requête (//File// & //Position//)
 +    * Faire un dump des bases : <code bash>mysqldump --all-databases > /tmp/mysql.sql</code>
 +    * Exécuter la commande SQL suivante : <code sql>UNLOCK TABLES;</code>
 +  * Sur l'autre machine :
 +    * Exécuter la commande SQL suivante : <code sql>STOP SLAVE;</code>
 +    * Importer le dump généré sur l'autre machine : <code bash>mysql < /tmp/mysql.sql</code>
 +    * Exécuter les commandes SQL suivantes en adaptant les variables //MASTER_LOG_FILE// et //MASTER_LOG_POS// avec les informations obtenu lors des premières requêtes sur la machine master : <code sql>RESET SLAVE;
 +CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=98;
 +START SLAVE;</code>
 +    * Vérifier que la synchro est bien reparti à l'aide de la requête SQL : <code sql>show slave status\G;</code>
 +
 +
 +===== 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 :
 +
 +<code>#!/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</code>
 +
 +**Source : ** http://blog.barfoo.org/2008/09/19/defragmenting-all-fragmented-myisam-tables/
 +
 +===== Recrée l'utilisateur debian-sys-maint =====
 +
 +<code>GRANT ALL PRIVILEGES ON *.* TO 'debian-sys-maint'@'localhost' IDENTIFIED BY '<password>' WITH GRANT OPTION;</code>
 +
 +===== Extraire les dumps DB par DB d'un dump complet =====
 +
 +Le script ci-dessous automatise cela :
 +
 +<code>#!/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"</code>
  • informatique/db/mysql.txt
  • Dernière modification : 2016/12/06 17:50
  • de bn8