2010-03-04 12 views
5

La documentazione MySQL per REPAIR TABLE afferma cheCosa causerebbe la perdita di dati durante una REPAIR TABLE in MySQL usando MyISAM?

E 'meglio fare un backup di una tabella prima di eseguire una riparazione tavolo funzionamento; in alcune circostanze l'operazione potrebbe causare la perdita di dati. Possibili cause includono ma non sono limitate agli errori del file system.

Mi piacerebbe sapere se ci sono altre cause di perdita di dati oltre agli errori del file system. Qualcuno ha visto accadere questo in natura? Quanto è probabile che la riparazione perderà i dati se non ci sono errori del file system?

La mia situazione specifica è la seguente. Ho il server Sun T5120 con Solaris 10 (SPARC) e sto usando MySQL 5.1.30. Ho una tabella che utilizza il motore MyISAM che a volte si corrompe. Alcune volte che la tabella è stata danneggiata sono state dovute a interruzioni di alimentazione impreviste nel nostro sistema di sviluppo che non aveva un UPS. Non sono sicuro che tutta la corruzione sia dovuta a interruzioni di corrente, quindi potrebbero esserci ulteriori motivi per cui ciò sta accadendo. Quali le cause elencate here.

Vorrei installare una soluzione di riparazione automatica nel caso in cui questi sospetti "ulteriori motivi" si verificano nel sistema di produzione o l'UPS di produzione non funziona. Potrei impostare un cron job per eseguire mysqlcheck --auto-recover come suggerito in this answer, oppure potrei modificare il mio processo che si sta inserendo in quella tabella per eseguire immediatamente il comando REPAIR TABLE EXTENDED quando rileva la corruzione. Tuttavia, entrambi questi approcci utilizzano REPAIR TABLE e sono quindi suscettibili alla perdita di dati.

Potrei eseguire il backup della tabella prima di tentare la riparazione, come suggerisce la documentazione, ma la tabella è piuttosto grande e non sono sicuro che avrò spazio disponibile per il backup. Ho fatto qualche ricerca, ma non ho trovato alcuna spiegazione del perché REPAIR TABLE causerebbe la perdita di dati oltre a quanto menzionato nella documentazione. È quindi probabile che la riparazione perderà i dati quando si dispone di un file system audio o la documentazione è semplicemente cauta?

+0

Qualsiasi risposta che si ottiene oggi potrebbe cessare di essere vera nel prossimo futuro. –

+0

Grazie per l'avviso Heath, ma non mi aspetto di aggiornare la nostra installazione di MySQL dalla versione corrente. Le cose funzionano come sono e la gestione è MOLTO resistente a qualsiasi cambiamento. –

risposta

2

Una delle possibili cause elencate nel manuale MySQL è un bug nel software. Dovresti leggere le note di rilascio/modificare la cronologia dalla tua versione in avanti per vedere se sono stati corretti errori nel codice della tabella di riparazione e leggere anche le note di rilascio per le nuove versioni man mano che escono.

Per motivi di interesse, in che modo il processo che inserisce i dati rileva la corruzione?

Un'ulteriore misura che è possibile adottare per proteggersi dalla perdita di dati consiste nel prendere i backup e abilitare il registro di replica. In caso di errore, è possibile ripristinare dal backup e quindi utilizzare i registri di replica per riportare il database allo stato in cui si trovava quando si è arrestato in modo anomalo.

In definitiva, se si tratta di un sistema di produzione, è davvero necessario selezionare un buon alimentatore e disporre anche di una seconda macchina che funzioni come una replica.

+0

Il processo di inserimento dei dati rileva il danneggiamento perché l'istruzione SQL da inserire non riesce quando la tabella è danneggiata. Il gestore di eccezioni per questo errore potrebbe avviare una tabella di riparazione e quindi continuare l'inserimento al termine. –

+0

Leggerò la cronologia delle versioni. Non so perché non ci ho pensato prima. Grazie! –

+0

