Repliche DB MySQL

Kismet

Nuovo Utente
4 Apr 2010
9
0
0
Ciao a tutti, scrivo poco e me ne rammarico, ma spero che qualcuno mi aiuti a risolvere il problema.

Ho due DB MySQL Master->Slave

Fin quando modifico la struttura del DB master nessun problema esso viene replicato esattamente nel DB salve, ma i record sullo slave non vengono mai aggiornati restano immutati.

Questo è quello che c'è su Master:

mysql> SHOW MASTER STATUS
-> ;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000002 | 1169 | kismet_3 | |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

Questo è quello che c'è su Slave:

mysql> SHOW SLAVE STATUS\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: XXX.XXX.XXX.XXX
Master_User: slave
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000002
Read_Master_Log_Pos: 1169
Relay_Log_File: slave-relay.000030
Relay_Log_Pos: 235
Relay_Master_Log_File: mysql-bin.000002
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB: kismet_3
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: 1169
Relay_Log_Space: 235
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
1 row in set (0.00 sec)

ERROR:
No query specified

Qualche idea sul perchè?
 
Così "a naso" ho un dubbio sulle query che vengono eseguite:
Usando questa configurazione Replicate_Do_DB: kismet_3 e avendo come formato del log STATEMENT, questa query non verrà loggata:

INSERT INTO kismet_3.<nometabella> ...

Verrà invece loggata questa:

USE kismet_3
INSERT INTO <nometabella> ...

In pratica, per controllare se la query deve essere loggata o meno, fa affidamento solo al default DB selezionato al momento dell'esecuzione della query, non considerando un eventuale riferimento all'interno della query di inserimento o aggiornamento.

NB: ovviamente il fatto che il formato del log sia STATEMENT è una mia supposizione...
 
Intanto grazie per l'interesse.

Mi ha incuriosito quello che mi hai detto quindi mi sono aperto a mano il file mysql-bin.00002 e ho trovato in mezzo a caratteri "a caso" anche una query che avevo eseguito direttamente da phpmyadmin sul master ed è stata replicata anche sullo slave.

Quindi ora mi sorge un dubbio ascolta bene.

Il master remoto è "abbastanza potente" e qui risiede il DB principale. Lo slave lo uso per analisi ed è a pieno carico 7/24.

I dati lo slave li preleva dal master e ci riscrive i risultati dell'analisi quindi a sto punto mi sorge un dubbio. Visto che le query le effettua lo slave sul master quindi il master non scrive mai nulla sul log delle operazioni dei cambiamenti che vengono effettuati sul proprio DB.

Potrebbe essere giusto?

Di conseguenza in questa maniera la replica non è possibile.
 
I dati lo slave li preleva dal master e ci riscrive i risultati dell'analisi quindi a sto punto mi sorge un dubbio. Visto che le query le effettua lo slave sul master quindi il master non scrive mai nulla sul log delle operazioni dei cambiamenti che vengono effettuati sul proprio DB.

Bhe, il prelievo e l'analisi dei dati, anche se eseguita su server dove gira lo slave di MySQL, saranno fatti da un software esterno, non certo da MySQL... Quindi è questo software a eseguire le query di aggiornamento, ed il fatto che risieda sullo stesso server dello slave, non può incidere sul funzionamento della replica.

Questo software di analisi lo conosci, nel senso sai esattamente quali query esegue?
In alternativa, potresti abilitare sul master il log delle query (o magari farlo in ogni caso), e poi postare una delle query che non viene loggata per la replica?
 
Beh stiamo parlando di circa 60/70000 query al giorno e mi sembra strano che mi logghi solamente quella fatta a mano.

La cosa strana è che su mysql-bin la query non era nel formato update db.table ma solo update table.

Il codice è mio quindi so esattamete cosa fa.

Quindi ti chiedo solo come abilitare il file di log di mysql e quanto grandi mi diventano i log e quante risorse si porta via per scriverci dentro (scusa i tanti quanti :confused:).

ciao
 
Bhe, ma se il codice è tuo allora non c'è neanche bisogno di abilitare il log delle query (in ogni caso in my.cnf "log = /path/to/file.log"). Basta che guardi nel codice se le query sono eseguite selezionando un DB di default (es. in PHP mysql_select_db) oppure direttamente, con il riferimento a
<nomedb>.<nometabella>.

La cosa strana è che su mysql-bin la query non era nel formato update db.table ma solo update table

E' esattamente quello che ci deve essere, selezionando il db di default. Se la query l'hai eseguita con phpMyAdmin, molto probabilmente sarai andato sul DB interessato (se non proprio sulla tabella) e poi su "SQL" per eseguire la query. Questa operazione fa sì che il DB venga selezionato come default e che la query venga loggata. Prova invece ad andare, subito dopo il login in phpMyAdmin, su "SQL" senza selezionare alcun DB ed esegui la query (qui dovrai specificare <nomedb>.<nometabella>). Se è come penso in questo caso la query non dovrebbe essere loggata.

Ciao

PS. per quanto riguarda il log delle query è un'opzione decisamente pesante (soprattutto per l'I/O), dato che logga proprio tutte le query, SELECT comprese...
 
Ultima modifica:

Discussioni simili