MySQL InnoDB no libera espacio en disco después de eliminar filas de datos de la tabla


Tengo una tabla MySQL usando el motor de almacenamiento InnoDB; contiene aproximadamente 2M filas de datos. Cuando eliminé filas de datos de la tabla, no liberó espacio en disco asignado. Tampoco se redujo el tamaño del archivo ibdata1 después de ejecutar el comando optimize table.

¿ Hay alguna forma de recuperar espacio en disco desde MySQL?

Estoy en una mala situación; esta aplicación se está ejecutando en unos 50 lugares diferentes y ahora el problema de poco espacio en disco está apareciendo en casi todos ellos.

Author: jeteon, 2009-08-13

5 answers

MySQL no reduce el tamaño de ibdata1. Nunca. Incluso si utiliza optimize table para liberar el espacio utilizado de los registros eliminados, lo reutilizará más tarde.

Una alternativa es configurar el servidor para usar innodb_file_per_table, pero esto requerirá una copia de seguridad, soltar la base de datos y restaurar. El lado positivo es que el .el archivo ibd para la tabla se reduce después de un optimize table.

 122
Author: Leonel Martins,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-08-16 14:52:33

Acabo de tener el mismo problema.

Lo que sucede es que, incluso si suelta la base de datos, innodb todavía no liberará espacio en disco. Tuve que exportar, detener mysql, eliminar los archivos manualmente, iniciar mysql, crear bases de datos y usuarios, y luego importar. Gracias a Dios que solo tenía 200MB de filas, pero ahorró 250 GB de archivo innodb.

Falla por diseño.

 31
Author: gilm,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-12-25 20:55:02

Si no utiliza innodb_file_per_table, recuperar espacio en disco es posible, pero bastante tedioso, y requiere una cantidad significativa de tiempo de inactividad.

El Cómo es bastante profundo, pero pegué la parte relevante a continuación.

Asegúrese de conservar también una copia de su esquema en su volcado.

Actualmente, no puede eliminar un archivo de datos del espacio de tabla del sistema. Para reducir el tamaño del espacio de tabla del sistema, utilice este procedimiento:

Use mysqldump para volcar todas tus mesas InnoDB.

Detenga el servidor.

Elimine todos los archivos de espacio de tabla existentes, incluidos los ib_log archivos. Si desea mantener una copia de seguridad de la información, luego copie todos los archivos ib * a otra ubicación antes de la eliminación los archivos en su instalación de MySQL.

Eliminar cualquiera .archivos frm para tablas InnoDB.

Configure un nuevo espacio de tabla.

Reinicie el servidor.

Importar el volcado file.

 21
Author: FlipMcF,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-02-03 19:02:41

Otra forma de resolver el problema de la recuperación de espacio es crear múltiples particiones dentro de particiones basadas en rango de tabla, basadas en Valores y simplemente soltar/truncar la partición para recuperar el espacio, lo que liberará el espacio utilizado por todos los datos almacenados en la partición en particular.

Habrá algunos cambios necesarios en el esquema de tabla cuando introduzca la partición para su tabla, como Claves únicas, Índices para incluir la columna de partición, etc.

 0
Author: Anand Immannavar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-02-10 07:22:00

Hay varias formas de recuperar el espacio en disco después de eliminar datos de la tabla para MySQL Inodb engine

Si no utiliza innodb_file_per_table desde el principio, volcando todos los datos, eliminar todos los archivos, recrear la base de datos e importar datos de nuevo es la única manera (compruebe las respuestas de FlipMcF arriba )

Si está utilizando innodb_file_per_table, puede probar

  1. Si puede eliminar todos los datos, el comando truncate eliminará los datos y recuperará el espacio en disco por usted.
  2. Comando Alter table caerá y recreará la tabla para que pueda recuperar el espacio en disco. Por lo tanto, después de eliminar datos, ejecute alter table that change nothing to release hardisk (ie: table TBL_A has charset uf8, after delete data run ALTER TABLE TBL_A charset utf8 -> este comando no cambia nada de su tabla pero hace que mysql vuelva a crear su tabla y recupere diskspace
  3. Crea TBL_B como TBL_A . Inserte los datos seleccionados que desea mantener de TBL_A en TBL_B. Suelte TBL_A y cambie el nombre de TBL_B a TBL_A. De esta manera es muy efectivo si TBL_A y los datos que se necesitan para eliminar es grande (comando eliminar en MySQL innodb es muy mal rendimiento)
 -1
Author: Khánh Bùi Đức,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-04-25 17:07:27