Riavvia la replica mysql dopo sql_error


8

Ho due server mysql, un master e uno slave.

Qualcuno passò allo slave e creò una tabella, quindi in seguito passò al master e creò la stessa tabella. Naturalmente questa istruzione DDL è stata replicata sullo slave, causando un errore, causando l'arresto della replica nel punto dell'errore.

Come devo riavviare il processo di replica dopo aver lasciato cadere la tabella sullo slave o aver avviato la replica dopo quella dichiarazione?

mostra output stato slave:

mysql> show slave status \G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: xx.xx.xx.xx
                  Master_User: buildbot
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.024536
          Read_Master_Log_Pos: 33489509
               Relay_Log_File: mysqld-relay-bin.049047
                Relay_Log_Pos: 32575097
        Relay_Master_Log_File: mysql-bin.024476
             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: 1050
                   Last_Error: Error 'Table 'checklist' already exists' on query. Default database: 'dbname'. Query: 'CREATE TABLE `checklist` (
  `checklist_id` int(11) NOT NULL AUTO_INCREMENT,
  `description` varchar(768) NOT NULL,
  `url` varchar(512) NOT NULL,
  `active` bit(1) NOT NULL,
  `insert_date` datetime NOT NULL,
  `xcred` int(11) NOT NULL,
  PRIMARY KEY (`checklist_id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=latin1'
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 32574952
              Relay_Log_Space: 6766519525
              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: 2013
                Last_IO_Error: error reconnecting to master 'user@xx.xx.xx.xx:3306' - retry-time: 60  retries: 86400
               Last_SQL_Errno: 1050
               Last_SQL_Error: Error 'Table 'checklist' already exists' on query. Default database: 'dbname'. Query: 'CREATE TABLE `checklist` (
  `checklist_id` int(11) NOT NULL AUTO_INCREMENT,
  `description` varchar(768) NOT NULL,
  `url` varchar(512) NOT NULL,
  `active` bit(1) NOT NULL,
  `insert_date` datetime NOT NULL,
  `xcred` int(11) NOT NULL,
  PRIMARY KEY (`checklist_id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=latin1'

Risposte:


15

È possibile utilizzare i seguenti comandi (al prompt di mysql):

mysql> STOP SLAVE;
mysql> SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1;
mysql> START SLAVE;
mysql> SHOW SLAVE STATUS;

Il valore 1rappresenta il numero di istruzioni da saltare. Puoi farlo ripetutamente fino a quando la replica non viene riparata. Puoi vedere questa pagina .


2
+1 L'ho usato molte volte, tuttavia è importante capire cosa stai facendo durante l'esecuzione. Può portare a problemi di integrità dei dati. Nei casi in cui un file di dump è stato caricato nella casella sbagliata (ovvero slave non master) ho saltato centinaia di query (dopo aver verificato che ciò non danneggerà!). Ciò può evitare il processo di reimpostazione dell'intera replica di nuovo.
Coop il

Si hai ragione. Questo dovrebbe essere fatto con cura. È utile nel caso in cui sia presente una query non valida che ha interrotto la replica. Puoi semplicemente saltarlo. Puoi anche controllare le tabelle pertinenti dopo questo per assicurarti di non perdere dati tra master e slave.
Khaled,

3

Non In effetti, è necessario impostare nuovamente la replica da zero, come è accaduto per la prima volta, perché se si ignorano le istruzioni, si potrebbe perdere l'integrità. Per essere sicuri, è necessario replicare da un punto di partenza sicuro noto.

  • Blocca il maestro
  • Scarica i dati usando --master-data e annotando le coordinate del binlog (es. Mostra lo stato principale)
  • Sblocca il maestro
  • Carica il dump nello slave
  • Inizia a usare lo slave usando 'cambia master' e le coordinate binlog che hai registrato in precedenza
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.