MySQL Replication

chour@mih-fr
Messages : 732
Inscription : ven. 12 janv. 2018 17:44

MySQL Replication

Message par chour@mih-fr »

Bonjour à tous !

J'ai mis en place une réplication MySQL, avec un master et un slave, chacun étant sur son propre serveur.
OS : W2K SP4
MySQL : 5.1.35-community

Cependant, le master ne se réplique pas sur le slave. Je n'ai rien dans les logs, les show master status et show slave status ne donnent pas beaucoup d'information.
Le slave est en "Waiting for master to send event".

J'ai rajouté ceci dans le my.conf du slave :
server-id=2
master-host=10.254.133.241
master-user=slave_user
master-password=Password01
master-connect-retry=60
replicate-do-db=wikidb,dotclear

et ceci dans le master :
log-bin="D:/Data/MySQL Server 5.1/mysql-bin.log"
server-id=1
binlog-do-db=wikidb,dotclear

Pour ceux qui aurait déjà mis ça en place, avez-vous rencontrez des difficultés ?

Merci ;)
fighting_falcon
Messages : 656
Inscription : ven. 12 janv. 2018 17:44

MySQL Replication

Message par fighting_falcon »

nan aucune ...

De mémoire, j'ai suivi ça :
http://members.cox.net/midian/howto/mys ... cation.htm

As tu fais la dernière partie ?
# mysql -u root -p
mysql> SLAVE STOP;
mysql> CHANGE MASTER TO MASTER_LOG_FILE='[Filename written down]',
MASTER_LOG_POS=[Position written down];
mysql> START SLAVE;
Avatar de l’utilisateur
Ryu_wm
Messages : 8166
Inscription : ven. 12 janv. 2018 17:44

MySQL Replication

Message par Ryu_wm »

ça fait des mois que je cherche à faire de la réplication MySQL entre deux hotes distants sur le net et je n'y arrive pas non plus
( en meme temps je me penche dessus tous les 36 du mois :p )

MAIS ce sujet m'interesse au plus haut point !
chour@mih-fr
Messages : 732
Inscription : ven. 12 janv. 2018 17:44

MySQL Replication

Message par chour@mih-fr »

Moi j'ai suivi ce tuto : http://www.howtoforge.com/mysql_database_replication

Et pareil, ça ne semble pas du tout fonctionner ... Alors que pour mon cas, je suis en intranet sans firewall ni rien !

fighting_falcon > Oui bien sûr !

En fait ce qui me chagrine, c'est que l'on fait connaître au slave quel est son master, mais pas l'inverse. Or, c'est le master qui initie la réplication, mais s'il ne connaît pas le ou les slave, ça ne peut jamais fonctionner, non ?!
fighting_falcon
Messages : 656
Inscription : ven. 12 janv. 2018 17:44

MySQL Replication

Message par fighting_falcon »

c'est le slave en démarrant qui se connecte au master et lui dit "ouh ouh je suis là" ;)

Ensuite, dès qu'il y a un truc à répliquer, le master l'envoie à chaque slave connecté ...
chour@mih-fr
Messages : 732
Inscription : ven. 12 janv. 2018 17:44

MySQL Replication

Message par chour@mih-fr »

Ok ok !

J'ai quand même un petit souci : le log binaire que j'ai renseigné n'a pas l'air de vouloir se créer :/ Je ne trouve pas mon fichier D:/Data/MySQL Server 5.1/mysql-bin.log sur le master. Mais aucune erreur dans les logs :(
nidosaur
Messages : 936
Inscription : ven. 12 janv. 2018 17:44

MySQL Replication

Message par nidosaur »

moi je mettrais des paths sans espace a ta place.

sinon ce que j'ai scripté pour créer un slave
#!/bin/sh
####################################################################
# PSU                                                              #
# 06/02/2009                                                       #
# Script pour repliquer 2 serveurs mysql                           #
# A Executer cote master (localhost)                               #
####################################################################

### variables de connection mysql ###
master_ip="144.56.18.63" ## nec_ubuntu
master_login="root"
master_password=""
master_repli_user="slave_user"
master_repli_password="slave_user"
slave_ip="144.56.14.73" ## nagios ex dickens
slave_login="root"
slave_password="slave"
### variables diverse ###
save_mysql="save.sql.bz2" #fichier de sauvegarde du dump mysql
exclude_database="mysql|information_schema" # Liste des databases a exclure de la sauvegarde separe par |


## Creation de la chaine de connection mysql
if [ $master_password ]; then connection_master=" -u$master_login -p$master_password "; else connection_master=" -u$master_login "; fi
if [ $slave_password ]; then connection_slave=" -u$slave_login -p$slave_password "; else connection_slave=" -u$slave_login "; fi

## On genere la liste des database a sauvegarder
databases=`echo "show databases\G" | mysql $connection_master | grep Database | grep -E -v $exclude_database | awk '{
print $2}'`
for base in $databases
do
        b=$b" "$base
done

echo "Sauvegarde Mysql du Master dans $save_mysql"
ssh $master_ip "mysqldump $connection_master --master-data --add-drop-table --databases $b | bzip2 > $save_mysql"

echo "Transfert de la sauvegarde sur le Slave"
ssh $master_ip "scp $save_mysql root@$slave_ip:/tmp/"

echo "Stop Slave"
echo "ssh $slave_ip 'mysql $connection_slave -e \"slave stop;\"'" | sh

echo "Restauration sur le Slave"
ssh $slave_ip "bzcat /tmp/$save_mysql | mysql $connection_slave"
echo "Fin de restauration sur le slave"

echo "Start Slave"
echo "ssh $slave_ip 'mysql $connection_slave -e \"slave start;\"'" | sh

echo "Nettoyage des fichiers sur Master et Slave"
ssh $master_ip "rm $save_mysql"
ssh $slave_ip "rm /tmp/$save_mysql"
le script est pas optimisé code, il est opitmisé lisibilité
nidosaur
Messages : 936
Inscription : ven. 12 janv. 2018 17:44

MySQL Replication

Message par nidosaur »

et pour vérifier la replication 2 scripts (attention ca fait un lock coté database master)
verif_repli.sh qui appelle norun_verif_mysql.sh
#!/bin/sh
####################################################################
# PSU                                                              #
# 06/02/2009                                                       #
# Script pour verifier la replication entre 2 serveurs mysql      #
# A Executer sur un serveur connu authorized_keys pour ssh         #
####################################################################

### variables ###
master_ip="localhost" ## nec_ubuntu
master_login="root"
master_password=""

## Creation de la chaine de connection mysql
if [ $master_password ]; then connection_master=" -u$master_login -p$master_password "; else connection_master=" -u$master_login "; fi


echo "Lock sur le Master"
ssh $master_ip 'mysql $connection_master -e "flush tables with read lock;
system /root/scripts/norun_verif_mysql.sh;
unlock tables;"'
echo "Unlock Master"


#!/bin/sh
####################################################################
# PSU                                                              #
# 06/02/2009                                                       #
# Script pour verifier la replication entre 2 serveurs mysql       #
# A Executer sur un serveur connu authorized_keys pour ssh         #
# Ce script est lance par le script verif_mysql.sh afin d acquerir #
# Un lock sur la session du programme                              #
####################################################################

### variables ###
master_ip="localhost" ## nec_ubuntu
master_login="root"
master_password=""
slave_ip="144.56.14.73" ## nagios ex dickens
slave_login="root"
slave_password="slave"
latence=5 #delai en seconde pour attendre la fin des transactions sur le master

## Creation de la chaine de connection mysql
if [ $master_password ]; then connection_master=" -u$master_login -p$master_password "; else connection_master=" -u$master_login "; fi
if [ $slave_password ]; then connection_slave=" -u$slave_login -p$slave_password "; else connection_slave=" -u$slave_login "; fi


echo "Attente de $latence secondes pour fin de replication"
sleep $latence


##Lecture de la position du master
master_pos=`ssh $master_ip "mysql ${connection_master} -e \"show master status\G\"" | grep "Position" | awk '{print $2}'`
##Lecture de la position du slave
slave_pos=`ssh $slave_ip "mysql ${connection_slave} -e \"show slave status\G\"" | grep "Read_Master_Log_Pos" | awk '{print $2}'`
slave_sql_running=`ssh $slave_ip "mysql ${connection_slave} -e \"show slave status\G\"" | grep "Slave_SQL_Running" | awk '{print $2}'`
slave_io_running=`ssh $slave_ip "mysql ${connection_slave} -e \"show slave status\G\"" | grep "Slave_IO_Running" | awk '{print $2}'`
echo "Position Master : "$master_pos
echo "Position Slave  : "$slave_pos

if [ $slave_sql_running == "No" ] || [ $slave_io_running == "No"  ]
then
        echo "KO : LA REPLICATION EST CASSE"
else
        if [ $slave_pos == $master_pos ]
        then
                echo "LA REPLICATION EST OK"
        else
                echo "KO : REPLICATION en retard"
        fi
fi
echo "Verification du checksum des tables du Master"
databases=`echo "show databases" | mysql $connection_master | grep -v Database`
for base in $databases
do
        tables=`echo "use $base;show tables;" | mysql $connection_master | grep -v "Tables_in_$base"`
        for t in $tables
        do
                ### On recupere le type de table innodb ou MyIsam ###
                master_type_table=`mysql -h $master_ip $connection_master -e "show table status from $base where name='$t'" | grep -v "Avg_row_length" | awk
'{print $2}'`
                master_isam_result=`echo "checksum table $base.$t" | mysql -h $master_ip $connection_master | grep "$base.$t" | awk '{print $2}'`
                slave_isam_result=`echo "checksum table $base.$t" | mysql -h $slave_ip $connection_slave | grep "$base.$t" |awk '{print $2}'`

               if [ "${master_isam_result}" != "${slave_isam_result}" ]
               then
                        echo "$master_type_table $base => $t => master : $master_isam_result   | slave : $slave_isam_result"
                fi
        done
done

c'est pas optimisé non plus il y a des ameliorations a mener mais c'est fonctionnel (dans ma boite et dans la boite d'un pote a qui je l ai donné

le principe de la verif est de locker les databases et de faire des checksums sur les tables puis de comparer.
Avatar de l’utilisateur
Ryu_wm
Messages : 8166
Inscription : ven. 12 janv. 2018 17:44

MySQL Replication

Message par Ryu_wm »

merci pour cette avancée

( pour moi ça ne sert pas car je suis sous mysql coté windows :) )
Naibed
Messages : 6
Inscription : ven. 12 janv. 2018 17:44

MySQL Replication

Message par Naibed »

sujet qui m intéresse vivement , je vais etre amené à faire la même chose ,merci du tuyau :)
chour@mih-fr
Messages : 732
Inscription : ven. 12 janv. 2018 17:44

