sql >> Base de Datos >  >> RDS >> Mysql

Ubicación de la tabla temporal de MySQL

MySQL usa un truco que ha sido parte de los sistemas POSIX desde siempre. Abre el archivo temporal e inmediatamente lo desvincula. Por lo tanto, no se puede ver en ninguna lista de directorios. Pero los sistemas POSIX como UNIX y Linux en realidad no deberían eliminar un archivo no vinculado mientras un proceso tiene un identificador de archivo abierto. Entonces, una vez que finalice la consulta que usa la tabla temporal, cerrará el identificador del archivo y luego el sistema operativo eliminará automáticamente el archivo y liberará el almacenamiento que estaba usando.

Esto es generalmente mejor que requerir el código del servidor, recuerde eliminar el archivo temporal cuando haya terminado. También representa la terminación del subproceso o el bloqueo de mysqld. Al menos no dejará archivos temporales obsoletos ensuciando su sistema de archivos.

Puede ver el tamaño de los archivos no vinculados con lsof -s . Te dejaré a ti buscar ejemplos de cómo usar ese comando (Google es tu amigo aquí).

Es muy posible que un archivo temporal use sus 167 GB de espacio libre.

O podría ser que el archivo temporal solo use 8 GB, pero puede tener 20 hilos haciendo la misma consulta al mismo tiempo. He visto que eso suceda una vez.

Pero probablemente sea más probable que tenga un valor de tmp_table_size que está restringiendo el tamaño de la tabla temporal.

Si alcanza el límite, puede aumentar esa opción de configuración, ya sea como una variable de sesión cuando la necesite, o globalmente en my.cnf .

Pero primero intentaría optimizar la consulta. ¿Por qué necesita crear tablas temporales tan grandes? ¿Podría optimizarse para examinar menos filas, o tal vez evitar crear una tabla temporal por completo?