MySQL
Replication
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