In dit artikel vind je enkele foutmeldingen die je tegen kunt komen (hopelijk niet natuurlijk) bij het gebruik van een MariaDB master-slave-setup en de oplossingen die je ervoor kunt gebruiken. De foutmeldingen die behandeld worden zijn:
- Got fatal error 1236 from master when reading data from binary log: 'Error: connecting slave requested to start from GTID X-X-X, which is not in the master's binlog'.
- Error 'Can't create database 'databasename'; database exists' on query.
- Error 'Can't drop database 'databasename'; database doesn't exist' on query.
Dit artikel is met MariaDB 10.0+ in gedachte geschreven.
Wanneer je deze melding ziet probeert je slave waarschijnlijk te starten vanaf een andere GTID dan waar je master zich momenteel in bevindt. Er zijn gelukkig diverse oplossingen voor.
Stap 1
Controleer eerst het GTID van je master door op je master-VPS het volgende commando uit te voeren vanuit een SQL-Shell (mysql -u root -p):
SHOW MASTER STATUS;
Noteer de waarde achter de regel 'gtid_current_pos' en sluit de SQL-shell (exit)
Stap 2
Er zijn drie opties om dit probleem op te lossen: de Global Transaction ID aanpassen, de Using_Gtid op Slave_Pos zetten, of de slave geheel resetten.
Pas de GTID aan door op je slave de volgende commando's uit te voeren in een SQL-shell (mysql -u root -p):
STOP SLAVE;
SET GLOBAL gtid_slave_pos = 'x-x-x';
START SLAVE;
Vervang hierboven de waarde x-x-x door de waarde van 'gtid_current_pos' die je zojuist genoteerd hebt.
Er is een grote kans dat je slave als gtid_current_pos de waarde gebruikt die het uit zijn eigen binlog haalt (de slave bouwt ook een binlog op wanneer het na een failover als master functioneert). Dit corrigeer je als volgt:
STOP SLAVE; SET GLO
BAL gtid_slave_pos = 'x-x-x';CHANGE MASTER TO MASTER_HOST='192.168.1.1', MASTER_USER='slavename', MASTER_PASSWORD='slavename_pw', MASTER_PORT=3306, MASTER_CONNECT_RETRY=10, MASTER_USE_GTID=slave_pos; START SLAVE;
Vervang de waarde x-x-x door de waarde van 'gtid_current_pos' die je zojuist genoteerd hebt.
Wat je hiermee feitelijk doet:
1) Je stelt de gtid_slave_pos op het nummer van de master in
2) Je vertelt aan het eind van het change master commando dat de gtid_current_pos de waarde van gtid_slave_pos gebruikt.
De slave reset je als volgt:
STOP SLAVE;
RESET SLAVE;
CHANGE MASTER TO MASTER_HOST='192.168.1.1', MASTER_USER='slavename', MASTER_PASSWORD='slavename_pw', MASTER_PORT=3306, MASTER_CONNECT_RETRY=10, MASTER_USE_GTID=current_pos;
START SLAVE;
Stap 3
Controleer tot slot dat de status van je slave in orde is:
SHOW SLAVE STATUS\G;
Error 'Can't create database 'databasename'; database exists' on query / Error 'Can't drop database 'databasename'; database doesn't exist' on query.
Dit probleem ontstaat wanneer de synchronisatie niet goed loopt, bijvoorbeeld na een split-brain-situatie, en kan er voor zorgen dat je databases / tabellen / etcetera niet kunt aanmaken of verwijderen. Wanneer dit het geval is hoef je niet per se vanaf je master een dump uit te voeren en die te importeren op je slave, maar kun je proberen eerst de betreffende synchronisatie stap over te slaan. Gebruik hiervoor de volgende commando's gebruiken vanaf een SQL-shell op je slave:
STOP SLAVE;
SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
START SLAVE;
SHOW SLAVE STATUS \G;
Het laatste commando gebruik je om te controleren dat je slave nu weer goed repliceert.
Alternatief kun je de slave vanaf een specifiek punt de replicatie opnieuw laten oppakken, om zo te proberen eerdere wijzigingen mee te laten synchronizeren. Gebruik hiervoor de onderstaande commando's in een SQL-shell, waarbij je x-x-x vervangt door de gewenste global transaction ID.
SET GLOBAL gtid_slave_pos='x-x-x';
START SLAVE UNTIL master_gtid_pos='x-x-x';
De foutmeldingen in dit artikel zijn er maar een paar die mogelijk zijn in een MariaDB master-slave-setup. Kom je er een tegen die hier niet behandeld wordt en zou je daar graag documentatie over zien? Laat ons dat vooral weten in een bericht onderaan dit artikel onder 'reacties' met de specifieke foutmelding.