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
informatique:db:mysql [2016/03/31 12:39] – [Optimiser MySQL] bn8informatique:db:mysql [2016/12/06 17:50] (Version actuelle) – [Réplication Master-Master] bn8
Ligne 3: Ligne 3:
  
 ===== Benchmark de MySQL ===== ===== Benchmark de MySQL =====
-  SELECT benchmark(100000000,1+2);+<code sql>SELECT benchmark(100000000,1+2);</code>
      
 ===== Reset un mot de passe root perdu ===== ===== Reset un mot de passe root perdu =====
  
-  sudo /etc/init.d/mysql stop +<code bash>sudo /etc/init.d/mysql stop 
-  sudo mysqld_safe --skip-grant-tables & +sudo mysqld_safe --skip-grant-tables & 
-  mysql +mysql</code> 
-  > update mysql.user set password = password('VOTRENOUVEAUMOTDEPASSE') where user = 'root'; +<code sql> 
-  > flush privileges; +update mysql.user set password = password('VOTRENOUVEAUMOTDEPASSE') where user = 'root'; 
-  > exit +flush privileges; 
-  sudo /etc/init.d/mysql stop +exit</code> 
-  sudo /etc/init.d/mysql start  +<code bash>sudo /etc/init.d/mysql stop 
 +sudo /etc/init.d/mysql start</code>
  
 ===== Dump des privilèges des utilisateurs ===== ===== Dump des privilèges des utilisateurs =====
  
-  mysql -B -N $@ -e "SELECT DISTINCT CONCAT( +<code bash>mysql -B -N $@ -e "SELECT DISTINCT CONCAT( 
-    'SHOW GRANTS FOR ''', user, '''@''', host, ''';' +'SHOW GRANTS FOR ''', user, '''@''', host, ''';' 
-    ) AS query FROM mysql.user" | \ +) AS query FROM mysql.user" | \ 
-  mysql $@ | \ +mysql $@ | \ 
-  sed 's/\(GRANT .*\)/\1;/;s/^\(Grants for .*\)/## \1 ##/;/##/{x;p;x;}'+sed 's/\(GRANT .*\)/\1;/;s/^\(Grants for .*\)/## \1 ##/;/##/{x;p;x;}'</code>
 ===== Réplication Master-Master ===== ===== Réplication Master-Master =====
  
Ligne 38: Ligne 39:
 log_bin = /var/log/mysql/mysql-bin.log</code> log_bin = /var/log/mysql/mysql-bin.log</code>
       * Commenter la ligne : <code>bind-address = 127.0.0.1</code>       * Commenter la ligne : <code>bind-address = 127.0.0.1</code>
-    * Exécuter la requête SQL suivante : <code>grant replication slave on *.* to 'replication'@192.168.88.102 identified by 'mdpslave';</code>+    * Exécuter la requête SQL suivante : <code sql>grant replication slave on *.* to 'replication'@192.168.88.102 identified by 'mdpslave';</code>
     * Redémarrer le service //MySQL//     * Redémarrer le service //MySQL//
   * Sur serveur 2 :   * Sur serveur 2 :
Ligne 49: Ligne 50:
 master-password = mdpslave master-password = mdpslave
 master-port = 3306</code> master-port = 3306</code>
 +
 +<note>A partir de MySQL 5.7, cette configuration est faite à l'aide de la requête SQL suivante : <code sql>CHANGE MASTER TO MASTER_HOST='192.168.88.101', MASTER_USER='replication', MASTER_PASSWORD='mdpslave';</code></note> 
 +
     * Redémarrer le service //MySQL//     * Redémarrer le service //MySQL//
-    * Exécuter la requête SQL suivante : <code>start slave;</code> +    * Exécuter la requête SQL suivante : <code sql>start slave;</code> 
-    * Pour savoir si la réplication se passe correctement exécuter la requête suivante : <code>show slave status\G;</code>+    * Pour savoir si la réplication se passe correctement exécuter la requête suivante : <code sql>show slave status\G;</code>
     * Le résultat de cette requête devrais être a peu près : <code>*************************** 1. row ***************************     * Le résultat de cette requête devrais être a peu près : <code>*************************** 1. row ***************************
                Slave_IO_State: Waiting for master to send event                Slave_IO_State: Waiting for master to send event
Ligne 67: Ligne 71:
               ...</code>               ...</code>
     * Les valeurs //Slave_IO_Running// et //Slave_SQL_Running// doivent être à **Yes**.     * Les valeurs //Slave_IO_Running// et //Slave_SQL_Running// doivent être à **Yes**.
-    * Cette vérification est également possible depuis serveur 1 en exécutant la requête SQL suivante : <code>show master status;</code>+    * Cette vérification est également possible depuis serveur 1 en exécutant la requête SQL suivante : <code sql>show master status;</code>
     * Le résultat de cette requête devrais être a peu près : <code>+------------------+----------+--------------+------------------+     * Le résultat de cette requête devrais être a peu près : <code>+------------------+----------+--------------+------------------+
 | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
Ligne 74: Ligne 78:
 +------------------+----------+--------------+------------------+ +------------------+----------+--------------+------------------+
 1 row in set (0.00 sec)</code> 1 row in set (0.00 sec)</code>
-    * Exécuter ensuite la requête SQL suivante : <code>grant replication slave on *.* to 'replication'@192.168.88.101 identified by 'mdpslave2';</code>+    * Exécuter ensuite la requête SQL suivante : <code sql>grant replication slave on *.* to 'replication'@192.168.88.101 identified by 'mdpslave2';</code>
   * Sur serveur 1 :    * Sur serveur 1 : 
     * Editer le fichier ///etc/mysql/my.cnf//     * Editer le fichier ///etc/mysql/my.cnf//
Ligne 82: Ligne 86:
 master-port = 3306</code> master-port = 3306</code>
     * Redémarrer le service //MySQL//     * Redémarrer le service //MySQL//
-    * Exécuter la requête SQL suivante : <code>start slave;</code> +    * Exécuter la requête SQL suivante : <code sql>start slave;</code> 
-    * Vérifier que la synchronisation se passe correctement dans se sens également en exécutant la requête SQL : <code>show slave status\G;</code>+    * Vérifier que la synchronisation se passe correctement dans se sens également en exécutant la requête SQL : <code sql>show slave status\G;</code>
     * Le résultat de cette requête devrais être a peu près : <code>*************************** 1. row ***************************     * Le résultat de cette requête devrais être a peu près : <code>*************************** 1. row ***************************
                Slave_IO_State: Waiting for master to send event                Slave_IO_State: Waiting for master to send event
Ligne 99: Ligne 103:
               ...</code>               ...</code>
     * Les valeurs //Slave_IO_Running// et //Slave_SQL_Running// doivent être à **Yes**.     * Les valeurs //Slave_IO_Running// et //Slave_SQL_Running// doivent être à **Yes**.
-  * Sur serveur 2, la requête SQL suivante <code>show master status;</code> devrais retourner à peut près la même chose que sur serveur 1+  * Sur serveur 2, la requête SQL suivante <code sql>show master status;</code> devrais retourner à peut près la même chose que sur serveur 1
  
 La synchronisation est normalement opérationnel. La synchronisation est normalement opérationnel.
Ligne 105: Ligne 109:
 ===== Si ça se passe mal ===== ===== Si ça se passe mal =====
  
-      *Si vous rencontrez une erreur du type :+==== 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_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’    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 +Voici la solution à appliquer :
- +
-      *Sur le slave : +
- +
-   stop slave; +
- +
-      *Sur le master :+
  
-   flush logs; +  * Sur le slave : <code sql>stop slave;</code> 
-   show master status; — Noter le nom du log et la position+  * 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 le slave :+  * 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>
  
-   CHANGE MASTER TO MASTER_LOG_FILE=’log-bin.00000X′, MASTER_LOG_POS=106; 
-   start slave; 
  
 ===== Optimiser MySQL ===== ===== Optimiser MySQL =====
Ligne 130: Ligne 147:
 Utiliser l'outil **mysqltuner** qui vous dira que faire. Si il vous en parle, pour défragmenter vos tables, utiliser le script suivant : 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+<code bash>#!/bin/bash
  
 # Get a list of all fragmented tables # Get a list of all fragmented tables
Ligne 146: Ligne 163:
 ===== Recrée l'utilisateur debian-sys-maint ===== ===== Recrée l'utilisateur debian-sys-maint =====
  
-<code>GRANT ALL PRIVILEGES ON *.* TO 'debian-sys-maint'@'localhost' IDENTIFIED BY '<password>' WITH GRANT OPTION;</code>+<code sql>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 ===== ===== Extraire les dumps DB par DB d'un dump complet =====
Ligne 152: Ligne 169:
 Le script ci-dessous automatise cela : Le script ci-dessous automatise cela :
  
-<code>#!/bin/bash+<code bash>#!/bin/bash
  
 IN="$1" IN="$1"
  • informatique/db/mysql.1459427951.txt.gz
  • Dernière modification : 2016/03/31 12:39
  • de bn8