Abbiamo usato regolarmente corruzioni MyISAM sulle repliche 4.1.11 in condizioni di carico pesante causate da bug di concorrenza. Abbiamo lavorato su questo fino a quando non abbiamo eseguito l'upgrade disattivando la concorrenza: skip-concurrent-insert, thread_cache_size = 0, flush_time = 60. La soluzione migliore è evitare la corruzione in primo luogo, piuttosto che continuare a eseguire "RIPARAZIONE". – Martin

1

Non è probabile che un REPAIR TABLE corrompe i dati, ma ovviamente non possono garantirlo. Potrebbe essere solo una sfortuna, ma ho l'esperienza che MySQL sta gestendo un file system quasi completo eccezionalmente scarso. Essere a corto di spazio su disco sarebbe una delle situazioni che mi aspetterei di fare REPAIR TABLE per fare cose strane.

+0

Fortunatamente per me, non mi aspetto di essere quasi pieno sullo spazio del disco. Ho limitato il database in modo che ci siano sempre pochi gigabyte liberi sulla partizione che sta usando. Grazie per aver condiviso la tua esperienza! –

0

Ho effettuato una ricerca ragionevolmente estesa degli elenchi MySQL fixed bugs e known issues dalla versione 5.1 e successive e un po 'dalle versioni precedenti. Ho trovato alcuni motivi per cui una riparazione di tabelle potrebbe perdere dati. Nessuno di loro sembra applicarsi alla mia situazione particolare, quindi probabilmente non ho bisogno di preoccuparmi troppo. Speriamo che questa sia un'informazione utile per qualcun altro.


Bug # 338

REPAIR table USE_FRM results in data loss if killed

Influisce Versione: Tutti

questo non è mai fisso, perché in realtà non è un bug. È una limitazione del sistema intrinseca (e del tutto comprensibile).


Bug # 10437

After large delete repair table causes data loss!!!

Influisce Versione: 4.1.11

Si tratta di un record di riparazione troncare una tabella a zero voci dopo ci sono stati un sacco di eliminazioni nella tabella. L'ultima attività su questo bug era nel maggio 2005 e il problema non era riproducibile in 4.1.14, quindi potrebbe essere già stato risolto.


Bug # 29980

5.1.20 ate my table

Influisce Versione: 5.1.20

sembra accadere solo in MySQL 5.1.20 e versioni precedenti, e solo quando si specifica il USE_FRM opzione. Inoltre, la causa della corruzione in quel caso era un aggiornamento di MySQL alla versione 5.1.20, quindi non penso che questo accada probabilmente per me.


Bug # 41385

Crash when attempting to repair a #mysql50# upgraded table with triggers

Influisce Versione: 5.1.30

Questo può accadere quando il nome della tabella contiene "i caratteri estesi" e il nome del il database era preceduto da # mysql50 #, come nel caso di un aggiornamento da MySQL 5.0 a 5.1. La correzione è stata inviata alla versione 5.1.31, quindi questo non dovrebbe essere un problema per me.


Interventi forum di MySQL che non ho trovato nel bug tracker.

Repair on merge table causes data loss

Influisce Versione: 5.0.37

A quanto pare, un tavolo merge con più sotto-tavoli può portare alla perdita di dati se si seleziona dalla tabella merge, mentre una riparazione è in corso su una sotto-tabella.


Tidbits correlati:

I vari discussions e how-tos che ho letto attraverso tutti sembrano indicare che i problemi hardware sono la principale preoccupazione per la corruzione della tabella. Inoltre, come menzionato da Martin in un commento su his answer, è possibile ottenere il danneggiamento a causa di grandi quantità di connessioni simultanee.

Un'altra cosa a cui prestare attenzione è lo spazio libero. Ho visto alcuni commenti che hai bisogno di spazio libero sufficiente per le dimensioni del tavolo che stai riparando per far funzionare la riparazione. Avevo pensato che avrebbe eseguito la riparazione sul posto, e forse le versioni correnti di MySQL lo fanno, ma potrei non essere in grado di evitare di richiedere lo spazio extra per i backup.

Problemi correlati