Replication server Data-Bases MySQL

Tags: #<Tag:0x00007f9540d11cd0>

En passant,

je me suis fais un tuto « Réplication MySQL », si çà vous intéresse.

Dans cet article je fais de la réplication de bases de données MySQL Maitre à Esclave.

Bonne soirée.
Romain.

Dans la catégorie Trucs et Astuces ont n’y consigne directement les Trucs et Astuces, il faut éviter les liens vers des sites :wink:

Salut
d’accord avec clochette : mets tes commandes ici plutot que sur un site avec de la pub.
Par ailleurs tu ne mets pas beaucoup de vérification dans ton code
mais j’ai uen question :
j’ai des tables pourries - je ne comprends pas pourquoi
en particulier je ne peux pas les copier, les supprimer ( elles « n’existent pas » même si elels sont là )
est-ce que ta commance
FLUSH TABLES WITH READ LOCK; pourrait résoudre ce problème? Ou ça sert juste au cas où elel est en train d’être utilisée

tu crée un utilisateur replicator mais tu utilises root dans mysqldump

J’ai cliqué sur le lien, et je tombe direct sur une grosse pub, et sur un site clairement pas fait pour la navigation mobile.

J’ai fermé l’onglet.

IMG_0825

Merci @Clochette.

Vous êtes sympat :smiley:

@dindoun, je ne comprend pas, quelle vérification ?

FLUSH TABLES WITH READ LOCK; permet Locker les tables pour avoir une copie exacte à un moment précis ; et si des données sont ajoutées sur le maitre, entre le temps d’installer le « slave », en vérifiant la « position » du MASTER SHOW; et en demandant à l’esclave cette position, il y aura que « quelques » données à ajouter… pas toute la base.

L’utilisateur « replicator » et l’utilisateur de réplication (c’est celui qui, à chaque instant à les droits pour récupérer les données du serveur Mysql maitre). Le backup avec « mysqldump » ne s’execute qu’une fois lors de la mise en place du serveur Mysql esclave.

@AnatomicJC tu peut zoomer pour adapter à ton écran de smartphone et/ou faire un gros plan sur quelquechose :wink:

Bonne journée.

Sauf si le lien renvoi sur un article clair ou une page de référence sur un site approprié. Les sites personnels de passionnés appartiennent souvent à cette catégorie mais attention à ne pas prendre n’importe quel hébergement gratuit ou fournit par son FAI au risque d’avoir de la pub.

De façon générale, à l’heure ou Google renvoie de moins en moins de liens pertinents, j’ai personnellement apprécié ce lien et le contenu du site de @ZW3B. Certes, il y aurait beaucoup de choses à dire ne serait-ce que pour en améliorer la présentation qui semble venir du millénaire précédent. Ceci dit avec un beau modèle de page (template), cela nécessite de travailler davantage le contenu au risque de créer un contraste fort entre mise en forme et contenu.

Avant toute chose, il manque une adresse de courrier électronique de contact sur le site de @ZW3B. Sauf erreur de ma part je n’en ai pas vu. Sans cela, difficile d’échanger et de bénéficier de relectures indispensables même aux plus littéraires. J’aime beaucoup la fonctionnalité de Wordpress permettant d’affecter des relecteurs avant publication d’articles.

C’est gentil, merci.

Pour les liens sur ZW3B vous pouvez « cliquer droit, ouvrir dans une nouvelle fenêtre » pour ouvrir les sites externes directement, des sources des articles de sciences etc.

J’aimerai bien avoir un ADS.TXT comme les sites web normaux, style LeMonde, Elle, Science & Vie, Trust My Science ; et les chaines Youtube etc. (seules au monde, qui partagent et partagent du temps et ne gagne pas « un sou ») avec tous mes « potes » qui me donnent de bonnes ondes musicales, de l’intellect et qui partagent, participent à ma Vie :wink: Et, surtout que je partage sur mes sites ; ils pourraient avoir un pourcentage de ce que je « pourrais » prendre grâce aux régies publicitaire. C’est fait pour ! Y’a vraiment des « trucs » que je ne comprends dans ce monde !

C’est le portail du 21iècle siècle ZW3B :-: « The Web XXI » XXI en chiffre Romain, le titre du site quand même :wink: :joy:
J’aime mon, mes templates - C’est vrai qu’il faut que je refasse le template « rubriques » de ZW3B :-: The Web TV que je n’aime pas/plus - çà fait quelques mois que je me dis çà, qu’il faudrait le refaire :wink:

Je vais mettre toute les documentations sur LAB3W ; un jour :wink:

Dans les rubriques des sites, on peut classer « les news, les docs, les liens, les vidéos » - y’a un petit icone qui les identifient sans changer d’onglets :wink:

Y’a mes coordonnées partout, mon phone et les pages « À propos »

Le mieux c’est LinkedIn si tu veut m’écrire des messages privés, sympathiser et mieux me connaître - sinon FB :wink:

Capture d'écran 2025-01-21 183316

et les auteurs des « pages, des rubriques et des sites (pour les homepages) ».

Capture d'écran 2025-01-21 145843

