En un servidor Debian Linux, que aloja muchos sitios web PHP / MySQL (galerías de fotos), a veces tengo "muchos" archivos como /tmp/#sql_6405_58.MYD
.
Por ejemplo hoy:
[2012-12-15 15:18:11] /tmp/#sql_6405_6.MYD : 88MB
[2012-12-15 15:18:11] /tmp/#sql_6405_3.MYD : 22MB
[2012-12-15 15:18:11] /tmp/#sql_6405_4.MYD : 138MB
[2012-12-15 15:18:11] /tmp/#sql_6405_10.MYD : 88MB
...
[2012-12-15 15:18:11] /tmp/#sql_6405_9.MYD : 15MB
[2012-12-15 15:18:11] /tmp/#sql_6405_65.MYD : 49MB
[2012-12-15 15:18:11] /tmp/#sql_6405_44.MYD : 69MB
(59 archivos al mismo tiempo, durante más de 6 GB ... sí, monitorizo archivos grandes en / tmp)
Desafortunadamente, /tmp
está en la misma partición que /
y temporalmente rompe el servidor web, porque /
está lleno, supongo. Luego los archivos desaparecen y el servidor vuelve a la normalidad.
Todos los nombres de archivo siguen el #sql_6405_*.MYD
patrón. Me gustaría entender qué operación de MySQL implica tantos archivos temporales. Tengo aproximadamente 2000 bases de datos en este servidor. ¿Es posible saber qué base de datos se refiere?
mysql
myisam
temporary-tables
RolandoMySQLDBA
fuente
fuente
filesort
, y 6405 es el PID de mysql para mantener separados los archivos temporales de diferentes instancias de servidor.Respuestas:
Hay algunas opciones que pueden hacer que las tablas temporales se materialicen como tablas MyISAM o pueden configurarse para retrasarlo. Tenga en cuenta que para las tablas temporales basados en disco, no hay
.frm
archivos, pero sólo.MYD
y.MYI
archivos (por supuesto. .MYI el archivo no se usa nunca, ya que es imposible índice de una tabla de temperatura interna).Aquí están las opciones:
También debe considerar la documentación de MySQL sobre el uso interno de la tabla temporal
Las situaciones en las que se hacen tablas temporales en memoria son
Cuando una tabla temporal en memoria excedió el mínimo de (tmp_table_size o max_heap_table_size), mysqld hace lo siguiente:
Las situaciones en las que las tablas temporales en memoria se omiten en favor del disco son
Se requiere cierta diligencia debida para reducir la creación de la tabla temporal en el disco
Si después de dicha diligencia debida, todavía se están formando tablas temporales en el Disco, aquí hay un movimiento desesperado: Mapear la creación de la tabla temporal basada en disco a la memoria.
Aquí hay una manera rápida y sucia de configurar un disco RAM de 16GB usando tmpdir
PASO01) Crear carpeta de disco RAM
STEP02) Añadir esto a
my.cnf
PASO03) Agregue esto a / etc / fstab
PASO04) Recargar / etc / fstab
PASO05)
service mysql restart
Después de esto, todas las tablas temporales que se convierten en MyISAM se escriben en el disco RAM. Esto debería acelerar la creación de la tabla temporal basada en disco.
Darle una oportunidad !!!
fuente
Estas son consultas que se transfieren al disco porque los resultados son demasiado grandes para la memoria.
Cuando finaliza la consulta, el espacio se borra.
No hay forma de hacer coincidir estos archivos temporales definitivamente con las consultas, pero puede obtener pistas para adivinar en SHOW FULL PROCESSLIST; o MOSTRAR ESTADO INNODB; o mirando en su registro de errores si las consultas fallan.
fuente
Cada vez que utilizamos las declaraciones alter en la tabla, crea los archivos de temporay # sql_6405_3.MYD y una vez hecho esto arroja la salida y desaparece.
Alterar las tablas hace que MySQL copie datos completos en archivos temporales # sql.xxx.MYD y realice cambios en los archivos temporales creados, luego suelte los archivos de datos originales tablename.MYD y cambie el nombre de los archivos temporay al nombre de la tabla.
También para algunas consultas de clasificación crea archivos temporales.
Como lo rastreé. Esta cosa pasa.
fuente
Creo que puede encontrar las consultas en cuestión en el registro lento de consultas, ya que las consultas que crean grandes tablas temporales generalmente se ejecutan durante mucho tiempo, así es como eso me ayudó hoy en un servidor donde encontré que la
/tmp
partición está llena debido a un problema similar gran archivo temporal de MySQL, era un archivo 4G, encontré la consulta en el registro lento de consultas e informé la consulta a los desarrolladores y encontraron la corrupción en la consulta y la solucionarán, parece que no hay una instrucción MySQL limitada, por lo que se ejecutó durante mucho tiempo y escribió un archivo temporal 4G y completó la/tmp
partición.Y hay otra forma en que puede encontrar la causa de este gran archivo temporal, es binario, por lo que no puede leerlo directamente, pero descubrí que puede manipular el texto que contiene usando el comando Linux de cadenas como este,
Me aseguré de las palabras de texto que ejecutaba la consulta MySQL y la creé.
fuente