mysql> start slave;
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> show warnings;
+-------+------+--------------------------+
| Level | Code | Message |
+-------+------+--------------------------+
| Note | 1254 | Slave is already running |
+-------+------+--------------------------+
1 row in set (0.00 sec)
mysql> show slave statusG;
Empty set (0.00 sec)
ERROR:
No query specified
Why???? I did a fresh install of MYSQL. I edited My.cnf. And I restarted the damn things.
This is my slave MY.CNF
server-id = 2
log_bin = /var/log/mysql/mysql-bin.log
master-host = 68.13.41.41
master-user = replication
master-password = slave
master-port = 3306
This is my master MY.cnf:
server-id = 1
log_bin = /var/log/mysql/mysql-bin.log
binlog-do-db=fal
I did this on master:
GRANT ALL ON *.* TO 'replication'@'theip' IDENTIFIED BY 'slave';
asked Jan 20, 2010 at 22:41
I fixed it by running commands in the MYSQL thing (instead of relying on the config)
answered Jan 20, 2010 at 23:04
TIMEXTIMEX
252k347 gold badges766 silver badges1068 bronze badges
1
Try adding this line to your MY.CNF on the SLAVE server:
report-host = 68.13.41.41
Then restart MySQL on the SLAVE server.
Now test on the MASTER server:
SHOW SLAVE STATUS G
answered Mar 5, 2013 at 7:16
I’m guessing you are adding a semi-colon (;) to the end of the statement.
Its unnecessary with the G.
So change show slave status G;
to show slave status G
answered Jun 11, 2016 at 7:14
CK.NguyenCK.Nguyen
1,24816 silver badges16 bronze badges
mysql> start slave;
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> show warnings;
+-------+------+--------------------------+
| Level | Code | Message |
+-------+------+--------------------------+
| Note | 1254 | Slave is already running |
+-------+------+--------------------------+
1 row in set (0.00 sec)
mysql> show slave statusG;
Empty set (0.00 sec)
ERROR:
No query specified
Why???? I did a fresh install of MYSQL. I edited My.cnf. And I restarted the damn things.
This is my slave MY.CNF
server-id = 2
log_bin = /var/log/mysql/mysql-bin.log
master-host = 68.13.41.41
master-user = replication
master-password = slave
master-port = 3306
This is my master MY.cnf:
server-id = 1
log_bin = /var/log/mysql/mysql-bin.log
binlog-do-db=fal
I did this on master:
GRANT ALL ON *.* TO 'replication'@'theip' IDENTIFIED BY 'slave';
asked Jan 20, 2010 at 22:41
I fixed it by running commands in the MYSQL thing (instead of relying on the config)
answered Jan 20, 2010 at 23:04
TIMEXTIMEX
252k347 gold badges766 silver badges1068 bronze badges
1
Try adding this line to your MY.CNF on the SLAVE server:
report-host = 68.13.41.41
Then restart MySQL on the SLAVE server.
Now test on the MASTER server:
SHOW SLAVE STATUS G
answered Mar 5, 2013 at 7:16
I’m guessing you are adding a semi-colon (;) to the end of the statement.
Its unnecessary with the G.
So change show slave status G;
to show slave status G
answered Jun 11, 2016 at 7:14
CK.NguyenCK.Nguyen
1,24816 silver badges16 bronze badges
Error no query specified
Добрый день, друзья.
Прошу по возможности подсказать по следующему вопросу.
Настроены два сервера под CentOS с mysql 5.6. Один мастер, другой соответственно slave. Настроена репликация для одной базы cat3, на сервере боевая база cat. Cat3 — аналог cat, но решили для тестирования начать не с боевой.
Конфиг для репликации с мастера:
server-id = 1
log_bin = /var/log/mysql/mysql-bin.log
expire_logs_days = 5
max_binlog_size = 500M
binlog_format = mixed
binlog_do_db = cat3
binlog-ignore-db=mysql
на slave сервере: server-id = 2.
В начале было все ок, прошло часов 12 и репликация свалилась с ошибкой странной:
Error ‘Table ‘cat.xml_logs_import_stats’ doesn’t exist’ on query. Default database: ». Query: ‘DELETE FROM `cat`.`xml_logs_import_stats` WHERE `id`=’1388249»
То есть с ошибкой, которая вообще не относится к реплицируемой базе cat3. Как такое может быть?
Делал на слейве:
set global SQL_SLAVE_SKIP_COUNTER = 1;
но не помогает, слейв больше не стартует.
mysql> show slave statusG;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host:
Master_User: replication
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 47646
Relay_Log_File: mysqld-relay-bin.000004
Relay_Log_Pos: 16279
Relay_Master_Log_File: mysql-bin.000001
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: 1146
Last_Error: Error ‘Table ‘cat.xml_logs_import_stats’ doesn’t exist’ on query. Default database: ». Query: ‘DELETE FROM `cat`.`xml_logs_import_stats` WHERE `id`=’1388249»
Skip_Counter: 0
Exec_Master_Log_Pos: 19530
Relay_Log_Space: 46060
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
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 1146
Last_SQL_Error: Error ‘Table ‘cat.xml_logs_import_stats’ doesn’t exist’ on query. Default database: ». Query: ‘DELETE FROM `cat`.`xml_logs_import_stats` WHERE `id`=’1388249»
Replicate_Ignore_Server_Ids:
Master_Server_Id: 1
Master_UUID: 20f2b3c0-504d-11e4-93d3-e4115bdc4f84
Master_Info_File: /var/lib/mysql/master.info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State:
Master_Retry_Count: 86400
Master_Bind:
Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp: 150122 16:52:45
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set:
Executed_Gtid_Set:
Auto_Position: 0
1 row in set (0.01 sec)
Главный мой вопрос как репликация свалилась запросом, которые не относится к базе, которая реплицируется.
Спасибо.
Ответить | Правка | Cообщить модератору
- ошибка репликации mysql, PavelR, 07:34 , 23-Янв-15, ( 1 )
- ошибка репликации mysql, Aleks305, 09:50 , 23-Янв-15, ( 3 )
- ошибка репликации mysql, PavelR, 07:37 , 23-Янв-15, ( 2 )
- ошибка репликации mysql, Aleks305, 14:03 , 23-Янв-15, ( 6 )
- ошибка репликации mysql, PavelR, 19:12 , 23-Янв-15, ( 8 )
- ошибка репликации mysql, Aleks305, 14:03 , 23-Янв-15, ( 6 )
- ошибка репликации mysql, ALex_hha, 11:41 , 23-Янв-15, ( 4 )
- ошибка репликации mysql, Aleks305, 11:57 , 23-Янв-15, ( 5 )
- ошибка репликации mysql, Aleks305, 16:19 , 23-Янв-15, ( 7 )
- ошибка репликации mysql, PavelR, 19:14 , 23-Янв-15, ( 9 )
- ошибка репликации mysql, Aleks305, 16:19 , 23-Янв-15, ( 7 )
- ошибка репликации mysql, Aleks305, 11:57 , 23-Янв-15, ( 5 )
Сообщения по теме | [Сортировка по времени | RSS] |
> Главный мой вопрос как репликация свалилась запросом, которые не относится к
> базе, которая реплицируется.
> Спасибо.
если вы сделаете так:
use cat3;
DELETE FROM `cat`.`xml_logs_import_stats` WHERE `id`=’1388249′
То этот запрос упадет в бинлог, т.к. фильтрация производится по значению текущей БД соединения.
Добро пожаловать в волшебный мир MySQL репликации.
1 . «ошибка репликации mysql» | + / – | |
Сообщение от PavelR (??) on 23-Янв-15, 07:34 | ||
Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору |
3 . «ошибка репликации mysql» | + / – | |
Сообщение от Aleks305 (ok) on 23-Янв-15, 09:50 | ||
Спасибо за ответ. Потестирую. |
||
Ответить | Правка | ^ к родителю #1 | Наверх | Cообщить модератору |
2 . «ошибка репликации mysql» | + / – | |
Сообщение от PavelR (ok) on 23-Янв-15, 07:37 | ||
Это чушь, вы в чем-то /сильно невнимательны/. Стартовать должен. |
||
Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору |
6 . «ошибка репликации mysql» | + / – | |
Сообщение от Aleks305 (ok) on 23-Янв-15, 14:03 | ||
Павел, скажите, пожалуйста, был ли у вас положительный опыт эксплуатации master-master на mysql? сложилось ли какое мнение об этом процессе? |
||
Ответить | Правка | ^ к родителю #2 | Наверх | Cообщить модератору |
8 . «ошибка репликации mysql» | + / – | |
Сообщение от PavelR (??) on 23-Янв-15, 19:12 | ||
Оно работает нормально, если программисты/проектировщики, написавшие приложение для этой схемы, были адекватны. |
||
Ответить | Правка | ^ к родителю #6 | Наверх | Cообщить модератору |
4 . «ошибка репликации mysql» | + / – | |
Сообщение от ALex_hha (ok) on 23-Янв-15, 11:41 | ||
вообще то надо так |
||
Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору |
5 . «ошибка репликации mysql» | + / – | |
Сообщение от Aleks305 (ok) on 23-Янв-15, 11:57 | ||
Спасибо. Я в курсе, так и делал. |
||
Ответить | Правка | ^ к родителю #4 | Наверх | Cообщить модератору |
7 . «ошибка репликации mysql» | + / – | |
Сообщение от Aleks305 (ok) on 23-Янв-15, 16:19 | ||
опять аналогичная ошибка выскочила, сделал необходимые команды, а эффекта ноль. Как в этом случае от ошибки избавиться? mysql> show slave statusG; ERROR: mysql> stop slave; mysql> set global SQL_SLAVE_SKIP_COUNTER = 1; mysql> start slave; mysql> show slave statusG; |
||
Ответить | Правка | ^ к родителю #5 | Наверх | Cообщить модератору |
9 . «ошибка репликации mysql» | + / – | |
Сообщение от PavelR (??) on 23-Янв-15, 19:14 | ||
Всё также. Пропускать «неправильные» запросы по одному. Источник Читайте также: Ps3 cech 4308a прошивка super slim Adblock |
В MySQL существуют два типа репликации данных:
- Master-Master
- Master-Slave
В данной статье мы рассмотрим репликацию Master-Master. При данной репликации данные, попавшие на тот или иной сервер в кластере будут реплицированы между собой.
Тестовый стенд:
- Master_1 — сервер на Centos 7 c адресом 192.168.15.2
- Master_2 — сервер на Centos 7 с адресом 192.168.15.3
Разделим процесс настройки репликации Master-Master на 2 этапа:
- Организация Master-Slave репликации. Главным сервером будет выступать Master_1, а вспомогательным будет Master_2.
- Организация обратной Master-Slave репликации — серверы будут синхронизировать информацию из логов соседа.
Установку MySQL мы рассматривали в данной статье, поэтому этот этап мы не будем рассматривать.
Настройка репликации типа Master-Master на MySQL
На двух серверах поднят MySQL. Первым делом нам необходимо провести редактирование файла my.cnf на каждом сервере.
Сервер Master_1 (192.168.15.2)
# mcedit /etc/mysql/my.cnf
В открывшимся файле приводим всё к данному виду:
[mysqld] #Уникальный идентификатор сервера server-id = 1 #Логи ошибок log_error = /var/log/mysql/mysql.err #Путь к bin-логам сервера(бин-лог, который заполняет мастер) log_bin = /var/log/mysql/mysql-bin.log log_bin_index = /var/log/mysql/mysql-bin.log.index #Путь к relay-логам слейва (бин-лог, скачанный с мастера) relay_log = /var/log/mysql/mysql-relay-bin relay_log_index = /var/log/mysql/mysql-relay-bin.index #БД, которые нужно/не нужно реплицировать #replicate-do-db = testdb replicate-ignore-db=information_schema replicate-ignore-db=mysql replicate-ignore-db=performance_schema #Не вести журнал бин-лога для БД binlog-ignore-db = information_schema binlog-ignore-db = mysql binlog-ignore-db = performance_schema #Чтобы не было конфликтов автоматического инкремента, сообщаем серверу, #чтобы id генерировались начиная с 1-го прибавляя по 2, # например 13, 23, 33, 43... auto_increment_increment = 2 auto_increment_offset = 1 #Сохранять логи с мастера в свой бин-лог, чтобы передать слейв-серверу log-slave-updates #log_slave_updates = 1 # Сколько дней хранить бин-логи expire_logs_days = 7 # Максимальный размер бин-лога max_binlog_size = 500M # Адрес 1-го мастера bind-address = 192.168.15.2
Далее создаем пользователя для репликации:
mysql> create user 'replica'@'%' identified by '%repl2021'; Query OK, 0 rows affected (0.00 sec) mysql> grant replication slave on *.* to 'replica'@'%'; Query OK, 0 rows affected (0.00 sec) mysql> flush privileges; Query OK, 0 rows affected (0.00 sec) mysql> exit
Указываем IP адрес для пользователя репликации:
# create user 'replica'@'192.168.15.2' identified by '%repl2021'; # GRANT REPLICATION SLAVE ON *.* TO 'replica'@'192.168.15.2' IDENTIFIED BY '%repl2021';
Производим перезапуск MySQL сервера:
Первый Master-сервер развернут.
Проверяем статус созданного нами мастер сервера:
mysql> show master status; +------------------+----------+--------------+---------------------------------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+---------------------------------------------+ | mysql-bin.000002 | 107 | | information_schema,mysql,performance_schema | +------------------+----------+--------------+---------------------------------------------+ 1 row in set (0.00 sec) mysql>
Далее переходим ко второму серверу Master_2 (192.168.15.3):
Редактируем файл аналогичным образом, как в конфиге ниже:
#Уникальный идентификатор сервера server-id = 2 #Логи ошибок log_error = /var/log/mysql/mysql.err #Путь к bin-логам сервера(бин-лог, который заполняеи мастер) log_bin = /var/log/mysql/mysql-bin.log log_bin_index = /var/log/mysql/mysql-bin.log.index #Путь к relay-логам слейва (бин-лог, скачанный с мастера) relay_log = /var/log/mysql/mysql-relay-bin relay_log_index = /var/log/mysql/mysql-relay-bin.index #БД, которые нужно/не нужно реплицировать #replicate-do-db = testdb replicate-ignore-db=information_schema replicate-ignore-db=mysql replicate-ignore-db=performance_schema #Не вести журнал бин-лога для БД binlog-ignore-db = information_schema binlog-ignore-db = mysql binlog-ignore-db = performance_schema #Чтобы не было конфликтов автоинкремента, говорим серверу, #чтобы id генерировались начиная с 2-го прибавляя по 2, # например 13, 23, 33, 43... auto_increment_increment = 2 auto_increment_offset = 2 #Сохранять логи с мастера в своий бин-лог, чтобы передать слейву log-slave-updates #log_slave_updates = 1 # Сколько дней хранить бин-логи expire_logs_days = 7 # Максимальный размер бин-лога max_binlog_size = 500M # Адрес 2-го мастера bind-address = 192.168.15.3
На данном этапе создаем папку и файлы, куда будут записываться логи):
# mkdir /var/log/mysql # chown -R mysql. /var/log/mysql
Создаем пользователя для репликации
mysql> create user 'replica'@'%' identified by '%repl2021'; Query OK, 0 rows affected (0.00 sec) mysql> grant replication slave on *.* to 'replica'@'%'; Query OK, 0 rows affected (0.00 sec) mysql> flush privileges; Query OK, 0 rows affected (0.00 sec) mysql> exit
Перезапускаем MySQL сервер:
Настройка репликации
На данном этапе мы настраиваем непосредственно репликацию. Запускаем репликацию на втором сервере (Master_2). Для того, чтобы это сделать нам необходимо узнать MASTER_LOG_FILE и MASTER_LOG_POS на первом сервере (Master_1).
Статус мастера на сервере Master_1
# mysql -u root -p -e 'show master status;'
Вывод команды:
+------------------+----------+--------------+---------------------------------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+---------------------------------------------+ | mysql-bin.000002 | 107 | | information_schema,mysql,performance_schema | +------------------+----------+--------------+---------------------------------------------+ 1 row in set (0.00 sec)
Обратим внимание, что MASTER_LOG_FILE это mysql-bin.000002, а MASTER_LOG_POS равен 107.
На втором сервере (Master_2) выполняем:
mysql> slave stop; Query OK, 0 rows affected, 1 warning (0.00 sec) mysql> CHANGE MASTER TO MASTER_HOST = '192.168.15.2', MASTER_USER = 'replica', MASTER_PASSWORD = '%repl2021', MASTER_LOG_FILE = 'mysql-bin.000002', MASTER_LOG_POS = 107; Query OK, 0 rows affected (0.02 sec) mysql> slave start; Query OK, 0 rows affected (0.00 sec) mysql>
Далее производим репликацию на 1-ом сервере. Для этого нужно посмотреть статус мастера на Master_2 сервере:
mysql> SHOW MASTER STATUS; +------------------+----------+--------------+---------------------------------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+---------------------------------------------+ | mysql-bin.000002 | 106 | | information_schema,mysql,performance_schema | +------------------+----------+--------------+---------------------------------------------+ 1 row in set (0.00 sec) mysql>
Обратим внимание, что MASTER_LOG_FILE это mysql-bin.000002, а MASTER_LOG_POS равен 106.
На сервере Master_1 выполняем команду:
mysql> slave stop; Query OK, 0 rows affected, 1 warning (0.00 sec) mysql> CHANGE MASTER TO MASTER_HOST = '192.168.15.3', MASTER_USER = 'replica', MASTER_PASSWORD = '%repl2021', MASTER_LOG_FILE = 'mysql-bin.000002', MASTER_LOG_POS = 106; Query OK, 0 rows affected (0.03 sec) mysql> slave start; Query OK, 0 rows affected (0.00 sec) mysql>
После всех действий просматриваем статус слейва на всех мастер-серверах:
Master_1
mysql> show slave status G; *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.15.3 Master_User: replica Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000002 Read_Master_Log_Pos: 106 Relay_Log_File: mysql-relay-bin.000002 Relay_Log_Pos: 252 Relay_Master_Log_File: mysql-bin.000002 Slave_IO_Running: Yes Slave_SQL_Running: Yes Replicate_Do_DB: Replicate_Ignore_DB: information_schema,mysql,performance_schema 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: 106 Relay_Log_Space: 408 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: 0 Master_SSL_Verify_Server_Cert: No Last_IO_Errno: 0 Last_IO_Error: Last_SQL_Errno: 0 Last_SQL_Error: Replicate_Ignore_Server_Ids: Master_Server_Id: 2 1 row in set (0.00 sec) ERROR: No query specified mysql>
Master_2
mysql> show slave status G; *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.15.2 Master_User: replica Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000002 Read_Master_Log_Pos: 107 Relay_Log_File: mysql-relay-bin.000002 Relay_Log_Pos: 252 Relay_Master_Log_File: mysql-bin.000002 Slave_IO_Running: Yes Slave_SQL_Running: Yes Replicate_Do_DB: Replicate_Ignore_DB: information_schema,mysql,performance_schema 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: 107 Relay_Log_Space: 407 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: 0 Master_SSL_Verify_Server_Cert: No Last_IO_Errno: 0 Last_IO_Error: Last_SQL_Errno: 0 Last_SQL_Error: 1 row in set (0.00 sec) ERROR: No query specified mysql>
Кластер из двух мастер-серверов готов.
We have a mysql replication client running on our backup server. Since a power failure last week it’s stopped replicating. Before this it was running uninterrupted for several months.
I’ve tried restarting both the master and the slave but this hasn’t helped. I can access the master server from the slave, so the network isn’t the issue.
Is there anything else I can do to try diagnose what the problem is?
mysql> show slave statusG;
*************************** 1. row ***************************
Slave_IO_State:
Master_Host: master
Master_User: username
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000060
Read_Master_Log_Pos: 46277494
Relay_Log_File: mysqld-relay-bin.000348
Relay_Log_Pos: 98
Relay_Master_Log_File: mysql-bin.000060
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: 46277494
Relay_Log_Space: 98
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
mysql> show master statusG;
*************************** 1. row ***************************
File: mysql-bin.000069
Position: 851796
Binlog_Do_DB:
Binlog_Ignore_DB:
1 row in set (0.00 sec)
ERROR:
No query specified
Update: The errors were going into daemon.log, not mysql.err, which would explain why I couldn’t find them. The problem seems to be that the master is saying the log is unavailable, which doesn’t make much sense, because that log (and the previous one) are still available on the master.
090710 9:17:35 [Note] Slave SQL thread initialized, starting replication in log 'mysql-bin.000060' at position 46277494, relay log './mysqld-relay-bin.000350' position: 98
090710 9:17:35 [Note] Slave I/O thread: connected to master 'username@master:3306', replication started in log 'mysql-bin.000060' at position 46277494
090710 9:17:35 [ERROR] Error reading packet from server: Client requested master to start replication from impossible position ( server_errno=1236)
090710 9:17:35 [ERROR] Got fatal error 1236: 'Client requested master to start replication from impossible position' from master when reading data from binary log
090710 9:17:35 [Note] Slave I/O thread exiting, read up to log 'mysql-bin.000060', position 46277494
Репликация в виде Master-Master в MySQL используется распределения нагрузки на БД между нодами. С помощью репликации, 2 (и больше) отдельных MySQL серверов выступают в качестве кластера. Кластеризация базы данных особенно полезна для обеспечения высокой производительности. Используйте два и более выделенных серверов (нод) для настройки репликации базы данных ( но для этого нужно выделенные IPv4 адреса).
В mysql существует два типа репликации данных:
- Master-Slave
- Master-Master
При использовании репликации Master-Slave, на Master ноде данные поступают ( с ними можно выполнять любые операции (добавлять/удалять/изменять) и все изменения Slave нода будет забирать себе, но если на Slave ноде вы выполните любой из запросов ( удаление, добавление или изменение), то данные не попадут на Master.
При репликации в виде Master-Master данные попавшие на ноды, будут синхронизироваться между собой.
Имеется:
- (Мастер 1) — Сервер с ОС Debian 8 — 192.168.13.147
- (Мастер 2) — Сервер с ОС CentOS 7 -192.168.13.151
Взял специально 2 сервера с разными ОС для того чтобы показать что оно может работать корректно ( можно использовать не ограниченное количество нод, хоть 100 шт).
Данный процесс настройки master-master репликации поделен на 2 шага:
- На 1-м шаге, организую master-slave репликацию, где главным будет master_1, а подчиненным будет master_2;
- На 2-м шаге я организую обратную master-slave репликацию, и сервера начинают собирать информацию из логов друг друга.
Установка MYSQL в Unix/Linux
У меня имеется ряд статей по установке mysql на различные Unix/Linux ОС, по этому если кто-то не знает как установить, может воспользоваться следующими статьями:
Установка MySQL на Debian/Ubuntu/Linux Mint
Установка MySQL 5.5 на RHEL / CentOS и Fedora
Установка MySQL из портов во FreeBSD
Установка MariaDB 10 на CentOS 7
Установка MariaDB на Debian
Установка MariaDB 5.5 на RHEL / CentOS / Fedora Linux
Установка MariaDB в Ubuntu 12.04/12.10/13.04/13.10/14.04
Настройка репликации Master-Master на MySQL
И так, mysql установлен на всех серверах (у меня их 2, но можно подключить и больше) и следующим шагом нужно отредактировать my.cnf файл на каждой из нод.
На 1-м сервере с ОС Debian 8 (192.168.13.147):
# vim /etc/mysql/my.cnf
Вставляем:
[mysqld] #Уникальный идентификатор сервера server-id = 1 #Логи ошибок log_error = /var/log/mysql/mysql.err #Путь к bin-логам сервера(бинлог, который ведет мастер) log_bin = /var/log/mysql/mysql-bin.log log_bin_index = /var/log/mysql/mysql-bin.log.index #Путь к relay-логам слейва (бинлог, скачанный с мастера) relay_log = /var/log/mysql/mysql-relay-bin relay_log_index = /var/log/mysql/mysql-relay-bin.index #БД, которые нужно/не нужно реплицировать #replicate-do-db = testdb replicate-ignore-db=information_schema replicate-ignore-db=mysql replicate-ignore-db=performance_schema #Не вести журнал бин-лога для БД binlog-ignore-db = information_schema binlog-ignore-db = mysql binlog-ignore-db = performance_schema #Чтобы не было конфликтов автоинкремента, говорим серверу, #чтобы id генерировались начиная с 1-го прибавляя по 2, # например 13, 23, 33, 43... auto_increment_increment = 2 auto_increment_offset = 1 #Сохранять логи с мастера в своий бин-лог, чтобы передать слейву log-slave-updates #log_slave_updates = 1 # Сколько дней хранить бин-логи expire_logs_days = 7 # Максимальный размер бин-лога max_binlog_size = 500M # Адрес 1-го мастера bind-address = 192.168.13.147
В моем конфиге будет реплицироваться все БД, но если хотите сделать репликацию только 1 базы данных — стоит раскомментировать «binlog_do_db» поле и указать в нем имя БД.
Создаем пользователя для репликации:
mysql> create user 'replica'@'%' identified by '%repl2017'; Query OK, 0 rows affected (0.00 sec) mysql> grant replication slave on *.* to 'replica'@'%'; Query OK, 0 rows affected (0.00 sec) mysql> flush privileges; Query OK, 0 rows affected (0.00 sec) mysql> exit Bye [root@localhost captain]#
PS: Для более крутой безопасности, можно указать конкретно IP:
# create user 'replica'@'192.168.13.147' identified by '%repl2017'; # GRANT REPLICATION SLAVE ON *.* TO 'replica'@'192.168.13.147' IDENTIFIED BY '%repl2017';
Перезапускаем MySQL сервер:
# service mysql restart
Собственно, первый MASTER готов!
Смотрим статус мастера (данная информация понадобится немного позже):
mysql> show master status; +------------------+----------+--------------+---------------------------------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+---------------------------------------------+ | mysql-bin.000002 | 107 | | information_schema,mysql,performance_schema | +------------------+----------+--------------+---------------------------------------------+ 1 row in set (0.00 sec) mysql>
Вот.
На 2-м сервере с ОС CentOS 7 -192.168.13.151:
# vim /etc/my.cnf
Вставляем:
[mysqld] #Уникальный идентификатор сервера server-id = 2 #Логи ошибок log_error = /var/log/mysql/mysql.err #Путь к bin-логам сервера(бинлог, который ведет мастер) log_bin = /var/log/mysql/mysql-bin.log log_bin_index = /var/log/mysql/mysql-bin.log.index #Путь к relay-логам слейва (бинлог, скачанный с мастера) relay_log = /var/log/mysql/mysql-relay-bin relay_log_index = /var/log/mysql/mysql-relay-bin.index #БД, которые нужно/не нужно реплицировать #replicate-do-db = testdb replicate-ignore-db=information_schema replicate-ignore-db=mysql replicate-ignore-db=performance_schema #Не вести журнал бин-лога для БД binlog-ignore-db = information_schema binlog-ignore-db = mysql binlog-ignore-db = performance_schema #Чтобы не было конфликтов автоинкремента, говорим серверу, #чтобы id генерировались начиная с 2-го прибавляя по 2, # например 13, 23, 33, 43... auto_increment_increment = 2 auto_increment_offset = 2 #Сохранять логи с мастера в своий бин-лог, чтобы передать слейву log-slave-updates #log_slave_updates = 1 # Сколько дней хранить бин-логи expire_logs_days = 7 # Максимальный размер бин-лога max_binlog_size = 500M # Адрес 2-го мастера bind-address = 192.168.13.151
Создаем папку и файлы ( в них будут писаться логи):
# mkdir /var/log/mysql # chown -R mysql. /var/log/mysql
Создаем пользователя для репликации:
mysql> create user 'replica'@'%' identified by '%repl2017'; grant replication slave on *.* to 'replica'@'%'; flush privileges; exit
PS: Для более крутой безопасности, можно указать конкретно IP:
# create user 'replica'@'192.168.13.147' identified by '%repl2017'; # GRANT REPLICATION SLAVE ON *.* TO 'replica'@'192.168.13.147' IDENTIFIED BY '%repl2017';
Перезапускаем MySQL сервер:
# service mysqld restart
Идем дальше.
Настройка репликации
Сейчас нужно настроить саму репликацию. Для начала, запускаем репликацию на 2-м мастере, но чтобы сделать это, необходимо узнать «MASTER_LOG_FILE» и «MASTER_LOG_POS» на 1-м мастере.
Смотрим статус мастера ( я выводил его выше) на 1-й ноде:
# mysql -u root -p -e 'show master status;'
Или:
mysql> show master status;
Вывод:
+------------------+----------+--------------+---------------------------------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+---------------------------------------------+ | mysql-bin.000002 | 107 | | information_schema,mysql,performance_schema | +------------------+----------+--------------+---------------------------------------------+ 1 row in set (0.00 sec)
Видим, что «MASTER_LOG_FILE = mysql-bin.000002, а «MASTER_LOG_POS» = 107.
На 2-й ноде выполняем:
mysql> slave stop; Query OK, 0 rows affected, 1 warning (0.00 sec) mysql> CHANGE MASTER TO MASTER_HOST = '192.168.13.147', MASTER_USER = 'replica', MASTER_PASSWORD = '%repl2017', MASTER_LOG_FILE = 'mysql-bin.000002', MASTER_LOG_POS = 107; Query OK, 0 rows affected (0.02 sec) mysql> slave start; Query OK, 0 rows affected (0.00 sec) mysql>
Думаю что не стоит объяснять что и где нужно заменить — это интуитивно понятно.
Делаем репликацию на 1-м сервере, но для этого смотрим мастер статус на 2-м:
mysql> SHOW MASTER STATUS; +------------------+----------+--------------+---------------------------------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+---------------------------------------------+ | mysql-bin.000002 | 106 | | information_schema,mysql,performance_schema | +------------------+----------+--------------+---------------------------------------------+ 1 row in set (0.00 sec) mysql>
Видим, что «MASTER_LOG_FILE = mysql-bin.000002, а «MASTER_LOG_POS» = 106.
И на 1-м выполняем команду:
mysql> slave stop; Query OK, 0 rows affected, 1 warning (0.00 sec) mysql> CHANGE MASTER TO MASTER_HOST = '192.168.13.151', MASTER_USER = 'replica', MASTER_PASSWORD = '%repl2017', MASTER_LOG_FILE = 'mysql-bin.000002', MASTER_LOG_POS = 106; Query OK, 0 rows affected (0.03 sec) mysql> slave start; Query OK, 0 rows affected (0.00 sec) mysql>
После чего, можно посмотреть статус слейва на всех мастерах.
МАСТЕР_1:
mysql> show slave status G; *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.13.151 Master_User: replica Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000002 Read_Master_Log_Pos: 106 Relay_Log_File: mysql-relay-bin.000002 Relay_Log_Pos: 252 Relay_Master_Log_File: mysql-bin.000002 Slave_IO_Running: Yes Slave_SQL_Running: Yes Replicate_Do_DB: Replicate_Ignore_DB: information_schema,mysql,performance_schema 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: 106 Relay_Log_Space: 408 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: 0 Master_SSL_Verify_Server_Cert: No Last_IO_Errno: 0 Last_IO_Error: Last_SQL_Errno: 0 Last_SQL_Error: Replicate_Ignore_Server_Ids: Master_Server_Id: 2 1 row in set (0.00 sec) ERROR: No query specified mysql>
МАСТЕР_2:
mysql> show slave status G; *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.13.147 Master_User: replica Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000002 Read_Master_Log_Pos: 107 Relay_Log_File: mysql-relay-bin.000002 Relay_Log_Pos: 252 Relay_Master_Log_File: mysql-bin.000002 Slave_IO_Running: Yes Slave_SQL_Running: Yes Replicate_Do_DB: Replicate_Ignore_DB: information_schema,mysql,performance_schema 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: 107 Relay_Log_Space: 407 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: 0 Master_SSL_Verify_Server_Cert: No Last_IO_Errno: 0 Last_IO_Error: Last_SQL_Errno: 0 Last_SQL_Error: 1 row in set (0.00 sec) ERROR: No query specified mysql>
Если необходимо собрать кластер более чем 2 мастера, то необходимо соединять их постепенно и по цепочке. А сейчас, перейдем к тестированию созданного кластера.
Тестирования репликации master-master в mysql
Потестируем репликацию и убедимся что все хорошо работает.
На 1-м мастере я создам базу данных и таблицу:
mysql> create database master_1; Query OK, 1 row affected (0.00 sec) mysql> create table master_1.flowers (`id` varchar(10)); Query OK, 0 rows affected (0.01 sec) mysql>
На мастере 2 смотрю что получилось:
mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | master_1 | | mysql | | test | +--------------------+ 4 rows in set (0.00 sec) mysql> show tables in master_1 -> ; +--------------------+ | Tables_in_master_1 | +--------------------+ | flowers | +--------------------+ 1 row in set (0.00 sec) mysql>
Видно что репликация работает и все данные реплицировало на 2-й мастер с 1-го. Переходим тестировать мастер 2, для этого, я создаю на нем же БД и таблицу:
mysql> create database master_2; Query OK, 1 row affected (0.00 sec) mysql> create table master_2.flowers (`id` varchar(10)); Query OK, 0 rows affected (0.00 sec) mysql>
И на 1-м выполняю команду:
mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | master_1 | | master_2 | | mysql | | performance_schema | +--------------------+ 5 rows in set (0.01 sec) mysql> show tables in master_2; +--------------------+ | Tables_in_master_2 | +--------------------+ | flowers | +--------------------+ 1 row in set (0.00 sec) mysql>
Видим что все работает должным образом и настройка репликации Master-Master на MySQL завершена!