MySQL Replication

Message par chour@mih-fr »

Je suis sous Windows également.
J'ai beau regarder mes "show slave status" et "show master status", je ne comprends toujours pas pourquoi ce foutu slave ne se met pas à jour ...

Code : Tout sélectionner

Waiting for master to send event 	10.254.133.241 	slave_user 	3306 	60 	mysql-bin.000005 	106 	pars03100504-relay-bin.000506 	251 	mysql-bin.000005 	Yes 	Yes 	wikidb,dotclear 	  	  	  	  	  	0 	  	0 	106 	558 	None 	  	0 	No 	  	  	  	  	  	0 	No 	0 	  	0 	 

fighting_falcon
Messages : 656
Inscription : ven. 12 janv. 2018 17:44

MySQL Replication

Message par fighting_falcon »

parefeu / routeur / autre entre les deux machines hébergeant les MySQL ?
chour@mih-fr
Messages : 732
Inscription : ven. 12 janv. 2018 17:44

MySQL Replication

Message par chour@mih-fr »

Toutes les 2 dans en intranet (ie : aucun drop de paquet possible), aucun parefeu entre les 2.
fighting_falcon
Messages : 656
Inscription : ven. 12 janv. 2018 17:44

MySQL Replication

Message par fighting_falcon »

sur chaque serveur, si tu fais un "telnet autre_serveur 3306" ça répond ?
chour@mih-fr
Messages : 732
Inscription : ven. 12 janv. 2018 17:44

