Introduzione:
Questo post è una copia del meraviglioso post seguente:
https://blackbird.si/mysql-corrupted-innodb-tables-recovery-step-by-step-guide/https://blackbird .si/mysql-corrupted-innodb-tables-recovery-step-by-step-guide/
Ecco alcuni importanti esercizi da esso:
MySQL – Recupero di tabelle InnoDB danneggiate – Guida passo passo
Pubblicato in Database di Alen Krmelj il 19 marzo 2013, 5-6 minuti
Le tabelle InnoDB non vengono danneggiate facilmente, ma quando lo fanno, di solito accade a causa di problemi hardware, interruzioni di corrente o bug di MySQL. Ti lascia con pagine danneggiate nello spazio tabella di InnoDB e il ripristino potrebbe essere un problema. Quando il tuo MySQL si arresta correttamente in modo anomalo e non vuole tornare indietro, potresti vedere il loop di un errore simile:
InnoDB: Assertion failure in thread 1129654592 in file ibuf0ibuf.c line 4231 InnoDB: Failing assertion: page_get_n_recs(page) > 1 InnoDB: We intentionally generate a memory trap. InnoDB: Submit a detailed bug report to http://bugs.mysql.com. InnoDB: If you get repeated assertion failures or crashes, even InnoDB: immediately after the mysqld startup, there may be InnoDB: corruption in the InnoDB tablespace. Please refer to InnoDB: http://dev.mysql.com/doc/refman/5.5/en/forcing-innodb-recovery.html InnoDB: about forcing recovery. mysqld got signal 6 ; This could be because you hit a bug. It is also possible that this binary or one of the libraries it was linked against is corrupt, improperly built, or misconfigured. This error can also be caused by malfunctioning hardware. We will try our best to scrape up some info that will hopefully help diagnose the problem, but since we have already crashed, something is definitely wrong and this may fail. ... some backtrace ... The manual page at http://dev.mysql.com/doc/mysql/en/crashing.html contains information that should help you find out what is causing the crash. mysqld_safe Number of processes running now: 0 mysqld_safe mysqld restarted
Recupero da tabelle InnoDB danneggiate
Passaggio 1:apri il database in modalità di ripristino
Dovresti abbassare il tuo database. Spegnilo nel caso in cui sia ancora in esecuzione e spamming questi messaggi nel tuo registro. Come ultima risorsa, potresti anche interrompere il processo. Per ripristinare il database dovrai avviarlo in modalità di ripristino, con innodb_force_recovery
. Dovresti sapere che questa modalità di ripristino rende i tuoi database di sola lettura. Gli utenti che si collegano ad esso non possono aggiornare, inserire o alterare in altro modo i dati esistenti. Per evitare che il tuo MySQL venga martellato nel momento in cui torna, ti suggerisco di cambiare anche la porta del server MySQL da 3306 a qualcosa di casuale. Aggiungi innodb_force_recovery=1
al tuo my.cnf
Nel caso in cui il tuo server non voglia tornare, puoi aumentare ulteriormente questo numero da 1 a 6, controlla il manuale di MySQL per vedere quali sono le differenze.
Assicurati di controllare i tuoi log MySQL e se si verificano in loop con qualcosa del tipo:
InnoDB: Waiting for the background threads to start
Dovresti anche aggiungere innodb_purge_threads=0
al tuo my.cnf
.
Quindi tutti insieme per ripristinare il database, ho dovuto aggiungere questi 3 parametri in my.cnf
:
port = 8881 innodb_force_recovery=3 innodb_purge_threads=0
Fase 2:verifica quali tabelle sono danneggiate e crea un elenco
Ora il tuo database è di nuovo attivo e funzionante, ma in modalità di ripristino. Non è possibile modificare i database/tabelle. Se lo provi, riceverai un errore:
Got error -1 from storage engine
Dobbiamo scoprire quali tabelle sono state danneggiate. Per fare ciò, eseguiamo:mysqlcheck --all-databases
Controlla le righe in cui dice che la tabella è danneggiata. Annota tutte le tabelle/database che ti hanno restituito un errore. Dovrai mysqldump
in modalità di ripristino e reimportarli dopo il riavvio nella normale modalità MySQL. Lascia che ti ricordi anche che innochecksum
command non mi ha aiutato a scoprire quali tabelle sono danneggiate, quindi non preoccuparti.
Fase 3:esegui il backup e rilascia le tabelle danneggiate
Una volta ottenuto l'elenco delle tabelle danneggiate, dovresti eseguirne il mysqldump nei propri file .sql, in questo modo avrai il backup per la reimportazione. Nel caso ti chiedessi come scaricare solo una tabella nel database:
mysqldump my_database tabella> database.table.sql
Dopo aver eseguito il backup, elimina le tabelle danneggiate eseguendo:drop table database.table; dalla tua shell MySQL. Ora hai ripulito il tuo database MySQL, quindi è ora di riavviarlo senza modalità di ripristino.
Fase 4:riavvia MySQL in modalità normale
Quando non abbiamo più tabelle danneggiate nel nostro database, dovremmo rimuovere le impostazioni my.cnf che abbiamo aggiunto nel passaggio 1. Non rimuovere ancora l'impostazione della porta, perché nel tuo database mancano ancora le tabelle di cui hai eseguito il backup e di cui hai bisogno da reimportare. Riavvia il tuo MySQL.
Passaggio 5:importa il backup .sql
Importa ogni tabella .sql scaricata nel rispettivo database. Per farlo dalla CLI:
mysql database < database.table.sql
Fase 6:cambia porto e prendi una birra
Una volta terminata l'importazione delle tabelle, sei libero di modificare l'impostazione della porta nel tuo my.cnf
. Ovviamente riavvia MySQL in seguito. Dovrebbe tornare e iniziare a funzionare proprio come prima dell'arresto anomalo. Prendi una birra e fai clic in cima a questo post, per farmi sapere che questo articolo ti ha aiutato a risolvere il tuo problema.