MySQL escravo fora de sincronia com mestre

1

Nosso escravo, que é usado apenas para backups, está fora de sincronia. Ele caiu em uma restrição de chave.

Eu gostaria de encontrar uma maneira de ressincronizar o escravo sem colocar o master off-line, sei que posso fazê-lo dessa maneira, mas acredito que é possível não fazê-lo.

Eu tenho "MySQL de alto desempenho" na minha frente e isso me aponta na direção do maatkit, especificamente do mk-table-sync.

Para a vida de mim eu não consigo fazer o mk-table-sync funcionar.

Eu corro assim no escravo:

root@machine:~# mk-table-sync --sync-to-master --dry-run 127.0.0.1
# Syncing h=127.0.0.1
# DELETE REPLACE INSERT UPDATE ALGORITHM EXIT DATABASE.TABLE
#      0       0      0      0 Chunk     0    database.case_study_product
#      0       0      0      0 Chunk     0    database.case_study_region
#      0       0      0      0 Chunk     0    database.case_study_sector
#      0       0      0      0 Chunk     0    database.contact
#      0       0      0      0 Chunk     0    database.contact_issue
#      0       0      0      0 Chunk     0    database.feedback
#      0       0      0      0 Chunk     0    database.feedback_rating
#      0       0      0      0 Chunk     0    database.feedback_usefulness
#      0       0      0      0 Chunk     0    database.help
#      0       0      0      0 Chunk     0    database.help_issue
#      0       0      0      0 Chunk     0    database.search_weight
#      0       0      0      0 Chunk     0    database.contented_content
#      0       0      0      0 Nibble    0    database.contented_content_index
#      0       0      0      0 Chunk     0    database.contented_content_log

Eu sei que o contented_content e o contented_content_index estão fora de sincronia. Mas pelo que posso dizer, a saída do maatkit acha que está tudo bem.

Aqui está a saída do status do escravo:

mysql> SHOW SLAVE STATUS\G
*************************** 1. row ***************************
             Slave_IO_State: Waiting for master to send event
                Master_Host: 10.0.40.12
                Master_User: rep1
                Master_Port: 3306
              Connect_Retry: 60
            Master_Log_File: mysql-bin.000023
        Read_Master_Log_Pos: 25832973
             Relay_Log_File: mysql-relay-bin.000002
              Relay_Log_Pos: 19098703
      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: 1452

Qualquer ajuda, ponteiros ... peça mais informações..etc

    
por johnwards 13.11.2009 / 16:14

5 respostas

2

Logo depois de muita cabeça arranhando e brincando no meu ambiente virtual, foi assim que consegui sincronizar meu escravo com o mestre.

1) No banco de dados ( mydb ) no master , quero criar a seguinte tabela:

CREATE TABLE checksum (
     db         char(64)     NOT NULL,
     tbl        char(64)     NOT NULL,
     chunk      int          NOT NULL,
     boundaries char(100)    NOT NULL,
     this_crc   char(40)     NOT NULL,
     this_cnt   int          NOT NULL,
     master_crc char(40)         NULL,
     master_cnt int              NULL,
     ts         timestamp    NOT NULL,
     PRIMARY KEY (db, tbl, chunk)
);

2) No master , execute o seguinte comando:

mk-table-checksum -d mydb --replicate mydb.checksum 127.0.0.1

3) No slave , execute o seguinte comando:

mk-table-sync -d mydb --replicate mydb.checksum  --sync-to-master --no-foreign-key-checks --execute 127.0.0.1

Quando tentei executar o comando replicar soma de verificação no escravo antes de executar o comando de sincronização que não fez nada.

O escravo conectado e trabalhando no meu exemplo, também desabilitei as checagens de chaves estrangeiras porque estamos usando o INNODB e estava recebendo problemas de restrição de chaves estrangeiras ao executar a sincronização.

    
por 17.11.2009 / 13:34
1

Talvez ajude se você colocar o servidor slave:

mysql> STOP SLAVE;
mysql> SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1;
mysql> START SLAVE;
    
por 13.11.2009 / 16:57
1

Os dados do escravo serão diferentes depois que ele terminar a recuperação. Execute mk-table-checksum --replique primeiro no master, depois no slave, execute mk-table-sync --replicate (existe um exemplo nos docs).

Não estou claro o que você entendeu sobre o estado de seu escravo da saída de --dry-run, mas --dry-run NÃO compara nenhum dado. Ele simplesmente informa quais tabelas ele examinaria e com qual algoritmo de sincronização.

    
por 13.11.2009 / 19:50
1

Eu acho que há uma necessidade de informações mais claras sobre o que o --dry-run faz, então criei uma solicitação de recurso: link

Eu agradeço seus comentários lá e na lista de discussão do Maatkit!

    
por 13.11.2009 / 20:00
1

Eu tenho uma situação semelhante em que preciso verificar regularmente a consistência dos dados entre meu mestre e o escravo.

Eu escrevi um script para lidar com isso, o qual eu joguei no crontab e o execute todos os domingos, durante um tempo em que eu sei que não haverá muitos dados sendo gravados no banco de dados replicado.

Devo notar que isso está escrito em PHP, e o escravo / mestre estão na mesma rede com um NFS hospedado no disco mestre @ / home / sharefiles /

Tenho certeza de que algumas pessoas podem resmungar sobre como isso é feito, mas atende muito bem às minhas necessidades e leva apenas alguns segundos para ser executado.

/ * Este script é executado semanalmente para interromper a replicação, descartar os bancos de dados, copiá-los do mestre para o escravo * /

/ * E começa a replicação novamente. Não toque neste script !! * /

// Parar escravo no escravo

$ slave = mysql_connect ("escravo", "usuário", "pw");

mysql_query ("STOP SLAVE", $ escravo);

// Repor posição

mysql_query ("RESET SLAVE", $ escravo);

// Obtenha informações mestras, posicione etc.

$ master = mysql_connect ("localhost", "usuário", "pw");

$ masterinfo = mysql_fetch_assoc (mysql_query ("SHOW MASTER STATUS", $ mestre)); // $ masterinfo [File], $ masterinfo [Position]

// Dbs a serem replicados

$ dbArray = array ("db1", "db2", "db3", "db4");

// Despeje cada db e copie para o escravo

foreach ($ dbArray como $ db) {

    system("mysqldump $db > /home/sharefiles/$db.sql");

    system("mysql -h slaveaddress -u root --password=pw --database=$db < /home/sharefiles/$db.sql");

}

mysql_query ("MUDAR MASTER PARA MASTER_HOST = 'master', MASTER_USER = 'replicação', MASTER_PASSWORD = 'replicationuserpassword', MASTER_LOG_FILE = '$ masterinfo [Arquivo]', MASTER_LOG_POS = $ masterinfo [Posição]", $ escravo);

mysql_query ("START SLAVE", $ escravo);

    
por 31.08.2010 / 21:22