replicação mysql bem-sucedida, mas o escravo não está replicando

8

Eu criei uma configuração master-slave do mysql e as coisas parecem boas. o "show status master"; no escravo não mostra nenhum erro. esta é a saída

 Slave_IO_State: Waiting for master to send event
                  Master_Host: 109.123.100.58
                  Master_User: replica
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000001
          Read_Master_Log_Pos: 106
               Relay_Log_File: relay-bin.000001
                Relay_Log_Pos: 4
        Relay_Master_Log_File: mysql-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: 106
              Relay_Log_Space: 106
              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: 

No entanto, a replicação no escravo não parece estar acontecendo quando o mestre sofre alterações

No mestre. MOSTRAR ESTADO MASTER

+------------------+----------+--------------+-------------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB        |
+------------------+----------+--------------+-------------------------+
| mysql-bin.000001 |   639495 |              | mysql,informationschema |
+------------------+----------+--------------+-------------------------+

no escravo SHOW PROCESSLIST produz

+-----+-------------+-----------+------+---------+-------+-----------------------------------------------------------------------+------------------+
| Id  | User        | Host      | db   | Command | Time  | State                                                                 | Info             |
+-----+-------------+-----------+------+---------+-------+-----------------------------------------------------------------------+------------------+
| 174 | system user |           | NULL | Connect | 25777 | Waiting for master to send event                                      | NULL             |
| 175 | system user |           | NULL | Connect | 25777 | Has read all relay log; waiting for the slave I/O thread to update it | NULL             |
| 199 | root        | localhost | NULL | Query   |     0 | NULL                                                                  | show processlist |
+-----+-------------+-----------+------+---------+-------+-----------------------------------------------------------------------+------------------+
3 rows in set (0.00 sec)

Estou esquecendo de algo

Soyeed
fonte
Duas questões. Você tem a mesma versão do MySQL em execução no master e slave? Você tem um ID de servidor diferente definido na configuração do mestre / escravo? edit: podemos ver a íntegra SHOW MASTER STATUStambém, acho que a parte superior está faltando.
desculpe meu erro, o bit superior foi a saída para SHOW SLAVE STATUS \ G. mostre o status mestre nos rendimentos dos escravos + ------------------ + ---------- + ------------- - + ------------------------- + | Arquivo | Posição | Binlog_Do_DB Binlog_Ignore_DB | + ------------------ + ---------- + -------------- + ---- --------------------- + | mysql-bin.000004 | 106 | mysql, informationschema | + ------------------ + ---------- + -------------- + ---- --------------------- +
Soyeed
Não olhe para SHOW MASTER STATUSo escravo . Esta informação não é relevante, a menos que o escravo também esteja servindo como mestre para outros escravos mais a jusante.
Michael - sqlbot
Se você está SHOW PROCESSLISTno mestre, vê a conexão de entrada do escravo? Você deve. Além disso, eu tentaria STOP SLAVE IO_THREAD;então START SLAVE IO_THREAD;o escravo e veria como a saída de SHOW SLAVE STATUS(no escravo) muda, se é que o faz.
Michael - sqlbot

Respostas:

5

A saída que você apresentou é muito confusa. Por um lado, o mestre mostra:

mysql-bin.000001   639495 

O escravo PROCESSLISTindica que a replicação funciona (o encadeamento IO está conectado ao mestre, o encadeamento SQL está aguardando).

O escravo SHOW SLAVE STATUS novamente afirma que está tudo bem, mas a posição do mestre está 106.

Todas essas saídas são emitidas aproximadamente ao mesmo tempo? Caso contrário, eles não são valiosos.

Gostaria de verificar o seguinte:

  • O óbvio: é 109.123.100.58realmente seu mestre?
  • Será que SHOW PROCESSLISTna lista principal a ligação feita pelo escravo sob o replicausuário?
  • Você tem server-idconfigurações diferentes para mestre e escravo?
  • Você tem alguma replicate-do-*ou replicate-ignore-*configurações no seu mysql.cnfarquivo?
