 Autor: [Miłka Teroy](/autorzy/milka-teroy) Analityk rynku hostingowego · Zweryfikowano Kwiecień 2026

1.  [Strona główna](/) ›
2.  [Baza wiedzy](/baza-wiedzy/) ›
3.  MySQL replication master-slave

# MySQL replication master-slave — konfiguracja krok po kroku

Opublikowano: 9 kwietnia 2026 · Kategoria: Bazy danych

Twoja baza MySQL jest pojedynczym punktem awarii? Jeden pad serwera i cała aplikacja offline? Replication to pierwszy krok do High Availability. Master obsługuje zapisy, repliki automatycznie otrzymują wszystkie zmiany i mogą obsługiwać zapytania SELECT — odciążając master i zapewniając backup "na żywo".

## Jak działa replication

MySQL replication opiera się na **binary log** — pliku zawierającym wszystkie zmiany danych (INSERT, UPDATE, DELETE, ALTER). Przepływ:

-   Master zapisuje każdą zmianę do `mysql-bin.000001` (binary log)
-   Replika uruchamia dwa wątki: **I/O thread** pobiera binary log z mastera i zapisuje do lokalnego `relay-bin`
-   **SQL thread** czyta relay log i wykonuje zapytania na lokalnej bazie repliki
-   Dane na replice są identyczne jak na master (z małym opóźnieniem 0-2s)

## Krok 1 — Konfiguracja mastera

Edytuj `/etc/mysql/mysql.conf.d/mysqld.cnf` na serwerze master:

\[mysqld\]
# Unikalny ID (musi być różny na master i każdej replice)
server-id = 1

# Włącz binary log
log\_bin = /var/log/mysql/mysql-bin.log
binlog\_format = ROW

# Retencja logów (7 dni)
binlog\_expire\_logs\_seconds = 604800

# Opcjonalnie: tylko wybrane bazy do replikacji
# binlog\_do\_db = moja\_baza

# Bind na LAN IP (nie localhost) — replika musi się połączyć
bind-address = 10.0.0.1

sudo systemctl restart mysql

# Utwórz użytkownika dla replikacji
mysql -u root -p

\-- Na serwerze MASTER
CREATE USER 'replica\_user'@'10.0.0.2' IDENTIFIED WITH mysql\_native\_password BY 'SilneHaslo2026!';
GRANT REPLICATION SLAVE ON \*.\* TO 'replica\_user'@'10.0.0.2';
FLUSH PRIVILEGES;

-- Zablokuj tabele i zapisz pozycję binary log
FLUSH TABLES WITH READ LOCK;
SHOW MASTER STATUS;

-- Zanotuj File i Position, np.:
-- File: mysql-bin.000003 | Position: 157

## Krok 2 — Dump danych

W drugim terminalu (master nadal zablokowany) zrób dump całej bazy i przenieś na replikę:

\# Na master
mysqldump -u root -p --all-databases --master-data=2 --single-transaction > dump.sql

# Prześlij na replikę
scp dump.sql root@10.0.0.2:/tmp/

# Wróć do MySQL na master i odblokuj
mysql -u root -p -e "UNLOCK TABLES;"

## Krok 3 — Konfiguracja repliki

Na serwerze repliki edytuj `/etc/mysql/mysql.conf.d/mysqld.cnf`:

\[mysqld\]
# Inny server-id niż master
server-id = 2

# Relay log
relay\_log = /var/log/mysql/mysql-relay-bin.log

# Tylko do odczytu — nikt nie zapisuje na replice ręcznie
read\_only = ON
super\_read\_only = ON

# Opcjonalnie: włącz binary log żeby robić kaskadową replikację
log\_bin = /var/log/mysql/mysql-bin.log

\# Restart i import dumpu
sudo systemctl restart mysql
mysql -u root -p < /tmp/dump.sql

# Ustaw źródło replikacji
mysql -u root -p

\-- Na REPLICE (MySQL 8.0+)
CHANGE REPLICATION SOURCE TO
  SOURCE\_HOST='10.0.0.1',
  SOURCE\_USER='replica\_user',
  SOURCE\_PASSWORD='SilneHaslo2026!',
  SOURCE\_LOG\_FILE='mysql-bin.000003',
  SOURCE\_LOG\_POS=157;

START REPLICA;
SHOW REPLICA STATUS\\G

## Monitoring replikacji

Kluczowe pola w `SHOW REPLICA STATUS`:

Pole

Oczekiwana wartość

Co sprawdzić

`Replica_IO_Running`

Yes

Jeśli No — sprawdź połączenie sieciowe, firewall, hasło

`Replica_SQL_Running`

Yes

Jeśli No — sprawdź Last\_SQL\_Error (zwykle konflikt danych)