Avec toutes mes pages « sociales » pour mon utilisateur personnel. Et, en passant les 2 autres utilisateurs ZW3B et LAB3W c’est aussi moi qui écrit au « nom » des entités :wink: J’ai même un user « Kss » pour parler de counter-strike, de jeux vidéos, mais çà c’était avant. J’ai « désactivé » tous les membres (et « désactivé » la récupération de mot de passe (à cause de gmail, qui n’accepte pas mes mails, ils me foutent la haine (çà a marché 6 mois (entre juin 2023 et début janvier 2024) et du jour au lendemain çà ne rentrait plus)). Pourtant j’suis à 100% de bonne conformité sur mes noms de domaine mails et cela même sur/depuis mon serveur Web - celui- qui envoie avec PHP depuis les sites.

cà me cause beaucoup de tort, imagine tu dis à un mec : « donne ton mail, je t’envoie un mail » ; il écrit son mail avec ton téléphone, tu clic envoyer et le gars en face il ne reçoit jamais le mails. du genre « grosse honte », surtout pour moi, qui travaille dans le web et qui pourrait dire, tu veut un hébergement gratos, çà marche, tu met ton site chez moi au lieux de payer un hébergement pour rien - enfin des petites choses comme çà. Ils foutent la haine ! Encore j’aurais un serveur mail tout pourri je comprendrais, mais là, ils abusent grave ! Ils n’aiment pas mon nom « ZW3B » qui me disent dans leur admin postmaster dot google dot com.

Je viens d’acheter youpredator (dot) com et youterminator (dot) com :joy: On va voir s’ils n’aiment pas ce nom aussi !

Oui, c’est vrai j’ai désactivé les commentaires sur les contenus (je souhaitais échanger sur des forums, pour faire participer plus de monde) et parler directement sur des forums spécialisés (français et dans d’autres langues), où se trouve des spécialistes « sur des trucs » que je met en place, en envoyant mes liens sur mes « docs », en les modifiant d’une année à l’autre selon les évolutions.

Je ne connais pas, j’suis seul c’est pour çà, sûrement. Je trouve çà super cooL !

En tout cas merci beaucoup, pour ces informations précieuses, j’en prend note.

Romain.

Sinon, il faut vraiment (avant çà - refaire certains templates), que j’active le HTTP/2 - il serait temps, parce que j’ai plein d’erreurs HTTP 502 depuis que j’ai 4 frontaux à la place d’1, parce que les connexions HTTP/1.1 qui n’ouvrent que 6 connexions les unes après les autres pour charger tous mes CSS/JS, images etc… et que les requêtes clientes arrivent de plusieurs frontaux à la fois çà bug.

:smiley:

Il fallait fermer, descendre la pub sur la petite flèche, pas fermer l’onglet :yum: :relaxed:

Merci encore !

@Clochette c’est autorisé de partager des liens, me semble t’il dans les forums, surtout si y’a plein de liens partout et que çà ouvre pleins de sites, ZW3B n’est pas un site de c*L.


Et, pour infos, je cherche un hébergeur pour louer un serveur dédié, un autre, même chez OVH mais quelqu’un qui me chouchouterait ; qui voudrait bien s’occuper de moi, me configurer une « bonne » machine et me mettre dans une « belle » baie, sur une « bonne » bande, qui se bagarrerait en son "entité avec des puissants, pour moi, moi tout seul, comme çà on sera deux et plus :wink:

J’espère ne pas trop l’embêter :wink:

J’aimerai bien être aux « Etas-Unis ou Maroc, Tunisie », ou sur Sophia-Antipolis, Antibes, Valbonne, Monaco y’a qui ??


Je vous partage celle-ci (lien FB) pour La Force des 20 prochaines années !

Non et ce depuis plus de 10 Ans, on ne poste pas de lien foireux ou pas dans la rubrique Trucs et Astuces, on rédige dans un français correct avec image ou lien à l’appui ces petites astuces ou documentation.

ou lignes de code lisible et assez compréhensible, ding dong !

Trucs simple et astuces (c’est sérieux tout çà ?) de Seigneur.e.sss :wink:

Heureusement qu’il y a Debian-Fr.org et d’autres forums LaFibre.info, WebRankInfo etc… pour n’en citer que 2, pour pas trop faire de social et discuter sérieusement ; pour mieux se connaître :wink: Et, surtout partager pleins de liens qui nous apprennent pleins de choses ! Et tout nos moments de galère et de joie !

@+ prenez soin de vous et prenons soin les uns des autres :star_struck:

:joy:

Merci :heart_eyes: :crazy_face:


Au fait ? Le mot de passe SQL de l’utilisateur de « réplication », transite-t’il en clair sur le réseau, ou pas ? #tcpdump #wiresharp, tu travailles pour quel ISP, au pire ?

Avez-vous activer, SSL de youSQL ? Le hacking vient de l’interne, du réseau interne, ou fais-tu de la réplication sur des adresses « internet » publique, GUA (Global Unicast Address), carrément ?

As-tu un certificats SSL/TLS perso interne avec une cryptographie résistante aux attaques quantique entre tes services que tu protèges plus que tout, tes données personnelles (ou celles des autres) ?

Je crois que même les IA sont branchées en USB et qu’elle nous écoutent … peut-être qu’il y a de la musique où elles se trouvent, et qu’elles entendent tout. Il faut arrêter de faire les cons, nous les Humains !

Tu crois qu’il te répondrait qu’en tu poses un question, ou carrément, qu’il lirait tes pensés ou analyserai ton comportement ou tes mimiques. Douleurs ou joie !?

On en est là.

#VisionIA :wink:

Tu crois le mec, le commercial il se vend, ou est-ce qu’il flippe… t’as vu sa taille ?

Tu crois il est intelligent le robot IA je ne sais plus quoi, crois-tu qu’il apprend vite, j’espère qu’il ne fait pas trop d’erreur et toi Humain ?

La cellule d’investigations visuelles du « Monde » vous raconte ses méthodes de travail #OSINT (Open Source Intelligence)
https://www.youtube.com/watch?v=jzLmZ3LnnRo&origin=https://www.debian-fr.org - imaginez une IA faire ce travail :wink:

J’ai bien dans mon catalogue « Eagle Eye » | « L’Œil du mal (VF) » 2008 pour pas « trop d’erreurs » mais impossible de le lire ici.

En tout cas faut faire gaffe !

@+

Romain

Oui je comprends pour la rubrique « Trucs et Astuces ».

J’ai mis en gras car ce n’est jamais de trop; c’est ce qui rentre dans le cadre d’un article clair. De la à parler de lien « foireux », ce n’est pas respectueux ne serait-ce que par la quantité de travail fourni sur le site en lien. Visiblement ce site a plus besoin d’aide qu’autre chose.

C’est pas très SWAN c’est strong ; pas d’article strongSwan pas très clair :confused:

Kiss, je vous aime !

@+

Ps : @vbreton par exemple, c’est simple, si tu cherches mon mail, il est par tout en bas dans « Client 1 », faut suivre :wink:

:blush:

Comme tout site qui se respecte, ça demande d’être facilement et rapidement accessible quitte à créer une adresse email rien que pour cela.

1 J'aime

Et bien çà tombe bien, il est la aussi : https://www.zw3b.fr/lab3w-website-www.zw3b.fr.json accessible depuis cette balise HTML :

Note Moi-même à 20h34 : En fait, il n’y a même pas mon mail et y’a mes pages « pro ».

<script type="application/ld+json" src="https://www.zw3b.fr/lab3w-website-www.zw3b.fr.json"></script>

Balise pour l’auteur d’un site seulement, pas d’un article, peut-être que.

Et il y les mails « groupés », dans les pages « partenaires » entre autre si vous souhaitez me, nous contacter, dirais-je habituellement

C’est ce que je dis, il n’est pas clairement visible ou accessible ! Ceci dit il y a une rubrique contact qui fait parfaitement l’affaire avec son formulaire.

Je ne connais plus trop de sites web où l’on peut contacter directement par mail un journaliste ou un blogueur.

Pour la doc « Réplication MySQL » (vs JSON).

Mon mail est dans les JSON des contenus des sites Web @ZW3B @vbreton :wink:

La liste des docs en JSON : https://www.zw3b.fr/api/contents/docs/lst

Mon « semblant » d’ZW3B.API, par exemple pour afficher les contenus sur votre site :

<?php

include '/your_directory/var/lib/php/zw3bApiClient.class.php';
    
//-------------------------------------------------------------------------
// CLIENT API CALL
    
$config = array();
    
//-----------------------
// BETA-TESTERS (Wilcard Origins)
    
// Minimun config
$config['api_name'] = 'BETA-TESTERS';
$config['client_project']['name'] = 'ZW3B-API-BETA-TESTERS';

// API AUTHENTIFIED

// Default config
#$config['api_name'] = 'MY_API_NAME';
#$config['api_key'] = 'MY_API_KEY';
#$config['client_id'] = 'MY_CLIENT_ID';
#$config['client_secret'] = 'MY_CLIENT_SECRET';
#$config['client_project']['name'] = 'MY_CLIENT_PROJECT_NAME';
#$config['client_project']['origin'] = array('1.2.3.4', '2.3.4.5'); // exemple origin address IP of your server Web
#$config['client_project']['redirection_url'] = array('https://www.mywebsite.com/page.php'); // exemple URL of your server Web

//-----------------------
    
$zw3bApiClient = new zw3bApiClient();
    
$my_client = $zw3bApiClient->ClientModUsr($config);
      
// CLIENT API CALL
//-------------------------------------------------------------------------

//-------------------------------------------------------------------------
// REQUEST CONTENTS / DOCS / LST

$contents = new zw3bApiClientModContents($my_client);

$docs = $contents->docs('lst', array(
    'offset' => 0,
    'limit' => 30,
    'l' => 'EN'
    )
);
    
// REQUEST CONTENTS / DOCS / LST
//-------------------------------------------------------------------------
    
echo '<pre>'.print_r(json_decode($docs),1).'</pre>';
    
//-------------------------------------------------------------------------
// REQUEST CONTENTS / DOCS / GET / (cid)
    
$contents = new zw3bApiClientModContents($my_client);
    
$doc = $contents->docs('get', array(
    'cid' => 3480,
    'l' => 'FR'
    )
);
    
// REQUEST CONTENTS / DOCS /  GET / (cid)
//-------------------------------------------------------------------------
    
echo '<pre>'.print_r(json_decode($doc),1).'</pre>';

?> 

Example of rendering docs contents (PHPSource) → le PHPSource se télécharge tout seul, à la place d’afficher le code dans le navigateur - çà doit être php-fpm que j’ai activé pour HTTP/2.

:wink:


J’ai trouvé çà pour afficher un PHP Source avec PHP-FPM dans NGINX, çà me paraît surprenant et complètement fou.

Moi, qui faisait un petit lien symbolique :

 root@lb1.ww1:/home/directory/web/site/ # $ ln -s file.php file.phps

Regarde mon fichier https://mywebsite.tld/file.phps si tu veut la voir la source PHP :wink:

Pour ressortir des scripts PHP « à partager » rapidement, c’était simple !

C’est vraiment fou.


Suite dans cet article sur Http/1, http/2, http/3 - #7 by ZW3B


1 J'aime

Salut,

sinon pour updating data from slaves to master in mysql

C’est comme çà, au cas où t’as éteint ton serveur « slave » MySQL :wink:

:sweat_smile:

Bonsoir à tous.
Romain.

Salut,

Suite à cet article :

Je me suis fais un petit script pour mes bases de données ; au cas où le serveur MySQL Slave ne serait pas à jour.

C’est en 2 scripts ; un côté serveur « maître » et l’autre côté serveur « esclave ».

Le script global se lance depuis le « mySQL Slave » :

Sur le serveur Maître MySQL, j’ai ce script qui « Dump Databases MySQL » ; que j’appelle depuis le serveur Slave MySQL.

root@maitre.db1:~ # touch /root/db_dump_and_restore_of_slave.sh
root@maitre.db1:~ # chmod 500 /root/db_dump_and_restore_of_slave.sh
!/bin/bash
# -------------------------------
# Script : ./db_dump_and_restore_of_slave.sh
# Date Created : 20250130
# Author : O.Romain.Jaillet-ramey (orj at lab3w dot fr)
# Description : Dump Databases MySQL
# ----
# Exemple : /root/.my.cnf
# --
# [mysql]
# user = root
# password = MY_ROOT_SUPER_MOT_PASSE_SUPER_LONG
#
# [mysqldump]
# user = root
# password = MY_ROOT_SUPER_MOT_PASSE_SUPER_LONG
# -------------

date=$(date +%Y%m%d)
#hour=$(date +%H'h'%M'm'%S's')
hour=$(date +%H'h'%M'm')

time="${date}-${hour}"

if [ $1 ]; then
        time=$1
fi

echo "# ---------"
echo "# Script Server MySQL : START"
echo "# Date : $(date +%Y%m%d'-'%H'h'%M'm'%S's')"
echo ""

echo "+- MASTER -> Create backup directory : /var/backups/mysql/${time}/"

mkdir /var/backups/mysql/${time}
cd /var/backups/mysql/${time}

echo "+- MASTER -> MySQL Dump Databases"
echo "  \\"
for database in $(mysql -Bs -e "show databases"|grep -v "^performance_schema$"|grep -v "^information_schema$")
do

        echo "   +- DB : ${database}"

        mysqldump -u root --default-character-set=utf8mb4 --skip-opt \
                --force --routines --add-drop-table --create-options --disable-keys \
                --extended-insert --quick --set-charset $database \
                --events --skip-lock-tables | nice pbzip2 > $database.sql.bz2

done

echo ""
echo "# Date : $(date +%Y%m%d'-'%H'h'%M'm'%S's')"
echo "# Script Server MySQL : END"
echo "# ---------"

Exemple Backup :wink: :

root@maitre.db1:~ # sh /root/db_dump_and_restore_of_slave.sh
# ---------
# Script Server MySQL : START
# Date : 20250130-04h59m21s

+- MASTER -> Create backup directory : /var/backups/mysql/20250130-04h59m/
+- MASTER -> MySQL Dump Databases
  \
   +- DB : my_base
   +- DB : mysql
   +- DB : phpmyadmin
   +- DB : zw3b_v7_1_2

# Date : 20250130-04h59m30s
# Script Server MySQL : END
# ---------

Sur le serveur Slave MySQL, j’ai ce script qui « Updating Databases on MySQL Slave ».

root@slave.db2:~ # touch /root/db_check_master_and_update_slave.sh
root@slave.db2:~ # chmod 700 /root/db_check_master_and_update_slave.sh
#!/bin/bash
# -------------------------------
# Script : ./db_check_master_and_update_slave.sh
# Date Created : 20250130
# Author : O.Romain.Jaillet-ramey (orj at lab3w dot fr)
# Description : Updating Databases on MySQL Slave. 
# Check file and position master / slave and updating databases on Slave
# TODO : Auth / authorized_keys -> https://howto.zw3b.fr/linux/reseaux/ssh-scp-par-certificats
# Arriver à mettre à jour qu'une "seule" base et/ou qu'une "seule" table - Last_SQL_Error
# ----
# Exemple : /root/.my.cnf
# --
# [mysql]
# user = root
# password = MY_ROOT_SUPER_MOT_PASSE_SUPER_LONG
#
# [mysqldump]
# user = root
# password = MY_ROOT_SUPER_MOT_PASSE_SUPER_LONG
# -------------

date=$(date +%Y%m%d)

master_ipv6="fc00:5300:60:9389:15:1:a:db1"
master_user="replicator"
master_password="SUPER_MOT_PASSE_SUPER_LONG_QUE_PERSONNE_NE_PEUT_RETENIR_DE_MEMOIRE"

echo "# ---------"
echo "# Date : $(date +%Y%m%d'-'%H'h'%M'm'%S's')"
echo "# --"
echo ""

# ---------
# check master
master_infos=$(mysql -u root -h ${master_ipv6}  -e "SHOW MASTER STATUS\G" | grep "File:\|Position:" | awk '{print $2}')

{ read var1; read var2; } <<< "$master_infos"

master_file="${var1}"
master_position="${var2}"

echo "+- MASTER File -> "${master_file}
echo "+- MASTER Position -> "${master_position}

echo "|"

# --------
# check slave
slave_infos=$(mysql -u root -e "SHOW SLAVE STATUS\G" | grep "Master_Log_File:\|Read_Master_Log_Pos:" | awk '{print $2}')

{ read var1; read var2; } <<< "$slave_infos"

slave_file="${var1}"
slave_position="${var2}"

echo "+- SLAVE File --> "${slave_file}
echo "+- SLAVE Position --> "${slave_position}

echo "|"

if [ "${master_file}" != "${slave_file}" ] || [ "${master_position}" != "${slave_position}" ]
then
        echo "+- SLAVE Error -> File or Position"

        echo "|"
        echo "+- SLAVE -> STOP SLAVE;"
        slave_goto_for_replication_command_stop=$(mysql -u root -e "STOP SLAVE;")
        echo "+- SLAVE -> CHANGE SLAVE....."
        slave_goto_for_replication_command_change=$(mysql -u root -e "CHANGE MASTER TO MASTER_HOST='${master_ipv6}', MASTER_USER='${master_user}', MASTER_PASSWORD='${master_password}', MASTER_LOG_FILE='${master_file}', MASTER_LOG_POS=${master_position};")
        echo "+- SLAVE -> START SLAVE;"
        slave_goto_for_replication_command_start=$(mysql -u root -e "START SLAVE;")

        exit

fi

# -------------
# ERRORS
# ----
# https://dev.mysql.com/doc/mysql-errors/5.7/en/server-error-reference.html#error_er_key_not_found
# https://learn.microsoft.com/en-us/sql/relational-databases/errors-events/database-engine-events-and-errors-18000-to-18999?view=sql-server-ver16

slave_error=$(mysql -u root -e "SHOW SLAVE STATUS\G" | grep "Last_SQL_Error:" )

{ read var1; } <<< "$slave_error"

slave_error_text="${var1}"

slave_errors=$(mysql -u root -e "SHOW SLAVE STATUS\G" | grep "Last_SQL_Error:" | awk -F":|;|," -vOFS='\n' '{print $1, $2, $3, $4, $5, $6, $7, $8, $9}')

# ----
# exemple d'erreur :
#
# 1.
# +- SLAVE Error -> Last_SQL_Error: Could not execute Update_rows_v1 event on table zw3b_v7_1_2.zw_contents; Can't find record in 'zw_contents', Error_code: 1032; handler error HA_ERR_KEY_NOT_FOUND; the event's master log mysql-bin.000028, end_log_pos 5495590
#   \
#    + SLAVE Error 1 -> Text 1 -> Last_SQL_Error
#    + SLAVE Error 1 -> Text 2 -> Could not execute Update_rows_v1 event on table zw3b_v7_1_2.zw_contents
#    + SLAVE Error 1 -> Text 3 -> Can't find record in 'zw_contents'
#    + SLAVE Error 1 -> Text 4 -> Error_code
#    + SLAVE Error 1 -> Text 5 -> 1032
#    + SLAVE Error 1 -> Text 6 -> handler error HA_ERR_KEY_NOT_FOUND
#    + SLAVE Error 1 -> Text 7 -> the event's master log mysql-bin.000028
#    + SLAVE Error 1 -> Text 8 -> end_log_pos 5495590

# 2.
# +- SLAVE Error -> Last_SQL_Error: Could not execute Delete_rows_v1 event on table zw3b_v7_1_2.zw_contents_news; Can't find record in 'zw_contents_news', Error_code: 1032; handler error HA_ERR_KEY_NOT_FOUND; the event's master log mysql-bin.000028, end_log_pos 5498697
#   \
#    + SLAVE Error 1 -> Text 1 -> Last_SQL_Error
#    + SLAVE Error 1 -> Text 2 -> Could not execute Delete_rows_v1 event on table zw3b_v7_1_2.zw_contents_news
#    + SLAVE Error 1 -> Text 3 -> Can't find record in 'zw_contents_news'
#    + SLAVE Error 1 -> Text 4 -> Error_code
#    + SLAVE Error 1 -> Text 5 -> 1032
#    + SLAVE Error 1 -> Text 6 -> handler error HA_ERR_KEY_NOT_FOUND
#    + SLAVE Error 1 -> Text 7 -> the event's master log mysql-bin.000028
#    + SLAVE Error 1 -> Text 8 -> end_log_pos 5498697

# 3.
# +- SLAVE Error -> Last_SQL_Error: Error 'Duplicate entry '397' for key 'PRIMARY'' on query. Default database: 'zw3b_v7_1_2'. Query: 'INSERT INTO zw_contents_news (content_uri, content_title, content_desc, content_text) VALUES ("salut", "salut", "", "")'
#   \
#    + SLAVE Error 1 -> Text 1 -> Last_SQL_Error
#    + SLAVE Error 1 -> Text 2 -> Error 'Duplicate entry '397' for key 'PRIMARY'' on query. Default database
#    + SLAVE Error 1 -> Text 3 -> 'zw3b_v7_1_2'. Query
#    + SLAVE Error 1 -> Text 4 -> 'INSERT INTO zw_contents_news (content_uri
#    + SLAVE Error 1 -> Text 5 -> content_title
#    + SLAVE Error 1 -> Text 6 -> content_desc
#    + SLAVE Error 1 -> Text 7 -> content_text) VALUES ("salut"
#    + SLAVE Error 1 -> Text 8 -> "salut"
# ----

#{ read -a vars; } <<< "$slave_errors"

#echo ${vars[*]}

#for (( i=0; i<${#vars[@]}; i++ )); do
#    echo "n° $i : ${vars[$i]}"
#done

# ----
# ERRORS
#------------

{ read var1; read var2; read var3; read var4; read var5; read var6; read var7; read var8;} <<< "$slave_errors"

if [ "${slave_error_text}" = "" ] & [ "${var2}" = "" ]
then

        echo "+- SLAVE Error ------------------------> Nothing !!"
        echo " \\"
        echo "  +--> exit"
        echo ""

        exit

else
        echo "+- SLAVE Error -> "${slave_error_text}

        echo "  \\"
        echo "   + SLAVE Error 1 -> Text 1 -> "${var1}
        echo "   + SLAVE Error 1 -> Text 2 -> "${var2}
        echo "   + SLAVE Error 1 -> Text 3 -> "${var3}
        echo "   + SLAVE Error 1 -> Text 4 -> "${var4}
        echo "   + SLAVE Error 1 -> Text 5 -> "${var5}
        echo "   + SLAVE Error 1 -> Text 6 -> "${var6}
        echo "   + SLAVE Error 1 -> Text 7 -> "${var7}
        echo "   + SLAVE Error 1 -> Text 8 -> "${var8}
        echo "|"
fi

# ------------------------------------------------
# RSYNC ALL DATABASES

hour=$(date +%H'h'%M'm'%S's')
hour=$(date +%H'h'%M'm')

time=${date}-${hour}

# Le script sur le serveur MySQL
command="sh /root/db_dump_and_restore_of_slave.sh ${time};"

echo "|"
ssh -6 root@${master_ipv6} "${command}"

echo "+- SLAVE -> Create backup directory : /var/backups/mysql/${time}"
mkdir /var/backups/mysql/${time}

echo "+- SLAVE -> Rsync Backup Master Databases to Slave Backup directory"
echo "|"

rsync -av -e "ssh -6" [${master_ipv6}]:/var/backups/mysql/${time} /var/backups/mysql/
echo "|"

cd /var/backups/mysql/${time}

echo "+- SLAVE -> Move /var/backups/mysql/${time}/mysql.sql.bz2 -> /var/backups/mysql/"
mv mysql.sql.bz2 /var/backups/mysql/

echo "+- SLAVE -> Insert Databases"

#pkill mariadb
#mysqld --skip-grant &
#for i in * ; do mysql -e "CREATE DATABASE $(echo $i | cut -f1 -d".")" ; done;
for i in * ; do bzcat $i|mysql -f $(echo $i | cut -f1 -d".") ; done;
#pkill mysqld
#/etc/init.d/mariadb start

echo "|"

echo "+- SLAVE -> STOP SLAVE;"
slave_goto_for_replication_command_stop=$(mysql -u root -e "STOP SLAVE;")

echo "+- SLAVE -> CHANGE MASTER TO MASTER_LOG_FILE='${master_file}', MASTER_LOG_POS=${master_position};"
slave_goto_for_replication_command_change=$(mysql -u root -e "CHANGE MASTER TO MASTER_HOST='${master_ipv6}', MASTER_USER='${master_user}', MASTER_PASSWORD='${master_password}', MASTER_LOG_FILE='${master_file}', MASTER_LOG_POS=${master_position};")

echo "+- SLAVE -> START SLAVE;"
slave_goto_for_replication_command_start=$(mysql -u root -e "START SLAVE;")

echo ""
echo "# --"
echo "# Date : $(date +%Y%m%d'-'%H'h'%M'm'%S's')"
echo "# ---------"

Exemple OK - Ne fait rien :

root@slave.db2:~ # /root/db_check_master_and_update_slave.sh
# ---------
# Date : 20250130-04h58m51s
# --

+- MASTER File -> mysql-bin.000028
+- MASTER Position -> 5546601
|
+- SLAVE File --> mysql-bin.000028
+- SLAVE Position --> 5546601
|
+- SLAVE Error ------------------------> Nothing !!
 \
  +--> exit

Exemple KO → updating Slave MySQL Server:

root@slave.db2:~ # ./db_check_master_and_update_slave.sh
# ---------
# Date : 20250130-02h58m44s
# --

+- MASTER File -> mysql-bin.000028
+- MASTER Position -> 5506782
|
+- SLAVE File --> mysql-bin.000028
+- SLAVE Position --> 5506782
|
+- SLAVE Error -> Last_SQL_Error: Error 'Duplicate entry '397' for key 'PRIMARY'' on query. Default database: 'zw3b_v7_1_2'. Query: 'INSERT INTO zw_contents_news (content_uri, content_title, content_desc, content_text) VALUES ("salut", "salut", "", "")'
  \
   + SLAVE Error 1 -> Text 1 -> Last_SQL_Error
   + SLAVE Error 1 -> Text 2 -> Error 'Duplicate entry '397' for key 'PRIMARY'' on query. Default database
   + SLAVE Error 1 -> Text 3 -> 'zw3b_v7_1_2'. Query
   + SLAVE Error 1 -> Text 4 -> 'INSERT INTO zw_contents_news (content_uri
   + SLAVE Error 1 -> Text 5 -> content_title
   + SLAVE Error 1 -> Text 6 -> content_desc
   + SLAVE Error 1 -> Text 7 -> content_text) VALUES ("salut"
   + SLAVE Error 1 -> Text 8 -> "salut"
|
|
root@fc00:5300:60:9389:15:1:a:db1's password:
# ---------
# Script Server MySQL : START
# Date : 20250130-02h58m52s

+- MASTER -> Create backup directory : /var/backups/mysql/20250130-02h58m/
+- MASTER -> MySQL Dump Databases
  \
   +- DB : my_base
   +- DB : mysql
   +- DB : phpmyadmin
   +- DB : zw3b_v7_1_2

# Date : 20250130-02h59m01s
# Script Server MySQL : END
# ---------
+- SLAVE -> Create backup directory : /var/backups/mysql/20250130-02h58m/
+- SLAVE -> Rsync Backup Master Databases to Slave Backup directory
|
root@fc00:5300:60:9389:15:1:a:db1's password:
receiving incremental file list
20250130-02h58m/my_base.sql.bz2
20250130-02h58m/mysql.sql.bz2
20250130-02h58m/phpmyadmin.sql.bz2
20250130-02h58m/zw3b_v7_1_2.sql.bz2

sent 519 bytes  received 16.406.797 bytes  1.215.356,74 bytes/sec
total size is 16.400.863  speedup is 1,00
|
+- SLAVE -> Move /var/backups/mysql/20250130-02h58m/mysql.sql.bz2 -> /var/backups/mysql/
+- SLAVE -> Insert Databases
|
+- SLAVE -> STOP SLAVE;
+- SLAVE -> CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000028', MASTER_LOG_POS=5506782;
+- SLAVE -> START SLAVE;

# --
# Date : 20250130-03h04m53s
# ---------

Par contre, c’est pas encore ce que j’aimerais (au final).

Pour l’instant le script « recopie » et « colle » toutes les bases de données, c’est long et pas très bon.

J’aimerais pouvoir « trouver », la base et la table qui a un problème et ne mettre à jour que celle-ci.

Sinon, le script me dépanne bien.

Mon serveur MySQL Slave est chez moi et j’ai des coupures d’électricité (par exemple) ; çà me permet de re-mettre à jour mes bases de données du « serveur At home » facilement.

Romain.

Bonne journée.

Salut,

J’ai trouvé ce lien qui concerne les « Errors MySQL Linux » :

Et pour WIndows « Events and errors » :


Donc, si quelqu’un à un super « ereg », « awk », etc. pour parser ce genre de lignes, je suis preneur.

Last_SQL_Error:

J’ai essayé de parser « rapidement », comme délimiteur les « . », le « , » et les « ; » par exemple.

slave_errors=$(mysql -u root -e "SHOW SLAVE STATUS\G" | grep "Last_SQL_Error:" | awk -F":|;|," -vOFS='\n' '{print $1, $2, $3, $4, $5, $6, $7, $8, $9}')

{ read var1; read var2; read var3; read var4; read var5; read var6; read var7; read var8;} <<< "$slave_errors"

ou de cette manière :

slave_error=$(mysql -u root -e "SHOW SLAVE STATUS\G" | grep "Last_SQL_Error:"

{ read var1; } <<< "$slave_error"

echo ${var1}

{ read -a vars; } <<< "$slave_error"

echo ${vars[*]}

for (( i=0; i<${#vars[@]}; i++ )); do
    echo "n° $i : ${vars[$i]}"
done

Mais, j’ai dû mal. Je souhaiterais « récupérer » le nom de la « base de données » et/ou de la « table ».

Si quelqu’un peut m’aider.
Çà ne presse pas, juste pour peaufiner le fil de cette discussion et de trouver/fabriquer la meilleure solution :wink:


Je suis tombé sur ce type d’erreurs :

# ----
# exemple d'erreur :
#
# 1.
# +- SLAVE Error -> Last_SQL_Error: Could not execute Update_rows_v1 event on table zw3b_v7_1_2.zw_contents; Can't find record in 'zw_contents', Error_code: 1032; handler error HA_ERR_KEY_NOT_FOUND; the event's master log mysql-bin.000028, end_log_pos 5495590
#   \
#    + SLAVE Error 1 -> Text 1 -> Last_SQL_Error
#    + SLAVE Error 1 -> Text 2 -> Could not execute Update_rows_v1 event on table zw3b_v7_1_2.zw_contents
#    + SLAVE Error 1 -> Text 3 -> Can't find record in 'zw_contents'
#    + SLAVE Error 1 -> Text 4 -> Error_code
#    + SLAVE Error 1 -> Text 5 -> 1032
#    + SLAVE Error 1 -> Text 6 -> handler error HA_ERR_KEY_NOT_FOUND
#    + SLAVE Error 1 -> Text 7 -> the event's master log mysql-bin.000028
#    + SLAVE Error 1 -> Text 8 -> end_log_pos 5495590
# 2.
# +- SLAVE Error -> Last_SQL_Error: Could not execute Delete_rows_v1 event on table zw3b_v7_1_2.zw_contents_news; Can't find record in 'zw_contents_news', Error_code: 1032; handler error HA_ERR_KEY_NOT_FOUND; the event's master log mysql-bin.000028, end_log_pos 5498697
#   \
#    + SLAVE Error 1 -> Text 1 -> Last_SQL_Error
#    + SLAVE Error 1 -> Text 2 -> Could not execute Delete_rows_v1 event on table zw3b_v7_1_2.zw_contents_news
#    + SLAVE Error 1 -> Text 3 -> Can't find record in 'zw_contents_news'
#    + SLAVE Error 1 -> Text 4 -> Error_code
#    + SLAVE Error 1 -> Text 5 -> 1032
#    + SLAVE Error 1 -> Text 6 -> handler error HA_ERR_KEY_NOT_FOUND
#    + SLAVE Error 1 -> Text 7 -> the event's master log mysql-bin.000028
#    + SLAVE Error 1 -> Text 8 -> end_log_pos 5498697
# 3.
# +- SLAVE Error -> Last_SQL_Error: Error 'Duplicate entry '397' for key 'PRIMARY'' on query. Default database: 'zw3b_v7_1_2'. Query: 'INSERT INTO zw_contents_news (content_uri, content_title, content_desc, content_text) VALUES ("salut", "salut", "", "")'
#   \
#    + SLAVE Error 1 -> Text 1 -> Last_SQL_Error
#    + SLAVE Error 1 -> Text 2 -> Error 'Duplicate entry '397' for key 'PRIMARY'' on query. Default database
#    + SLAVE Error 1 -> Text 3 -> 'zw3b_v7_1_2'. Query
#    + SLAVE Error 1 -> Text 4 -> 'INSERT INTO zw_contents_news (content_uri
#    + SLAVE Error 1 -> Text 5 -> content_title
#    + SLAVE Error 1 -> Text 6 -> content_desc
#    + SLAVE Error 1 -> Text 7 -> content_text) VALUES ("salut"
#    + SLAVE Error 1 -> Text 8 -> "salut"
# ----

:wink:

Merci.


Note de Moi-même 2025/01/30 à 18h37 (je note çà sinon je vais oublier) :

  • Dans les 2 premières erreurs pour « Update_rows_v1 » et « Delete_rows_v1 » ;
    il y a par exemple : " event on table zw3b_v7_1_2.zw_contents;"

  • Dans la 3 ème erreur style « Duplicate entry » y’a "database: 'zw3b_v7_1_2'" et la table plus loin.

Pour arriver à avoir ces erreurs, j’ai stoppé le « serveur MySQL slave » quelques secondes, le temps d’ajouter une « news » depuis mon « web admin » (en prod) ; puis j’ai rallumé le « serveur MySQL slave » à la maison et j’ai vérifié. Pareil en « updatant » et en « supprimant ».

La « position » était bonne, mais quelques secondes après sur la commande « show Slave Status », je voyais ces erreurs. Et, « la donné » n’y était pas sur « le serveur MySQL slave ».

J’ai pu vérifié depuis un « ww3 » qui accède au MySQL de chez moi. Et, avec un « SELECT » sur la base locale (du slave chez moi) surtout :wink:
.