Crmgo Blog

Replikacja MySQL

Replikacja MySQL

Ustawienia kreatora. Koniecznie należy podać unikalny identyfikator serwera, ścieżkę do logów binarnych oraz nazwę bazy danych do replikacji w sekcji [mysqld]: server-id = 1 log-bin = /var/lib/mysql/mysql-bin replicate-do-db = testdb Upewnij się, że masz wystarczająco miejsca na dysku dla logów binarnych. Dodajmy…

Replikacja MySQL
Ustawienia mistrza

Obowiązkowo podajemy unikalny identyfikator serwera, ścieżkę do logów binarnych oraz nazwę bazy danych do replikacji w sekcji [mysqld]:
server-id = 1
log-bin = /var/lib/mysql/mysql-bin
replicate-do-db = testdb

Upewnij się, że masz wystarczająco miejsca na dysku dla logów binarnych.

Dodajemy użytkownika replication, na prawach którego będzie przeprowadzana replikacja. Wystarczy przywilej "replication slave ":
mysql@master> GRANT replication slave ON "testdb".* TO "replication"@"192.168.1.102" IDENTIFIED BY "password";

Restartujemy MySQL, aby zmiany w konfiguracji przyniosły skutek:
root@master# service mysqld restart

Jeśli wszystko przebiegło pomyślnie, polecenie "show master status " powinno wyświetlić mniej więcej następujące dane:
mysql@master> SHOW MASTER STATUS\G
File: mysql-bin.000003
Position: 98
Binlog_Do_DB:
Binlog_Ignore_DB:

Wartość position powinna rosnąć wraz z wprowadzaniem zmian w bazie danych na serwerze mistrza.

Ustawienia repliki

Podajemy identyfikator serwera, nazwę bazy danych do replikacji oraz ścieżkę do plików relay-binlog w sekcji [mysqld] konfiguracji, a następnie restartujemy MySQL:
server-id = 2
relay-log = /var/lib/mysql/mysql-relay-bin
relay-log-index = /var/lib/mysql/mysql-relay-bin.index
replicate-do-db = testdb

root@replica# service mysqld restart

Przenoszenie danych

Tutaj będziemy musieli zablokować bazę danych do zapisu. Można to zrobić albo zatrzymując działanie aplikacji, albo ustawiając flagę read_only na serwerze mistrza (uwaga: flaga ta nie działa na użytkowników z przywilejem SUPER). Jeśli posiadamy tabele MyISAM, wykonujemy również "flush tables":
mysql@master> FLUSH TABLES WITH READ LOCK;
mysql@master> SET GLOBAL read_only = ON;

Sprawdzamy stan serwera mistrza poleceniem „show master status” i zapamiętujemy wartości File oraz Position (po pomyślnej blokadzie serwera mistrza nie powinny się one zmieniać):
File: mysql-bin.000003
Position: 98

Tworzymy dump bazy danych, a po zakończeniu operacji zdejmujemy blokadę serwera mistrza:
mysql@master> SET GLOBAL read_only = OFF;

Przenosimy dump na replikę i przywracamy z niego dane.
Na koniec uruchamiamy replikację poleceniami "change master to" i "start slave" oraz sprawdzamy, czy wszystko przebiegło pomyślnie:
mysql@replica> CHANGE MASTER TO MASTER_HOST = "192.168.1.101 ", MASTER_USER = "replication ", MASTER_PASSWORD = "password ", MASTER_LOG_FILE = "mysql-bin.000003 ", MASTER_LOG_POS = 98;
mysql@replica> start slave;

Wartości MASTER_LOG_FILE i MASTER_LOG_POS pobieramy z serwera mistrza.

Sprawdzamy postęp replikacji poleceniem "show slave status ":
mysql@replica> SHOW SLAVE STATUS\G

Artykuł pochodzi z habra i został sprawdzony w praktyce.

Stknąłem z błędem [ERROR] Failed to initialize the master info structure

Rozwiązanie: RESET SLAVE;

Drugi problem – (nie tworzyły się tabele InnoDB) – rozwiązało się usunięciem logów .. 0 ..01

Jeśli trzeba wykluczyć niektóre tabele z replikacji, wpisujemy je do konfiguracji:

replicate-wild-ignore-table=base.mw_words_positions
replicate-wild-ignore-table=base.mw_sotrudniki_log

Pomijanie błędów:

SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1; nie pomogło mi,

za to dodanie do my.cnf

slave-skip-errors= <kod błędu albo all>

rozwiązał problem.

Uwaga: wpis mógł powstać z pomocą AI i redakcji. Odpowiedzialny: Dmytro Lomaka, Kaltenkirchen.