Domanda

Ho una tabella myISAM in esecuzione su mySQL e, facendo alcuni test, abbiamo scoperto che possiamo velocizzare enormemente una query aggiungendo un certo indice composto. Fin qui tutto bene. Tuttavia, non sono davvero il modo migliore per aggiungere questo indice in un ambiente di produzione senza bloccare la tabella per molto tempo (ha 27 GB di dati, quindi non così tanto, ma ci vuole un po 'di tempo).

Hai qualche consiglio? Se questa fosse una configurazione più sofisticata, ovviamente avremmo una replica live di tutti i dati su un'altra macchina e potremmo passare in sicurezza. Sfortunatamente, non ci siamo ancora arrivati ??e vorrei accelerare questa query il più presto possibile (sta causando grossi mal di testa ai clienti). Esiste un modo semplice per replicare i dati e quindi eseguire un trucco di scambio? Qualche altro trucco che mi manca?

AGGIORNAMENTO: Lettura di " Operazioni sugli indici online " in SQL Server mi rende molto geloso http://msdn.microsoft.com/en -us / library / ms191261.aspx :)

Grazie!

È stato utile?

Soluzione

puoi usare la replica per ottenere tempi di inattività dell'ordine di un paio di minuti, anziché le ore che potrebbero essere necessarie per creare un indice su quella tabella.

per configurare lo slave, vedere http: //dev.mysql.com/doc/refman/5.0/en/replication-howto-existingdata.html

una raccomandazione che posso fare per accelerare il processo è nel passaggio 2, seguire la sezione "Creazione di un'istantanea dei dati utilizzando file di dati non elaborati" metodo. ma invece di copiare il cavo sullo slave, copiare in un'altra posizione sul master. e ripristina il master non appena viene eseguita la copia e hai apportato le modifiche necessarie al file di configurazione (imposta ID server e registrazione binaria abilitata). questo ridurrà al minimo i tempi di fermo a solo un minuto o due. una volta eseguito il backup del server, è possibile copiare i file copiati nella casella slave.

una volta che lo slave è attivo e in esecuzione e si ha verificato che tutto si stia replicando correttamente , puoi metti in pausa lo schiavo . crea l'indice sul salve. al termine della creazione dell'indice, riprendere lo slave. questo prenderà lo schiavo fino al padrone. sul master, utilizzare FLUSH TABLE WITH READ LOCK. controllare lo stato dello slave per assicurarsi che la posizione del registro sul master e lo slave corrispondano. in tal caso, chiudere lo slave e copiare i file per quella tabella sul master.

Altri suggerimenti

Sono con Randy. Ci siamo trovati in una situazione simile e in MySQL ci sono due modi per ottenere qualcosa del genere:

  1. Elimina il server mentre è in esecuzione. Questo è probabilmente quello che farai. È semplice, è facile, funziona. Tempo di fare? Forse mezz'ora / 45 minuti, a seconda della larghezza di banda del disco. Vedi sotto.

  2. Crea una nuova tabella con il nuovo indice, copia tutti i dati, metti in pausa il server elimina la prima tabella, modifica la nuova con il vecchio nome, avvia il server. I tempi di inattività? 10 minuti, forse, ma davvero complicato.

L'opzione due funziona e ti fa risparmiare i tempi di inattività della creazione dell'indice (se impiega molto tempo). Ma occupa più spazio, è più complicato (poiché devi gestire i nuovi record inseriti dalla tabella principale e probabilmente bloccherà MyISAM durante la copia dei dati. L'eliminazione di una tabella richiederà del tempo, modificando la tabella in il nuovo nome richiederà del tempo. È davvero complicato. Se avessi una tabella da 2 TB questo potrebbe essere utile, ma per il 27G è probabilmente eccessivo.

Hai un secondo server che è vicino nelle specifiche al tuo server di produzione? Carica il tuo backup più recente ed esegui l'indice lì, in modo da sapere quanto tempo impiegherà ad aggiungere. Quindi pianificare i tempi di inattività.

InnoDB è meglio su molte cose, ma i nuovi indici bloccano ancora la tabella. Le abilità che MSSQL (e penso PostgreSQL) debbano fare quel tipo di cose senza bloccare sarebbero grandi.

Trova la finestra a basso utilizzo e porta offline l'applicazione durante la creazione dell'indice. Dal momento che non hai la replica o un multimaster o altro, dovrai solo mordere il proiettile su questo. Ci vediamo all'una. : -)

Non puoi fare molto con un server qui.

Se copi la tabella e esegui una corsa a secco, almeno scoprirai quanto tempo impiegherà senza bloccare la tabella live, quindi puoi pianificare alcuni tempi di manutenzione se necessario, o decidere se puoi basta premere il pulsante e lasciare gli utenti in sospeso per un paio di minuti :)

O programmalo per un momento tranquillo ...

at 04:00 /usr/bin/mysql -uXXX -pXXX -e 'alter table mytable add key(col1, col2)'
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top