Zoeken…


Opmerkingen

Replicatie wordt gebruikt om [Backup] gegevens van één MySQL-databaseserver naar één of meer MySQL-databaseservers te kopiëren.

Master - De MySQL-databaseserver, die gegevens dient te kopiëren

Slave - De MySQL-databaseserver kopieert gegevens die door Master worden geleverd

Met MySQL is replicatie standaard asynchroon. Dit betekent dat slaves niet permanent hoeven te zijn verbonden om updates van de master te ontvangen. Als uw slave bijvoorbeeld is uitgeschakeld of niet is verbonden met de master en u slave inschakelt of op een later tijdstip verbinding maakt met de master, wordt deze automatisch gesynchroniseerd met de master.

Afhankelijk van de configuratie kunt u alle databases, geselecteerde databases of zelfs geselecteerde tabellen in een database repliceren.

Replicatieformaten

Er zijn twee kerntypen replicatie-indelingen

Statement Based Replication (SBR) - die volledige SQL-instructies repliceert. Hierin schrijft de master SQL-instructies naar het binaire logboek. Replicatie van de master naar de slave werkt door die SQL-instructies op de slave uit te voeren.

Row Based Replication (RBR) - die alleen de gewijzigde rijen repliceert. Hierin schrijft de master gebeurtenissen in het binaire logboek die aangeven hoe afzonderlijke tabelrijen worden gewijzigd. Replicatie van de master naar de slave werkt door de gebeurtenissen die de wijzigingen vertegenwoordigen naar de tabelrijen naar de slave te kopiëren.

U kunt ook een derde variëteit gebruiken, Mixed Based Replication (MBR) . Hierin worden zowel op regels gebaseerde als op rijen gebaseerde logboekregistratie gebruikt. Logboek wordt gemaakt, afhankelijk van wat het meest geschikt is voor de wijziging.

Op verklaringen gebaseerde indeling was de standaard in MySQL-versies ouder dan 5.7.7. In MySQL 5.7.7 en hoger is de op rijen gebaseerde indeling de standaard.

Master - slave replicatie instellen

Overweeg 2 MySQL-servers voor het instellen van replicatie, de ene is een master en de andere is een slaaf.

We gaan de master configureren zodat deze een logboek bijhoudt van elke actie die erop wordt uitgevoerd. We gaan de Slave-server configureren zodat deze naar het logboek op de Master moet kijken en wanneer er wijzigingen in het logboek op de Master plaatsvinden, moet deze hetzelfde doen.

Hoofdconfiguratie

Allereerst moeten we een gebruiker op de Master maken. Deze gebruiker zal door Slave worden gebruikt om een verbinding met de Master tot stand te brengen.

CREATE USER 'user_name'@'%' IDENTIFIED BY 'user_password';
GRANT REPLICATION SLAVE ON *.* TO 'user_name'@'%';
FLUSH PRIVILEGES;

Wijzig user_name en user_password basis van uw gebruikersnaam en wachtwoord.

Nu moet het bestand my.inf (my.cnf in Linux) worden bewerkt. Neem de volgende regels op in de sectie [mysqld].

server-id = 1
log-bin = mysql-bin.log
binlog-do-db = your_database

De eerste regel wordt gebruikt om een ID aan deze MySQL-server toe te wijzen.

De tweede regel vertelt MySQL om een logboek in het opgegeven logboekbestand te schrijven. In Linux kan dit worden geconfigureerd als log-bin = /home/mysql/logs/mysql-bin.log . Als u begint met repliceren op een MySQL-server waarin al replicatie is gebruikt, zorg er dan voor dat deze directory leeg is van alle replicatielogboeken.

De derde regel wordt gebruikt om de database te configureren waarvoor we een logboek gaan schrijven. U moet your_database vervangen door uw databasenaam.

Zorg dat skip-networking niet is ingeschakeld en start de MySQL-server opnieuw (Master)

Slave-configuratie

my.inf bestand moet ook in Slave worden bewerkt. Neem de volgende regels op in de sectie [mysqld].

server-id = 2
master-host = master_ip_address
master-connect-retry = 60

master-user = user_name
master-password = user_password
replicate-do-db = your_database

relay-log = slave-relay.log
relay-log-index = slave-relay-log.index

De eerste regel wordt gebruikt om een ID aan deze MySQL-server toe te wijzen. Deze ID moet uniek zijn.

De tweede regel is het IP-adres van de hoofdserver. Wijzig dit volgens uw Master systeem IP

De derde regel wordt gebruikt om een herhalingslimiet in seconden in te stellen.

De volgende twee regels vertellen de gebruikersnaam en het wachtwoord aan de Slave, waarmee het de Master verbindt.

Volgende regel stelt de database in die hij moet repliceren.

De laatste twee regels die worden gebruikt om bestandsnamen voor relay-log en relay-log-index toe te wijzen.

Zorg dat skip-networking niet is ingeschakeld en start de MySQL-server opnieuw (Slave)