Shlomi Noach
fonte
Sim, a saída é ao mesmo tempo. 1. sim 109.123.100.58 é o mestre. 2. não 3. sim 4. não. Mostrar lista de processos em master shows '+-------+------+-----------+------+---------+------+-------+------------------+ | Id | User | Host | db | Command | Time | State | Info | +-------+------+-----------+------+---------+------+-------+------------------+ | 23243 | root | localhost | NULL | Query | 0 | NULL | SHOW PROCESSLIST | +-------+------+-----------+------+---------+------+-------+------------------+
Soyeed 16/05
3
2-não ?? Mais estranho a cada minuto. Estou muito insegura de que seu escravo esteja realmente conectado ao mestre certo.
Shlomi Noach 17/05
11
Obrigado pela dica! No meu caso, eu tinha replicação M-> S1-> S2, e meu ID de servidor S2 correspondia ao meu ID de servidor M.
Aaron R.
1

Melhor do que usar binlog-ignore-db é usar a filtragem do lado do escravo. Eu estava preso em uma situação semelhante, sim, levei um dia inteiro para descobrir:

Perdi algo grande !!!

A diferença entre

--replicate-do-db=
--replicate-do-table=

No lado escravo. E

--replicate-do-table='mydb.%'

não funcionou para mim na mesa. Eu tive que usar

--replicate-do-db='mydb'

Eu acho que isso teria funcionado para um curinga

--replicate-wild-do-table='mydb.%'

... Agora, vamos descobrir como replicar a mesma tabela de vários mestres. Ok, eu descobri, o MySQL não suporta nativamente; MariaDB 10 faz.

Também tive outro problema inicialmente: minha senha tinha mais de 32 caracteres. Vaia!

Dagelf
fonte
1

Eu também me deparei com este problema. A causa raiz era ter o mestre server_id=0. O MariaDB possui um comportamento especial para o server_id=0qual não permitirá que a replicação funcione.

O server_id deve ser exclusivo para cada servidor no grupo de replicação. Se deixado em 0, o padrão até o MariaDB 10.2.1, um escravo não se conectará a um mestre e um mestre recusará todas as conexões do escravo.

Quando comecei a indexar com base em 1, tudo funcionou bem.

Ryan Goodfellow
fonte
-2

Você não disse ao escravo qual banco de dados replicar: a variável Replicate_Do_DB está vazia.

Tente adicionar a linha

replicate-do-db = name_of_db (onde "name_of_db" é o nome do banco de dados a ser replicado)

no seu my.cnf (no escravo) e reinicie o servidor escravo.

Edição: Eu não acho que minha resposta é a solução certa, enquanto isso ;-)

Talvez dê uma olhada nesta página: http://dev.mysql.com/doc/refman/5.1/en/replication-problems.html

Chris
fonte
Eu não acho isso correto. Você pode ver que 639495 bytes foram registrados no log de log do mestre
A questão é por que a replicação não está funcionando - não se algo foi gravado no binlog. Normalmente, o comando SHOW MASTER STATUS não mostra mais informações.
Desculpe meu mau .. Mostrar rendimentos status de mestre+------------------+----------+--------------+-------------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+-------------------------+ | mysql-bin.000004 | 106 | | mysql,informationschema | +------------------+----------+--------------+-------------------------+
Soyeed
Também me disseram que se eu não significasse replicate-do-db, ele replica todos os bancos de dados. Em vez disso eu tinha aentry binlog_ignore_db = mysql binlog_ignore_db = informationschema
Soyeed
11
Não siga as orientações nesta resposta, pois você não precisa informar ao banco de dados qual esquema replicar (o padrão é todos os esquemas), e isso possivelmente interromperá sua replicação e, provavelmente, não o que você está procurando. Você deseja (99,999%) replicar todos os esquemas.
Shlomi Noach