GNU/Linux >> Linux Esercitazione >  >> Linux

Riparazione di database MySQL InnoDB

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.


Linux
  1. MySQL:conversione in dati per tabella per InnoDB

  2. MySQL Incremental Backup - Backup e ripristino point-in-time di database InnoDB e MyIsam

  3. L'aggiornamento di MariaDB a v10.2.35 o v10.3.26 mostra i database MySQL come offline in cPanel.

  4. Impostazioni di connessione per database MySQL

  5. Lavorare con i database MySQL cPanel

Come importare ed esportare database MySQL in Linux

Come mostrare un elenco di tutti i database in MySQL

Come eseguire il backup di tutti i database MySQL dalla riga di comando

Come mostrare l'elenco di tutti i database su MySQL

Come creare e modificare database MySQL in cPanel

Come risolvere InnoDB:Impossibile bloccare l'errore ./ibdata1 mysql?