2009-08-13 17 views
105

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

¿Hay alguna manera de recuperar espacio en disco de MySQL?

Estoy en una mala situación; esta aplicación se ejecuta en aproximadamente 50 ubicaciones diferentes y ahora aparece un problema de poco espacio en disco en casi todos ellos.

+0

después de ejecutar optimizar comando también, tamaño de archivo ibdata1 no redujo. –

+3

Creo que ese comentario podría ser editado en su mejor respuesta, y luego se borra –

+0

posible duplicado de h ttp: //stackoverflow.com/q/11751792/82114 (pero este estuvo aquí primero) – FlipMcF

Respuesta

115

MySQL no reduce el tamaño de ibdata1. Nunca. Incluso si usa optimize table para liberar el espacio utilizado de los registros eliminados, lo volverá a utilizar más adelante.

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 archivo .ibd para la tabla se reduce después de optimize table.

+4

[MySQL 5.5 documenta sobre el estado del modo de archivo por tabla InnoDB] (http://dev.mysql.com/doc/ refman/5.5/es/innodb-multiple-tablespaces.html) "Para aprovechar las características de [InnoDB file-per-table] para una tabla existente, puede activar la configuración de archivo por tabla y ejecutar' ALTER TABLE t ENGINE = INNODB' en la tabla existente. "Esto implica que puede activar esta característica," convertir "las tablas existentes para usar un archivo InnoDB separado con el comando ALTER TABLE, luego OPTIMIZAR la tabla para reducir su tamaño. Sin embargo, una vez que haya terminado, tendrá que descubrir cómo eliminar el (enorme) archivo fuente InnoDB ... – Josh

+1

Supongo que esto técnicamente responde la pregunta, pero espero que la mayoría de las personas que buscan este tema estén buscando el proceso real para reducir/reclamar el espacio, que esta respuesta no proporciona. – Manachi

+0

@Manachi El proceso es "configurar el servidor para usar innodb_file_per_table", "hacer una copia de seguridad" del servidor, "soltar la (s) base (s) de datos", detener el mysql, eliminar .ibd, iniciar el servidor y restaurar la (s) base (s) de datos. Con MySQL 5.5+ puede usar lo que dijo Josh, y después de cambiar todas las tablas, detenga el servidor, elimine el enorme .ibd y vuelva a iniciarlo. –

28

Acabo de tener el mismo problema yo mismo.

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

Fallo de diseño.

+7

sí, eso es definitivamente un fracaso. – trusktr

+1

aún no ha cambiado :( –

+1

MySql 5.5 tiene el mismo problema: ejecuté "optimizar la tabla" para reducir el uso del disco de una tabla de 28 GB. Probablemente la operación intentó hacer una copia optimizada de la original, y al hacerlo se agotó todo el espacio en la partición. Ahora falló la "tabla de optimización" y me quedé sin espacio en la partición, incluso después de que se me cayó todo el DB ... muy decepcionante. –

20

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

El How To 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 tablespace del sistema. Para disminuir el tamaño del espacio de tablas del sistema, use este procedimiento:

Use mysqldump para volcar todas sus tablas InnoDB.

Detenga el servidor.

Elimina todos los archivos de espacio de tablas existentes, incluidos los archivos ibdata y ib_log. Si desea conservar una copia de seguridad de la información, , copie todos los archivos ib * en otra ubicación antes de eliminar los archivos en su instalación de MySQL.

Elimine cualquier archivo .frm para tablas InnoDB.

Configure un nuevo tablespace.

Reinicia el servidor.

Importe los archivos de volcado.

+0

Gracias por incluir los pasos - afaict el enlace 'cómo hacerlo' ya no contiene esta información – aland

0

Otra manera de resolver el problema de la Reclamación de espacio es decir, crear varias particiones dentro de la tabla - particiones basadas, basados ​​Valor Rango y simplemente dejar/truncar la partición para recuperar el espacio, que dará a conocer el espacio utilizado por los datos de toda almacenado en la partición particular.

Habrá algunos cambios necesarios en el esquema de la tabla cuando se introduce el particionado para su mesa como - claves únicas, índices para incluir la columna de partición, etc.

-1

Hay varias maneras para recuperar espacio en disco después de borrar los datos de la tabla de MySQL motor Inodb

Si no se utiliza innodb_file_per_table desde el principio, el vertido de todos los datos, borrar todos los archivos, vuelva a crear bases de datos e importar datos de nuevo es única manera (marque las respuestas de FlipMcF arriba)

Si está utilizando innodb_file_per_table, puede intentar

  1. Si puede eliminar todos los datos, el comando truncar eliminará los datos y recuperará el espacio de disco por usted.
  2. Alter table command soltará y volverá a crear la tabla para que pueda reclamar el espacio de disco. Por lo tanto, después de eliminar datos, ejecute alter table que no cambie nada para liberar hardisk (es decir: la tabla TBL_A tiene charset uf8, después de eliminar los datos ALTER TABLE TBL_A charset utf8 -> este comando no cambia nada de su tabla sino que hace que mysql vuelva a crear su tabla espacio en disco
  3. Crear TBL_B como TBL_A. Insertar datos selectos que desee mantener de TBL_A en TBL_B. Eliminar TBL_A, y renombrar TBL_B a TBL_A. De esta manera es muy efectivo si TBL_A y los datos que se necesitan eliminar son grandes (comando delete en MySQL innodb es muy mala actuación)
Cuestiones relacionadas