2010-10-11 26 views
6

Tengo un problema con InnoDB (la tabla inicialmente era MyISAM, pero la convertí a InndoB hace un tiempo) tabla; Estoy tratando de ejecutar esta consulta:Archivo de clave incorrecto con MySQL

SELECT 
    posts.id, 
    posts.post_title 
FROM 
    rss_posts AS posts 
    INNER JOIN rss_feeds AS feeds ON posts.blog_id=feeds.id 
WHERE 
    feeds.blog_language=1 
ORDER BY 
    posts.post_date_db DESC 
LIMIT 
    10; 

me sale este error:

Query : SELECT posts.id,posts.post_title FROM rss_posts AS posts INNER JOIN vw_rss_feeds AS feeds ON posts.blog_id=feeds.id WHER... 
Error Code : 126 
Incorrect key file for table '/tmp/#sql_7375_0.MYI'; try to repair it 

No puedo ejecutar una reparación en las tablas involucradas; sin embargo, he ejecutado un CHECK en ambas tablas & que parecen estar bien. También he hecho un OPTIMIZAR en ambas mesas & también reconstruyó las tablas haciendo el siguiente ..

INSERT INTO new_table SELECT * FROM old_table; 

entonces a llamarse la nueva tabla al antiguo nombre de la tabla ..... pero todavía estoy teniendo ese problema .

Para tratar & averiguar lo que estaba causando la mesa me quita el código de la consulta que hace referencia la tabla "rss_feeds" .... por lo que ahora la consulta se parece a esto ..

SELECT 
    posts.id, 
    posts.post_title 
FROM 
    rss_posts AS posts 
ORDER BY 
    posts.post_date_db DESC 
LIMIT 
    10; 

que funcionó.

El problema es algo con la tabla rss_feeds.

Así que pensé que podría convertir la tabla de nuevo a MyISAM & ejecutar una reparación & continuación, convertir de nuevo a InnoDB ..... esto funcionó temporalmente, se volvió a la normalidad .... entonces se rompió de nuevo .. ... lo reparó otra vez, rompió nuevamente ... ahora la reparación no parece funcionar en absoluto.

Ahora, lo sé, lo sé ...... He buscado en Google este problema ya ...... me di cuenta de que la mayoría de las veces el problema es que el espacio no nos lo suficiente en el MySQL temp directory .... pero ya tengo el host para cambiar el directorio temporal a algo con MUCHO más espacio & el problema aún persiste.

Estoy pensando que el HOST es el culpable & TODAVÍA es un problema con el directorio temporal; ¿por qué? Porque después de que volviera a funcionar empecé a agregar datos a la tabla rss_posts de nuevo &, por lo tanto, el JOIN obtendría MAYOR &. MySQL se quedaría sin espacio ... ¿qué opinas?

Respuesta

5

Lo que está sucediendo aquí es que MySQL está haciendo el ORDER BY creando una tabla temporal a partir de la unión de las dos tablas. La tabla temporal es demasiado grande para caber en la memoria, por lo que MySQL crea un archivo temporal.

Hay algunas cosas que evitarían que esto funcione correctamente. El espacio en disco sin procesar es uno. ulimit es otro. Si se está hospedando, pueden tener una cuota en el uso del disco (además de ulimit).

Sugeriría agregar una cláusula restrictiva a su consulta. Actualmente, carga la totalidad de ambos rss_posts y rss_feeds en la tabla temporal para la clasificación. Si solo quieres los 10 más recientes, hay muchos más datos de los que realmente necesitas.

SELECT posts.id, posts.post_title 
FROM rss_posts AS posts INNER JOIN rss_feeds AS feeds ON posts.blog_id=feeds.id 
WHERE feeds.blog_language=1 
AND posts.post_data_db > (now - interval 30 day); 
ORDER BY posts.post_date_db DESC LIMIT 10; 
+1

Gracias - definitivamente hay suficiente espacio en disco disponible; básicamente, el anfitrión dijo que esto .. "La '/ var/tmp' partición utiliza el mismo espacio que '/', y su información de uso es actualmente de la siguiente manera; /dev/sda3 442 g 289 g 32% 130G/ Entonces no deberías ver ningún problema con el espacio ". Aunque me pregunto si quizás el/var/tmp/dir está restringido por sí mismo? Si eso es posible. Entonces, ¿esa pregunta que tiene allí - que básicamente solo recibe las últimas 10 publicaciones de los últimos 30 días? – Brett

+0

Correcto. Puede parametrizar el "30" para hacerlo un poco más amplio. Pero independientemente del espacio disponible en el disco, si está ordenando constantemente las dos tablas para 10 filas, se encontrará con problemas de escalado y rendimiento. –

+0

Sí ... hace un buen punto. ¡Muchas gracias! – Brett

2

Parece que la cuota de disco que tiene para tablas temporales es demasiado pequeña.

BTW: No hay necesidad de ejecutar REPAIR en tablas InnoDB, ya que todo el mantenimiento lo realiza el propio motor de almacenamiento. Tampoco tienen un archivo de clave para corromperse.

+0

Genial, gracias por la información útil. :) – Brett

1

Observe que el archivo .MYI con el que tiene un problema es para una tabla temporal. Cuando ejecuta consultas que implican combinaciones, MySql necesita usar espacio temporal para fusionar los datos internamente. Lo más probable es que se esté quedando sin espacio en su directorio tmp.

Intente aumentar la cantidad de espacio asignado a tmpdir o edite el archivo my.cnf para que tmpdir señale a un lugar con suficiente espacio (no olvide otorgarle permisos).

Cuestiones relacionadas