Newsgroup: it.comp.os.linux.software
Titolo: Copia veloce di un database MySQL

Buongiorno a tutti,
    sto cercando di risolvere nella maniera piu' veloce ed efficiente
la copia di un database MySQL e vorrei il vostro parere.
Premesso che:
* Il database e' abbastanza grosso (230.000 record, con molti
   campi di tipo TEXT di almeno 1000 caratteri di lunghezza)
* Il database viene replicato tra due macchine
* La copia della database (inteso come un insieme di tabelle,
  quindi una directory nella directory del MySQL deve essere
  effettuato all'interno dello stesso sistema
*  Il sistema di interrogazione, basato su PHP/MySQL, riceve
   molti contatti giornalieri (circa 80000) quindi e' fondamentale
  che la tabella principale resti offline il minor tempo possibile
come posso copiare all'interno dello stesso sistema un database
temporaneo dove vengono testati i nuovi dati su un database online
rimpiazzando completamente quest'ultimo nel minor tempo possibile?
Le soluzioni a cui pensavo sono fondamentalmente tre:
1) copia fisica della directory. Pero' in questo modo non funziona la
replicazione del database
2) creare uno script che faccia il dump del primo db, cancelli il
secondo, modifichi la prima riga del dump cambiando nome del db e
importi tutto il file generando cosi' il nuovo db aggiornato. Questo
sistema credo richieda molto spazio per il dump, e di conseguenza
anche molto tempo per la scrittura del file temporaneo; ha il pregio
pero' che poi l'operazione "offline" si limita all'import del file di
dump.
3) Programma in C che una volta cancellato il DB online provvede a
effettuare la query dal db temporaneo e copi i singoli record sul db
online. Il fatto pero' di effettuare due query distinte del ciclo a
quanto ho capito non mi permette di usare la funzione
mysql_use_result() ma la mysql_store_result(), che nuovamente mi copia
tutta la risposta della query in un file temporaneo in /tmp.
Ovviamente in tutti e tre i casi devo prevedere un sistema di lock del
database online durante la procedura di aggiornamento.
Suggerimenti?

 rimpiazzando completamente quest'ultimo nel minor tempo possibile?
Usare il BACKUP/RESTORE di MySQL ?

Usare il BACKUP/RESTORE di MySQL ?
Avevo pensato anche a quello, ma non sapevo se veniva gestita la
replicazione... Importare un file di dump in pratica simula una
sequenza di comandi SQL impartiti direttamente, il restore di un
backup invece credo lavori a livello di FS.
Ho deciso comunque di rimanere a livello FS, in quanto voglio anche
comprimere le tabelle nella versione in linea per aumentare le
prestazioni, e cosi' ho pensato ad un trucco banale ma efficace:
prima effettuo la "messa in linea" su una macchina, e le
interrogazioni in caso sia presente il lock vengono deviate sull'altra
poi effettuo la copia dei file sulla seconda, e devio tutte le
interrogazioni sulla prima.
In questo modo ho tutto il tempo di prepararmi per bene la tabella da
sbattere in linea, controllando eventuali errori e compattandola.

 backup invece credo lavori a livello di FS.
Occhio che se usi tabelle diverse dal suo tipo di default (il MyISAM se non
ricordo male) copiare fisicamente i file delle tabelle non funziona, nel
senso che dopo non le riconosce automaticamente.