Sök…


Anmärkningar

Replikering används för att kopiera [Backup] -data från en MySQL-databaseserver till en eller flera MySQL-databasservrar.

Master - MySQL-databasservern, som serverar data som ska kopieras

Slave - MySQL-databasservern kopierar data som serveras av Master

Med MySQL är replikering asynkron som standard. Det betyder att slavar inte behöver anslutas permanent för att få uppdateringar från befälhavaren. Till exempel, om din slav är avstängd eller inte är ansluten till master och du slår på slaven eller ansluter till Master vid en senare tidpunkt, kommer den automatiskt att synkronisera med Master.

Beroende på konfigurationen kan du replikera alla databaser, utvalda databaser eller till och med utvalda tabeller i en databas.

Replikeringsformat

Det finns två kärntyper av replikationsformat

Statement Based Replication (SBR) - som replikerar hela SQL-satser. I detta skriver mästaren SQL-uttalanden till den binära loggen. Replikering av befälhavaren till slaven fungerar genom att utföra SQL-uttalanden på slaven.

Radbaserad replikering (RBR) - som endast replikerar de ändrade raderna. Här skriver mästaren händelser till den binära loggen som indikerar hur enskilda tabellrader ändras. Replikering av befälhavaren till slaven fungerar genom att kopiera händelserna som representerar ändringarna i tabellraderna till slaven.

Du kan också använda en tredje sort, Mixed Based Replication (MBR) . I detta används både uttalningsbaserad och radbaserad loggning. Logg skapas beroende på vilket som är bäst lämpat för ändringen.

Uttalande-baserat format var standard i MySQL-versioner äldre än 5.7.7. I MySQL 5.7.7 och senare är radbaserat format som standard.

Master - Slave Replication Setup

Överväg 2 MySQL-servrar för inställning av replikering, den ena är en Master och den andra en Slave.

Vi kommer att konfigurera befälhavaren att den ska hålla en logg över alla åtgärder som utförs på den. Vi kommer att konfigurera Slave-servern att den ska titta på loggen på Master och när ändringar sker i loggen på Master, bör den göra samma sak.

Masterkonfiguration

Först av allt måste vi skapa en användare på Master. Den här användaren kommer att användas av Slave för att skapa en anslutning med Master.

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

Ändra user_name och user_password enligt ditt användarnamn och lösenord.

Nu ska my.inf (my.cnf i Linux) -fil redigeras. Inkludera följande rader i avsnittet [mysqld].

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

Den första raden används för att tilldela ett ID till denna MySQL-server.

Den andra raden berättar för MySQL att börja skriva en logg i den angivna loggfilen. I Linux kan detta konfigureras som log-bin = /home/mysql/logs/mysql-bin.log . Om du startar replikering på en MySQL-server där replikering redan har använts, se till att den här katalogen är tom för alla replikationsloggar.

Den tredje raden används för att konfigurera databasen som vi ska skriva logg för. Du bör ersätta your_database med ditt databasnamn.

Se till att skip-networking inte har aktiverats och starta om MySQL-servern (Master)

Slavkonfiguration

my.inf filen bör också redigeras i Slave. Inkludera följande rader i avsnittet [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

Den första raden används för att tilldela ett ID till denna MySQL-server. Detta ID bör vara unikt.

Den andra raden är IP-adressen för Master-servern. Ändra detta enligt ditt Master-system-IP

Den tredje raden används för att ställa in ett nytt försök på några sekunder.

De nästa två raderna berättar användarnamnet och lösenordet till slaven genom att använda det som ansluter mästaren.

Nästa rad ställer in databasen den behöver för att replikera.

De två sista raderna används för att tilldela relay-log och relay-log-index filnamn.

Se till att skip-networking inte har aktiverats och starta om MySQL-servern (Slave)

Kopiera data till slav

Om data kontinuerligt läggs till Master måste vi förhindra all databasåtkomst på Master så att ingenting kan läggas till. Detta kan uppnås genom att köra följande uttalande i Master.

FLUSH TABLES WITH READ LOCK;

Om ingen data läggs till på servern kan du hoppa över steget ovan.

Vi kommer att ta säkerhetskopiering av Master med hjälp av mysqldump

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

Ändra your_database och reservkatalog enligt din installation. Du kommer nu att ha en fil som heter backup.sql på den angivna platsen.

Om din databas inte finns i din slav, skapa den genom att utföra följande

CREATE DATABASE `your_database`;

Nu måste vi importera säkerhetskopia till Slave MySQL-server.

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

Starta replikering

För att starta replikering måste vi hitta loggfilnamnet och loggpositionen i Master. Så kör följande i Master

SHOW MASTER STATUS;

Detta ger dig en utgång som nedan

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

Kör sedan följande i 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;

Först stoppar vi slaven. Sedan berättar vi exakt var vi ska titta i Master-loggfilen. För MASTER_LOG_FILE namn och MASTER_LOG_POS , använd värden som vi fick genom att köra SHOW MASTER STATUS kommandot på Master.

Du bör ändra IP- MASTER_HOST Master i MASTER_HOST och ändra användaren och lösenordet i enlighet därmed.

Slaven väntar nu. Slavens status kan visas genom att köra följande

SHOW SLAVE STATUS;

Om du tidigare FLUSH TABLES WITH READ LOCK i Master, släpp tabellerna från låset genom att köra följande

UNLOCK TABLES;

Nu har Master en loggbok för varje åtgärd som utförs på den och Slaveservern tittar på loggen på Master. När ändringar sker i loggen på Mästaren, replikerar Slave det.

Replikeringsfel

När det finns ett fel under körning av en fråga på slaven, stoppar MySQL replikering automatiskt för att identifiera problemet och fixa det. Detta beror främst på att en händelse orsakade en duplikatnyckel eller en rad inte hittades och den inte kan uppdateras eller raderas. Du kan hoppa över sådana fel även om detta inte rekommenderas

För att hoppa över bara en fråga som hänger slaven, använd följande syntax

SET GLOBAL sql_slave_skip_counter = N;

Detta uttalande hoppar över nästa N-händelser från befälhavaren. Detta uttalande gäller endast när slavtrådarna inte körs. Annars ger det ett fel.

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

I vissa fall är det bra. Men om uttalandet är en del av en transaktion med flera uttalanden, blir det mer komplicerat, eftersom det att hoppa över det felaktiga uttalandet kommer att leda till att hela transaktionen hoppas över.

Om du vill hoppa över fler frågor som producerar samma felkod och om du är säker på att hoppa över dessa fel inte kommer att göra din slav inkonsekvent och du vill hoppa över dem alla, lägger du till en rad för att hoppa över den my.cnf i din my.cnf .

Till exempel kanske du vill hoppa över alla dupliceringsfel du kan få

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

Lägg sedan till följande till din my.cnf

slave-skip-errors = 1062

Du kan också hoppa över andra typer av fel eller alla felkoder, men se till att hoppa över dessa fel inte kommer att göra din slav inkonsekvent. Följande är syntax och exempel

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
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow