MySQL
kopiëren
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