# Configuration MySQL Master / Slave avec Docker

---

## docker-compose.yml modifs:

- **services:**
  - **db:**
    - **volumes:**  
      ajouter la ligne `- mysql_master_data:/var/lib/mysql`

    - **command:**  
      modifier la dernière ligne de bash `'&& /entrypoint.sh mysqld'` par  
      `--server-id=1 --log-bin=mysql-bin --binlog-format=ROW --binlog-ignore-db=mysql --binlog-ignore-db=information_schema --binlog-ignore-db=performance_schema`  
      ### Empêcher la réplication des commandes système (solution permanente) ###

  - **db-slave:**
    - **volumes:**  
      ajouter la ligne `- mysql_slave_data:/var/lib/mysql`

    - **command:**  
      ajouter `--server-id=2 --relay-log=mysql-relay-bin --log-bin=mysql-bin --binlog-format=ROW --read-only=1` à la dernière ligne

    - **depends_on:**  
      ajouter
      ```- db ```

- **volumes:**  
  ajouter  
  mysql_master_data:
  mysql_slave_data:

## CRÉATION UTILISATEUR  *(SI UTILISATEUR NON CRÉÉ)*

```sql
CREATE USER 'replicator'@'%' IDENTIFIED BY 'replicator_password';
GRANT REPLICATION SLAVE ON *.* TO 'replicator'@'%';
FLUSH PRIVILEGES;
SHOW MASTER STATUS;
```

Doit retourner:
```
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000003 |      154 |              |                  |
+------------------+----------+--------------+------------------+
```

### Vérification et configuration du Slave

**Commande dédiée : status master check**

```bash
docker exec -it media_manager-db mysql -u root -proot -e "SHOW MASTER STATUS"

SI file mysql-bin.xxxxx et position connus, Passer en mode sql sur le SLAVE et executer:
```
```sql
CHANGE MASTER TO MASTER_HOST='db', MASTER_USER='replicator', MASTER_PASSWORD='replicator_password', MASTER_LOG_FILE=<logFile>, MASTER_LOG_POS=<positionVal>;
START SLAVE;
SHOW SLAVE STATUS\G
```
Lancer un make stop puis make up

L'installation est terminée.

## TIPS
*Nettoyer l'état actuel du slave*

Ce cas d'utilisation intervient lorsque la réplication MySQL Master/Slave est bloquée à cause d'une erreur.

### Symptômes typiques :


Slave_SQL_Running: No dans le statut du slave
Message d'erreur de réplication (duplicate key, table manquante, etc.)
Le slave ne se synchronise plus avec le master
Solution proposée :


### Arrêter le slave temporairement
Ignorer l'erreur problématique en cours (skip 1 événement du binlog)
Redémarrer la réplication
Vérifier que les threads IO et SQL fonctionnent à nouveau
### Quand l'utiliser :

- Erreur ponctuelle non critique (ex: insertion déjà présente)
- Besoin de reprendre rapidement la réplication
- L'écart de données est acceptable

#### ⚠️ Attention : Cette approche "saute" une transaction, créant potentiellement une divergence de données entre master et slave. À utiliser avec précaution et idéalement suivie d'une vérification de cohérence.
Sautez l'erreur actuelle et vérifiez le statut :

```bashdocker exec media_manager-db-slave mysql -u root -proot -e "STOP SLAVE; SET GLOBAL sql_slave_skip_counter = 1; START SLAVE;"

docker exec media_manager-db-slave mysql -u root -proot -e "SHOW SLAVE STATUS\G" | grep -E "(Slave_IO_Running|Slave_SQL_Running|Last.*Error|Seconds_Behind_Master)"
```
