2010-03-11 15 views
28

Sto tentando di eseguire una query piuttosto grande che dovrebbe essere eseguita ogni notte per popolare una tabella. Ricevo un errore che dice Incorrect key file for table '/var/tmp/#sql_201e_0.MYI'; try to repair it ma il motore di archiviazione che sto usando (qualunque sia l'impostazione predefinita, suppongo?) Non supporta la riparazione delle tabelle.Come si risolve un errore "File chiave errato" di MySQL quando non è possibile riparare la tabella?

come posso risolvere questo problema in modo che possa eseguire la query?

+0

il tmp la cartella ha un limite di solito 2GB, prova df -h per vederlo –

risposta

1

Il motore di archiviazione (MyISAM) SE tavola di supporto riparazione. Dovresti essere in grado di ripararlo.

Se la riparazione non riesce, è un segno che la tabella è molto corrotta, non è possibile scegliere di ripristinarla dai backup.

Se si dispone di altri sistemi (ad esempio, non-produzione con le stesse versioni software e schema) con una tabella identica, è possibile correggerli con alcuni hackery (copiando i file MYI, seguiti da una riparazione).

In sostanza, il trucco è evitare di ottenere tavoli rotti in primo luogo. Ciò significa chiudere sempre in modo pulito il tuo db, senza averlo mai fatto crash e non aver mai avuto problemi di hardware o di alimentazione. In pratica, questo non è molto probabile, quindi se la durata è importante, puoi prendere in considerazione un motore di memorizzazione più sicuro per gli incidenti.

8

La query sta generando un set di risultati talmente grande da dover creare una tabella temporanea per contenere alcuni risultati o un prodotto intermedio utilizzato nella generazione del risultato.

La tabella temporanea viene generata in/var/tmp. Sembra che questa tabella temporanea sia stata danneggiata. Forse il dispositivo su cui si stava costruendo il tavolo temporaneo era a corto di spazio. Tuttavia, di solito questo normalmente si traduce in un errore "fuori dallo spazio". Forse qualcos'altro in esecuzione sulla tua macchina ha danneggiato la tabella temporanea.

Provare a rielaborare la query per utilizzare meno spazio oppure provare a riconfigurare il database in modo da utilizzare una partizione più grande o più sicura per le tabelle temporanee.

MySQL Manual - B.5.4.4. Where MySQL Stores Temporary Files

40

È necessario modificare la posizione della cartella temporanea di MySQL che è "/ tmp" nella maggior parte dei casi in una posizione con uno spazio su disco più grande. Cambialo nel file di configurazione di MySQL.

Fondamentalmente il server sta esaurendo lo spazio su disco in cui si trova/tmp.

+0

Questo ha corretto il mio errore, grazie per il suggerimento! – Mazrick

+0

Ho avuto questo problema dopo aver cambiato la posizione della directory dei dati mysql, perché il file fs era fuori dallo spazio .. quindi solo un 'sudo rm -rf/var/lib/mysql/ibdata1' lo ha fatto per me. Grazie!!! – mimoralea

+0

tmpdir =/mnt/mysql_tmp lo spazio 1,2 T ha ancora errori? perché ? [root @ ADM-PROD-PERCONA-SL-RP-03 ~] # df -h Dimensione del filesystem utilizzato Uso disponibile% montato su /dev/xvda1 7.8G 1.6G 6.1G 21%/ devtmpfs 61G 80K 61G 1%/dev tmpfs 61G 0 61G 0%/dev/shm /dev/md0 3.0T 1.9T 1.2T 62%/mnt –

27

È necessario eseguire questo comando dal prompt di MySQL:

REPAIR TABLE tbl_name USE_FRM; 

Da MySQL's documentation on the Repair command:

L'opzione USE_FRM è disponibile per l'uso, se il file .MYI indice è mancante o se la sua intestazione è corrotta. Questa opzione dice a MySQL di non fidarsi delle informazioni nell'intestazione del file .MYI e di ricrearlo usando le informazioni dal file .frm. Questo tipo di riparazione non può essere eseguita con myisamchk.

+1

Grazie, sistemato il mio tavolo. Ma in realtà dovrebbe essere 'RIPARAZIONE TABELLA tbl_name USE_FRM' –

+1

Questo ha funzionato anche per me –

+2

Questo ha funzionato anche per me - un risparmiatore di vita per un sistema di produzione !! –

0

Applicare il set di caratteri e le regole di confronto appropriati a database, tabella e colonne/campi.

I crea il database e la struttura della tabella utilizzando query SQL da un server a un altro. si crea la struttura del database come segue:

  1. database con charset di "utf8", raccolta di "utf8_general_ci"
  2. tavoli con charset di "utf8" e collazione di "utf8_bin".
  3. colonne/campi della tabella hanno il set di caratteri "utf8" e le regole di confronto di "utf8_bin".

Modificare le regole di confronto di tabella e colonna in utf8_general_ci e risolve l'errore.

0

Nel mio caso, c'era un problema di spazio su disco. Ho cancellato alcuni file di guerra indesiderati dal mio server e ha funzionato dopo.

0

TABELLA RIPARAZIONE tbl_name USE_FRM;

Comando eseguito solo quando il tipo di MySQL 'Storage Engine' dovrebbe essere 'MyISAM'

Spero che questo aiuti

+0

Questo non sembra aggiungere nulla di nuovo a [una risposta esistente e potenziata] (https://stackoverflow.com/a/7081976/4453460). – lfurini

0

Simple "riparare la tabella" da PHPMYADMIN risolto questo problema per me.

  1. andare a phpMyAdmin
  2. aperta tabella problematica
  3. andare alla scheda Operazioni (nella mia versione di PMA)
  4. in fondo troverete "Repair tabella" collegamento
Problemi correlati