Upd! Для сервера MariaDB інструкція тут
Нехай треба зробити реплікацію бази даних repltestdb (інструкція зі створення бази даних тут). Адреса master-сервера 10.8.0.1 Адреса slave-сервера 10.8.0.2
На стороні master-сервера Редагуємо файл
# vi /etc/my.cnf
В секцію
mysqld вставляємо параметри bind-address – IP-адреса, за якою буде доступний сервер, server-id – мусить бути унікальним в межах кластера задіяних серверів, log_bin – шлях, де будуть зберігатися логи, binlog_do_db – яка база підлягає реплікації (якщо потрібно реплікувати кілька баз, цей рядок повторюється для кожної
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
default-storage-engine = innodb
# Setting Up master server for replication
bind-address = 10.8.0.1
server-id = 1
log_bin = /var/log/mysql/mysql-bin.log
binlog_do_db = repltestdb
# binlog_do_db should be repeated for each database you want to replicate
#binlog_do_db = replbase2
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
Застосовуємо зміни, попередньо створивши каталог /var/log/mysql (в CentOS він стандартно відсутній).
# mkdir /var/log/mysql
# chown mysql:mysql /var/log/mysql
# service mysqld restart
Відкриваємо у вогнемурі доступ на порт 3306 для іншого сервера
# iptables -A INPUT -p tcp -s 10.8.0.2 -d 10.8.0.1 --dport 3306 -j ACCEPT
# iptables-save > /etc/sysconfig/iptables
Надаємо доступ для slave
$ mysql -u root -p
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl_user'@'10.8.0.2' IDENTIFIED BY 'thepassword';
mysql> FLUSH PRIVILEGES;
Робимо знімок бази даних
mysql> USE repltestdb;
mysql> FLUSH TABLES WITH READ LOCK;
mysql> SHOW MASTER STATUS;
Остання команда показує:
+------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+------------------+ | mysql-bin.000002 | 487 | repltestdb | | +------------------+----------+--------------+------------------+ 1 row in set (0.00 sec)
Записуємо ці дані, вони знадобляться в подальшому.
Увага! Тут потрібно відкрити інше вікно терміналу, тому що виконання наступної команди в тому самому вікні автоматично скасує lock
$ mysqldump -u root -p --opt repltestdb > repltestdb.sql
Повертаємось до початкового вікна терміналу і звільняємо базу даних.
mysql> UNLOCK TABLES;
mysql> QUIT;
Створений дамп
repltestdb.sql потрібно перенести на slave-сервер.
На стороні slave-сервера Створюємо базу даних.
$ mysql -u root -p
mysql> CREATE DATABASE repltestdb;
mysql> EXIT;
Відновлюємо її вміст з дампа:
$ mysql -u root -p repltestdb < ~/repltestdb.sql
Редагуємо файл
# vi /etc/my.cnf
В секцію
mysqld вставляємо параметри server-id – мусить бути унікальним в межах кластера задіяних серверів, relay-log – шлях, де будуть зберігатися логи, log_bin – шлях, де будуть зберігатися логи, binlog_do_db – яка база підлягає реплікації (якщо потрібно реплікувати кілька баз, цей рядок повторюється для кожної
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# Default to using old password format for compatibility with mysql 3.x
# clients (those using the mysqlclient10 compatibility package).
old_passwords=1
# Disabling symbolic-links is recommended to prevent assorted security risks;
# to do so, uncomment this line:
# symbolic-links=0
# Setting Up replication (as slave)
server-id = 2
relay-log = /var/log/mysql/mysql-relay-bin.log
log_bin = /var/log/mysql/mysql-bin.log
binlog_do_db = repltestdb
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
Застосовуємо зміни, попередньо створивши каталог /var/log/mysql (в CentOS він стандартно відсутній).
# mkdir /var/log/mysql
# chown mysql:mysql /var/log/mysql
# service mysqld restart
Відкриваємо знову оболонку mysql і вводимо команди для налаштування реплікації. Значення всіх параметрів ми визначили при налаштуванні master-сервера.
$ mysql -u root -p
mysql> CHANGE MASTER TO MASTER_HOST='10.8.0.1',MASTER_USER='repl_user',MASTER_PASSWORD='thepassword',MASTER_LOG_FILE='mysql-bin.000002',MASTER_LOG_POS=487;
mysql> START SLAVE;
Перевірка стану slave-сервера
mysql> SHOW SLAVE STATUS\G
“
\G” виводить результат у зручнішому для читання вигляді. Якщо виникає проблема з підключенням, можна спробувати запустити slave-сервер з таким налаштуванням:
mysql> STOP SLAVE;
mysql> SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1;
mysql> START SLAVE;
Написано на основі інструкції з