MySQL Replication

Message par chour@mih-fr »

sur chaque serveur, si tu fais un "telnet autre_serveur 3306" ça répond ?
Affirmatif
fighting_falcon
Messages : 656
Inscription : ven. 12 janv. 2018 17:44

MySQL Replication

Message par fighting_falcon »

dans les journaux d'évènements Windows y'a qq chose ou bien ?
chour@mih-fr
Messages : 732
Inscription : ven. 12 janv. 2018 17:44

MySQL Replication

Message par chour@mih-fr »

Faut que je regarde, mais il me semble que je n'avais pas trouvé d'erreur les dernières fois. Je te redis ça lundi.
chour@mih-fr
Messages : 732
Inscription : ven. 12 janv. 2018 17:44

MySQL Replication

Message par chour@mih-fr »

J'ai fait un arrêt / relance du serveur MySQL Slave, et voici ce que j'ai (ordre chronologique) :
The syntax 'for replication startup options' is deprecated and will be removed in MySQL 6.0. Please use 'CHANGE MASTER' instead.

For more information, see Help and Support Center at http://www.mysql.com.
Neither --relay-log nor --relay-log-index were used; so replication may break when this MySQL server acts as a slave and has his hostname changed!! Please use '--relay-log=pars03100504-relay-bin' to avoid this problem.

For more information, see Help and Support Center at http://www.mysql.com.
Slave I/O thread: connected to master 'slave_user@10.254.133.241:3306',replication started in log 'mysql-bin.000005' at position 106

For more information, see Help and Support Center at http://www.mysql.com.
Slave SQL thread initialized, starting replication in log 'mysql-bin.000005' at position 106, relay log '.\pars03100504-relay-bin.000622' position: 251

For more information, see Help and Support Center at http://www.mysql.com.
D:\Apps\MySQL Server 5.1\bin\mysqld: ready for connections.
Version: '5.1.35-community' socket: '' port: 3306 MySQL Community Server (GPL)

For more information, see Help and Support Center at http://www.mysql.com.
---- EDIT
La log du slave :

Code : Tout sélectionner

Version: '5.1.35-community'  socket: ''  port: 3306  MySQL Community Server (GPL)
091124 10:42:24 [Note] D:\Apps\MySQL Server 5.1\bin\mysqld: Normal shutdown

091124 10:42:24 [Note] Event Scheduler: Purging the queue. 0 events
091124 10:42:24 [ERROR] Error reading packet from server: Lost connection to MySQL server during query ( server_errno=2013)
091124 10:42:24 [Note] Slave I/O thread killed while reading event
091124 10:42:24 [Note] Slave I/O thread exiting, read up to log 'mysql-bin.000005', position 106
091124 10:42:24 [Note] Error reading relay log event: slave SQL thread was killed
091124 10:42:24  InnoDB: Starting shutdown...
091124 10:42:26  InnoDB: Shutdown completed; log sequence number 0 2074015
091124 10:42:26 [Warning] Forcing shutdown of 1 plugins
091124 10:42:26 [Note] D:\Apps\MySQL Server 5.1\bin\mysqld: Shutdown complete

091124 10:42:42  InnoDB: Started; log sequence number 0 2074015
091124 10:42:42 [Warning] Neither --relay-log nor --relay-log-index were used; so replication may break when this MySQL server acts as a slave and has his hostname changed!! Please use '--relay-log=pars03100504-relay-bin' to avoid this problem.
091124 10:42:42 [Note] Slave I/O thread: connected to master 'slave_user@10.254.133.241:3306',replication started in log 'mysql-bin.000005' at position 106
091124 10:42:42 [Note] Slave SQL thread initialized, starting replication in log 'mysql-bin.000005' at position 106, relay log '.\pars03100504-relay-bin.000622' position: 251
091124 10:42:42 [Note] Event Scheduler: Loaded 0 events
091124 10:42:42 [Note] D:\Apps\MySQL Server 5.1\bin\mysqld: ready for connections.
Version: '5.1.35-community'  socket: ''  port: 3306  MySQL Community Server (GPL)



