Базы данных · 5 min read · Jan 31, 2026

Репликация MySQL на одной машине

Этот Как сделать объясняет репликацию в MySQL на одной машине.

У вас большие нагрузки, с сайтом на базе данных и производительностью, избыточностью, безопасностью теперь приходит на ум. DBA теперь вовлечены многими руками, чтобы найти хорошее решение для создания счастливых лиц. Так что появляются такие слова, как Кластер, Репликация, Резервное копирование, Переключение на резерв и другие. Так что это такое? Мы в настоящее время обсуждаем Репликацию в терминах веб-сайта на базе данных для больших нагрузок.

Что такое Репликация и зачем она нужна?

Репликация позволяет DBA клонировать базу данных мастера на другой сервер базы данных с такой же базой данных. Это включает в себя идентичности мастера и слейва. Слейв делает себя точной копией сервера базы данных мастера и/или его баз данных. Может быть отношение один-один, один-много, много-один между мастером(ами) и слейвом(ами). Слейв непрерывно читает бинарный журнал на мастере (binlog хранит запросы, записанные на сервере базы данных мастера) и получает ввод на свой сервер базы данных слейва.

Для чего Репликация не предназначена:

рассматривать решение для резервного копирования, производительности, безопасности и избыточности. Для этого есть другие техники.

Мы в настоящее время видим Репликацию сервера MySQL на одной машине, т.е. мастер и слейв работают на одной машине. Мы также обсудим некоторые проблемы с репликацией.

Предварительные требования:

Сервер MySQL 4.1.12 или выше в исходном формате. Скачайте его с http://mysql.com в исходном формате. Вы можете для удобства скачать клиент mysql с http://mysql.com или поместить mysql в переменную окружения. В противном случае mysql придется вызывать из соответствующих директорий мастера/слейва. некоторые дистрибутивы Linux. (Я использовал Fedora Core 2). удалить зависимости для сервера mysql

Установка и конфигурация MySQL Master:

Скачайте mysql-4.1.12 Source в папку /misc

tar xzvf mysql-4.1.12.tar.gz
cd /misc/mysql-4.1.12
./configure --prefix=/usr/local/mysql-master
make
make install
cd /usr/local/mysql-master/bin
./mysql_install_db

(это создаст папку var)

cd ../var
cp /misc/mysql-4.1.12/support-files/my-medium.cnf my.cnf
cd ..
groupadd mysql
useradd -g mysql mysql
chown -R root .
chown -R mysql var
chgrp -R mysql .
[mysqld]  

port = 3306  

socket = /usr/local/mysql-master/mysql.sock  

  

#skip-networking // мы пропускаем это в нашем случае, так как мы делаем и мастер, и слейв на одной машине.  

  

# Сервер Репликации Master (по умолчанию)  

# бинарное логирование требуется для репликации  

log-bin  

  

# требуется уникальный идентификатор от 1 до 2^32 - 1  

# по умолчанию 1, если master-host не установлен  

# но не будет работать как мастер, если пропущен  

server-id = 1  

настройте другие параметры в соответствии с вашими требованиями или оставьте прежними, это будет работать!! :) Теперь запустите сервер mysql:

cd /usr/local/mysql-master/bin
./mysqld_safe --defaults-file=/usr/local/mysql-master/var/my.cnf &;

MySQL Slave:

Теперь извлеките mysql-4.1.12.tar.gz в другую директорию,

cd /opt/mysql-4.1.12
./configure --prefix=/usr/local/mysql-slave
make
make install
cd /usr/local/mysql-slave
cd bin
./mysql_install_db

(это создаст папку var)

cd ../var
cp /opt/mysql-4.1.12/support-files/my-medium.cnf my.cnf
cd ..
groupadd mysql
useradd -g mysql mysql
chown -R root .
chown -R mysql var
chgrp -R mysql .

Редактируйте my.cnf в папке var

[mysqld]  

port  = 3307  

socket  = /usr/local/mysql-slave/var/mysql.sock  

  

#skip-networking  

  

server-id = 2  

  

# Сервер репликации для этого слейва - требуется  

master-host = localhost  

master-user = slavedb  

master-password = q1w2e3r4t5  

master-port = 3306  

Теперь запустите сервер mysql:

cd /usr/local/mysql-slave/bin
./mysqld_safe --defaults-file=/usr/local/mysql-slave/var/my.cnf &

Настройка Репликации:

подключитесь к mysql master:

mysql --sock=/usr/local/mysql-master/mysql.sock

Создайте учетную запись на мастере для слейва:

mysql> GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO slavedb@"192.168.1.27/255.255.255.0" identified by 'q1w2e3r4t5'; Query OK, 0 rows affected (0.28 sec)

подключитесь к mysql slave:

mysql --sock=/usr/local/mysql-slave/mysql.sock
mysql> slave start;

Query OK, 0 rows affected, 1 warning (0.04 sec)

Тестирование:

mysql подключение на мастере:

mysql> show master status\G;
************************* 1. row ***********************  
 File: adam-bin.000001  
 Position: 227  
 Binlog_Do_DB:  
Binlog_Ignore_DB:  
1 row in set (0.01 sec)  
  
ERROR:  
No query specified  

подключите mysql на слейве

mysql> show slave status\G;
*********************** 1. row *************************
 Slave_IO_State: Connecting to master  
 Master_Host: localhost  
 Master_User: slavedb  
 Master_Port: 3306  
 Connect_Retry: 60

Master_Log_File: adam-bin.000001

 Read_Master_Log_Pos: 4  
 Relay_Log_File: adam-relay-bin.000001  
 Relay_Log_Pos: 4  
 Relay_Master_Log_File: adam-bin.000001

Slave_IO_Running: Yes

Slave_SQL_Running: Yes

 Replicate_Do_DB:  
 Replicate_Ignore_DB:  
 Replicate_Do_Table:  
 Replicate_Ignore_Table:  
 Replicate_Wild_Do_Table:  
Replicate_Wild_Ignore_Table:  
 Last_Errno: 0  
 Last_Error:  
 Skip_Counter: 0  
 Exec_Master_Log_Pos: 4  
 Relay_Log_Space: 4  
 Until_Condition: None  
 Until_Log_File:  
 Until_Log_Pos: 0  
 Master_SSL_Allowed: No  
 Master_SSL_CA_File:  
 Master_SSL_CA_Path:  
 Master_SSL_Cert:  
 Master_SSL_Cipher:  
 Master_SSL_Key:  
 Seconds_Behind_Master: NULL  
1 row in set (0.00 sec)  
  
ERROR:  
No query specified  

файл binlog на мастере и его позиция должны быть одинаковыми в mysql slave по show slave status\G;
Если все в порядке, вы запускаете рабочую копию отношения один-один мастер и слейв на одной системе.

Некоторые проблемы:

Репликация может не сработать по ряду причин. Я делюсь некоторым своим опытом с репликацией.

проблема: репликация не удалась, мастер упал.

Мастер может быть отключен по многим причинам. Проверьте ЛИМИТЫ ФАЙЛОВ В БАЗЕ ДАННЫХ, SQL ЗАПРОСЫ И ИСПОЛЬЗОВАНИЕ ДИСКА. Если какая-либо из причин показывает, исправьте это, перезапустите mysqld и проверьте статус мастера:

mysql> show master status\G;

* 1. row *

adam-bin.000003

Position: 227

Binlog_Do_DB:
Binlog_Ignore_DB:
1 row in set (0.01 sec)

теперь проверьте слейв: по show slave status:

mysql> show slave status\G;

* 1. row *
Slave_IO_State: Connecting to master
Master_Host: localhost
Master_User: slavedb
Master_Port: 3306
Connect_Retry: 60

Master_Log_File: adam-bin.000001

Read_Master_Log_Pos: 4

Relay_Log_File: adam-relay-bin.000001
Relay_Log_Pos: 4
Relay_Master_Log_File: adam-bin.000001

Slave_IO_Running: No

Slave_SQL_Running: Yes

Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 4
Relay_Log_Space: 4
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: NULL
1 row in set (0.00 sec)

как показывают вышеуказанные значения, мастер увеличился до 3-го binlog, в то время как слейв все еще указывает на binlog1. поэтому измените это значение, подключившись к mysql slave

mysql>; stop slave;
mysql> change master to master_log_file='adam-bin.000003', master_log_pos=227;
mysql> start slave;

Теперь проверьте с show slave status\G; все работает нормально.

Проблема 2: Если на слейвах появляется ошибка дублирования ключа

т.е. На слейве

Mysql> show slave status\G;

* 1. row *
Slave_IO_State: Waiting for master to send event
Master_Host: 10.0.0.152
Master_User: repl
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: adam-bin.000048
Read_Master_Log_Pos: 317714810
Relay_Log_File: db4-relay-bin.000001
Relay_Log_Pos: 290512385
Relay_Master_Log_File: adam-bin.000048
Slave_IO_Running: Yes

Slave_SQL_Running: No

Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 1062

Last_Error: Error ‘Duplicate entry ‘dekq5g820avnfdmar5qi9dkhv3’ for key 1’ on query. Default database:’session_sql’. Query: ‘INSERT INTO sessi ons5 VALUES (‘dekq5g820avnfdmar5qi9dkhv3’, UNIX_TIMESTAMP(NOW()) + 18000, ‘redir ect|i:1;’)’

Skip_Counter:0
Exec_Master_Log_Pos: 290512419
Relay_Log_Space: 317714776
Until_Condition: None
Until_Log_File:
Until_Log_Pos:0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: NULL
1 row in set (0.00 sec)

Это означает, что из-за недоступности мастера слейв был прочитан, или из-за недоступности слейва мастер был обновлен, так что запрос получил два первичных ключа для одной записи, что является путаницей.

Поэтому исправить это можно следующим образом: На слейве:

Mysql> set global sql_slave_skip_counter=1;
Mysql> start slave;
Mysql> show slave status\G;

Это покажет синхронизированное значение с мастером. Исправлено.

Share: X/Twitter LinkedIn

Get new posts in your inbox

No spam. Unsubscribe anytime.