IT

Online replikace databáze MySQL

15.10.2015

Na masteru v /etc/mysql/my.cnf:

bind-address = xxx.xxx.xxx.xxx
server-id = 1
log_bin = /var/log/mysql/mysql-bin.log
binlog_do_db = databaze_co_chceme_replikovat

a restart mysql

Potom:

GRANT REPLICATION SLAVE ON *.* TO 'slave_user'@'%' IDENTIFIED BY 'password';
FLUSH PRIVILEGES;
USE databaze_co_chceme_replikovat;
FLUSH TABLES WITH READ LOCK;
SHOW MASTER STATUS;

Z výpisu si zapsat jméno logu a číslo udávající pozici v logu.

ptom se zamcenou databazi:
mysqldump -u root -p --opt newdatabase > newdatabase.sql

UNLOCK TABLES;
QUIT;

Na backupu:

CREATE DATABASE databaze_co_chceme_replikovat;
mysql -u root -p newdatabase < /path/to/newdatabase.sql

Ve /etc/mysql/my.cnf

server-id               = 2
relay-log               = /var/log/mysql/mysql-relay-bin.log
log_bin                 = /var/log/mysql/mysql-bin.log
binlog_do_db            = databaze_co_chceme_replikovat

a restart mysql.
Do tohoto příkazu doplnit správný název log file a číslo pozice z přechozího příkazu show master status na masteru.

CHANGE MASTER TO MASTER_HOST='xxx.xxx.xxx.xxx',MASTER_USER='slave_user', MASTER_PASSWORD='password', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=  107;

START SLAVE;

SHOW SLAVE STATUS\G

pripadne:

SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1; SLAVE START; 

Oprava spadlé replikace

Doporučuju zastavit slave (STOP SLAVE) a přenést celou databázi z mastru na slave přes mysqldump.

Poté smazat staré binární logy na mastru:

 PURGE BINARY LOGS BEFORE '2017-05-24 10:56:00';

Vypsat na mastru aktualni stav replikace (SHOW MASTER STATUS) a udaje prepsat do radky na slave:

 CHANGE MASTER TO master_log_file='mysql-bin.001280', master_log_pos=39125632;

a spustit slave (START SLAVE).

Kompletní restart replikace

Na slave:

STOP SLAVE;

Na masteru:

RESET MASTER;
FLUSH TABLES WITH READ LOCK;
SHOW MASTER STATUS;

Na slave vyprázdnit databázi. Třeba DROP DATABASE a CREATE DATABASE

Na masteru mysqldump data a přenést na slave

Na slave naimportovat data do databáze

RESET SLAVE;
CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=98;
START SLAVE;

mysql-bin.000001 a LOG POS podle SHOW MASTER STATUS

přeskočení špatného příkazu v replikaci

Zjistit stav spadlé replikace:

SHOW SLAVE STATUS \G

Potom:

STOP SLAVE;

SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1;

STAR SLAVE;