`Seconds_Behind_Source`

0-2

Jeśli rośnie — replika nie nadąża (słaby CPU/dysk)

`Last_Error`

(puste)

Każdy błąd zatrzymuje SQL thread — wymaga interwencji

## Typowe problemy

-   **Duplicate entry błąd** — ktoś zapisał na replice (brak read\_only). Rozwiązanie: `STOP REPLICA; SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1; START REPLICA;` lub reseed.
-   **Replika za daleko w tyle** — zbyt słaby sprzęt. Rozwiązanie: więcej RAM/CPU lub włącz parallel replication: `replica_parallel_workers = 4`.
-   **Binary log się przepełnił** — retencja za długa, dysk pełny. Skróć `binlog_expire_logs_seconds` lub ręcznie: `PURGE BINARY LOGS BEFORE NOW() - INTERVAL 3 DAY;`
-   **Replika po restarcie nie startuje automatycznie** — dodaj `skip_replica_start = OFF` w my.cnf.

**Uwaga:** Dla produkcji rozważ semi-synchronous replication (plugin `rpl_semi_sync_source`) lub MySQL Group Replication (MySQL 8.0+) dla prawdziwego HA z automatycznym failover.

## Najczęstsze pytania

Co to jest MySQL replication i kiedy jej używać? +

MySQL replication to mechanizm kopiowania danych z jednego serwera (master/primary) na jeden lub więcej serwerów (replica/slave) w czasie rzeczywistym. Używasz jej gdy: chcesz mieć zapasowy serwer w razie awarii (HA), rozdzielić zapytania SELECT na wiele maszyn (read scaling), tworzyć backup bez obciążania master, albo mieć geograficznie rozproszone repliki dla niższego latency.

Jaka jest różnica między asynchronous i semi-synchronous replication? +

Asynchronous (domyślny): master zapisuje transakcję i od razu zwraca OK klientowi, replika dostaje ją z opóźnieniem. Szybki, ale w razie awarii mastera możesz stracić ostatnie transakcje. Semi-synchronous: master czeka aż przynajmniej jedna replika potwierdzi otrzymanie zmian przed zwróceniem OK. Bezpieczniejszy, ale wolniejszy (+2-10ms na transakcję). W praktyce: dla produkcji z krytycznymi danymi — semi-sync.

Czy replication zastępuje backup? +

NIE. Replication kopiuje wszystkie zmiany natychmiast — w tym błędy. Jeśli ktoś wykona DROP TABLE users na master, komenda natychmiast trafi na wszystkie repliki i dane znikną wszędzie. Replication zapewnia HA (wysoką dostępność), ale nadal potrzebujesz klasycznych backupów (mysqldump/xtrabackup) do odzyskiwania po błędach ludzkich lub atakach ransomware.

Jak sprawdzić czy replication działa poprawnie? +

Na replice: SHOW REPLICA STATUS\\G (MySQL 8.0+) lub SHOW SLAVE STATUS\\G (starsze). Sprawdź: Slave\_IO\_Running: Yes, Slave\_SQL\_Running: Yes, Seconds\_Behind\_Master: 0 lub niska wartość, Last\_Error: pusty. Jeśli Seconds\_Behind\_Master rośnie — replika nie nadąża. Jeśli widzisz błąd — zatrzymaj replikację (STOP REPLICA) i zdiagnozuj przyczynę przed restartem.

## Sprawdź oferty pasujące do tego scenariusza

Poniżej masz szybkie przejścia do ofert i stron z kodami rabatowymi tam, gdzie są dostępne.

Contabo

VPS z rootem — 2 instancje VPS to kompletny setup master + replica

Root MySQL

[Aktywuj rabat →](/out/contabo)

#Reklama · link partnerski

[Zobacz kod rabatowy →](/kody-rabatowe/contabo)

Mikrus

Budżetowy VPS idealny jako replica read-only dla mniejszych projektów

Tanio replica

[Aktywuj rabat →](/out/mikrus)

#Reklama · link partnerski

[Zobacz kod rabatowy →](/kody-rabatowe/mikrus)

LH.pl

Hosting zarządzany z backupami MySQL — bez setupu replikacji

Managed MySQL

[Aktywuj rabat →](/out/lh-pl)

#Reklama · link partnerski

[Zobacz kod rabatowy →](/kody-rabatowe/lh-pl)

## Powiązane strony

-   [MySQL na hostingu — konfiguracja](/baza-wiedzy/mysql-baza-danych-hosting)
-   [MySQL slow query log — optymalizacja](/baza-wiedzy/mysql-slow-query-log)
-   [Strategia backupów — zasada 3-2-1](/baza-wiedzy/backup-strategia-hosting)
-   [Wszystkie artykuły](/baza-wiedzy/)