Je pense que je vais devoir refaire ma réplication.
Dans l'ordre :
1/ purger mes 2 databases sur mon slave
2/ refaire un export de mes 2 databases master et les réinjecter sur le slave
3/ reprendre les log_bin et log_pos
4/ rejouer la requete sur le slave



chour@mih-fr
Messages : 732
Inscription : ven. 12 janv. 2018 17:44

MySQL Replication

Message par chour@mih-fr »

Pinaise, je ne comprends rien ... quand je fais un show master status, je retrouve bien le bon log-bin et log-pos que ceux indiqués dans les logs du slave ...
nidosaur
Messages : 936
Inscription : ven. 12 janv. 2018 17:44

MySQL Replication

Message par nidosaur »

1./ Dump du master
mysqldump -umasterlogin -pmasterpassword --master-data --add-drop-table --databases liste des databases > dump.sql
l'option --master-data permet d'avoir la position du master au moment du dump

2./ si le slave est encours en route faire un stop slave

3./ injection du dump dans le slave
mysql -uslavelogin -pslavepassword < dump.sql

4./ slave start s'il est pas démarré


souvent quand ca marche pas c'est a cause des options du dump qui sont pas suffisantes pour une réplication
chour@mih-fr
Messages : 732
Inscription : ven. 12 janv. 2018 17:44

MySQL Replication

Message par chour@mih-fr »

Merci nidosaur !

Dans l'event viewer, le dernier message est :
Slave SQL thread initialized, starting replication in log 'mysql-bin.000006' at position 106, relay log '.\pars03100504-relay-bin.000001' position: 4

For more information, see Help and Support Center at http://www.mysql.com.
J'arrive bien à me connecter avec le user du slave sur le master :
C:\Documents and Settings\Web>mysql -uslave_user -pPassword01 -h10.254.133.241
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 79
Server version: 5.1.35-community-log MySQL Community Server (GPL)

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>
Sauf que j'ai :
error reconnecting to master 'slave_user@10.254.133.241:3306' - retry-time: 60 retries: 86400
dans mon "show slave status" :(

J'ai comme seul droit Repl_slave_priv pour mon user slave_user pour la réplication (extrait de la base mysql table user)


Bon, je vais faire un test en ajoutant un des data sur une des db du master, et voir comment cela interagit ensuite.

chour@mih-fr
Messages : 732
Inscription : ven. 12 janv. 2018 17:44

MySQL Replication

Message par chour@mih-fr »

Pas d'amélioration. J'ai rajouté un champ et il n'est pas répliqué.

Le error_connecting doit vraisemblablement venir du fait que j'ai rebooté mon serveur tout à l'heure.

Edit : Finalement ca tourne si on en croit ceci :

Code : Tout sélectionner

Slave_IO_State	Master_Host	Master_User	Master_Port	Connect_Retry	Master_Log_File	Read_Master_Log_Pos	Relay_Log_File	Relay_Log_Pos	Relay_Master_Log_File	Slave_IO_Running	Slave_SQL_Running	Replicate_Do_DB

Waiting for master to send event	10.254.133.241	slave_user	3306	60	mysql-bin.000006	106	pars03100504-relay-bin.000003	251	mysql-bin.000006	Yes	Yes	wikidb,dotclear
nidosaur
Messages : 936
Inscription : ven. 12 janv. 2018 17:44

MySQL Replication

Message par nidosaur »

tu peux montrer le resultat de
show slave status\G;
nidosaur
Messages : 936
Inscription : ven. 12 janv. 2018 17:44

MySQL Replication

Message par nidosaur »

et les conf my.cnf du master et du slave
nidosaur
Messages : 936
Inscription : ven. 12 janv. 2018 17:44

MySQL Replication

Message par nidosaur »

et au niveau des droits pour le slave tu dois avoir
nom :slave_user
hosts : 144.56.14.73
privileges SELECT, RELOAD, SUPER, REPLICATION SLAVE
grant :Non


si tes serveurs ont un accés vpn ou quelconque depuis l exterieur, je peux jeter un coup d'oeil si tu veux, meme si je suis plutot linux !
Répondre