Gegevens naar slave kopiëren

Als er voortdurend gegevens aan de Master worden toegevoegd, moeten we alle toegang tot de database op de Master voorkomen, zodat er niets kan worden toegevoegd. Dit kan worden bereikt door de volgende instructie in Master uit te voeren.

FLUSH TABLES WITH READ LOCK;

Als er geen gegevens aan de server worden toegevoegd, kunt u de bovenstaande stap overslaan.

We gaan een gegevensback-up van de Master maken met behulp van mysqldump

mysqldump your_database -u root -p > D://Backup/backup.sql;

Wijzig uw your_database en back- your_database volgens uw instellingen. U hebt nu een bestand met de naam backup.sql op de opgegeven locatie.

Als uw database niet bestaat in uw Slave, maakt u deze aan door het volgende uit te voeren

CREATE DATABASE `your_database`;

Nu moeten we back-up importeren in Slave MySQL-server.

mysql -u root -p your_database  <D://Backup/backup.sql
--->Change `your_database` and backup directory according to your setup

Start replicatie

Om de replicatie te starten, moeten we de logbestandsnaam en de logpositie in de master zoeken. Voer dus het volgende uit in Master

SHOW MASTER STATUS;

Dit geeft u een uitvoer zoals hieronder

+---------------------+----------+-------------------------------+------------------+
| File                | Position | Binlog_Do_DB                  | Binlog_Ignore_DB |
+---------------------+----------+-------------------------------+------------------+
| mysql-bin.000001    | 130      | your_database                 |                  |
+---------------------+----------+-------------------------------+------------------+

Voer vervolgens het volgende uit in Slave

SLAVE STOP;
CHANGE MASTER TO MASTER_HOST='master_ip_address', MASTER_USER='user_name', 
   MASTER_PASSWORD='user_password', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=130;
SLAVE START;

Eerst stoppen we de slaaf. Vervolgens vertellen we het precies waar het moet kijken in het hoofdlogbestand. Gebruik voor MASTER_LOG_FILE naam en MASTER_LOG_POS de waarden die we hebben gekregen door het SHOW MASTER STATUS commando uit te voeren op de Master.

Wijzig het IP-adres van de master in MASTER_HOST en wijzig de gebruiker en het wachtwoord dienovereenkomstig.

De slaaf zal nu wachten. De status van de Slave kan worden bekeken door het volgende uit te voeren

SHOW SLAVE STATUS;

Als u eerder FLUSH TABLES WITH READ LOCK in Master hebt uitgevoerd, laat u de tabellen van slot los door het volgende uit te voeren

UNLOCK TABLES;

Nu houdt de Master een logboek bij voor elke actie die erop wordt uitgevoerd en kijkt de Slave-server naar het logboek op de Master. Wanneer er wijzigingen plaatsvinden in het logboek op de Master, repliceert Slave dat.

Replicatiefouten

Wanneer er een fout optreedt tijdens het uitvoeren van een query op de slave, stopt MySQL de replicatie automatisch om het probleem te identificeren en op te lossen. Dit komt vooral omdat een gebeurtenis een dubbele sleutel heeft veroorzaakt of een rij niet is gevonden en deze niet kan worden bijgewerkt of verwijderd. U kunt dergelijke fouten overslaan, zelfs als dit niet wordt aanbevolen

Gebruik de volgende syntaxis om slechts één zoekopdracht over te slaan waaraan de slave hangt

SET GLOBAL sql_slave_skip_counter = N;

Deze verklaring slaat de volgende N-gebeurtenissen van de master over. Deze verklaring is alleen geldig als de slave-threads niet actief zijn. Anders levert het een fout op.

STOP SLAVE;
SET GLOBAL sql_slave_skip_counter=1;
START SLAVE;

In sommige gevallen is dit prima. Maar als de instructie deel uitmaakt van een transactie met meerdere instructies, wordt deze complexer, omdat het overslaan van de foutproducerende instructie ervoor zorgt dat de hele transactie wordt overgeslagen.

Als je meer zoekopdrachten wilt overslaan die dezelfde foutcode produceren en als je zeker weet dat het overslaan van die fouten je slave niet inconsistent maakt en je wilt ze allemaal overslaan, zou je een regel toevoegen om die foutcode in je my.cnf te slaan .

U wilt bijvoorbeeld alle dubbele fouten die u mogelijk krijgt, overslaan

1062 | Error 'Duplicate entry 'xyz' for key 1' on query

Voeg vervolgens het volgende toe aan uw my.cnf

slave-skip-errors = 1062

Je kunt ook andere soorten fouten of alle foutcodes overslaan, maar zorg ervoor dat het overslaan van die fouten je slaaf niet inconsistent maakt. Hierna volgen de syntaxis en voorbeelden

slave-skip-errors=[err_code1,err_code2,...|all]

slave-skip-errors=1062,1053
slave-skip-errors=all
slave-skip-errors=ddl_exist_errors


Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow