Muchas personas crean múltiples ibdataarchivos con la esperanza de una mejor gestión y rendimiento del espacio en disco, sin embargo, esa creencia es errónea.
Supongamos que tuvieras que agregar innodb_file_per_tablea /etc/my.cnf (my.ini). ¿Puedes entonces ejecutar OPTIMIZE TABLEtodas las tablas de InnoDB?
Buenas noticias : cuando ejecuta OPTIMIZE TABLEcon innodb_file_per_tablehabilitado, esto producirá un .ibdarchivo para esa tabla. Por ejemplo, si tiene una tabla con un mydb.mytabledirectorio de datos /var/lib/mysql, producirá lo siguiente:
/var/lib/mysql/mydb/mytable.frm
/var/lib/mysql/mydb/mytable.ibd
El .ibdcontendrá las páginas de datos y las páginas de índice para esa tabla. Excelente.
Malas noticias : todo lo que ha hecho es extraer las páginas de datos y las páginas de índice de mydb.mytablevivir en ibdata. La entrada del diccionario de datos para cada tabla, incluida mydb.mytable, aún permanece en el diccionario de datos (consulte la representación gráfica de ibdata1 ). ¡NO PUEDE SIMPLEMENTE BORRAR ibdata1EN ESTE PUNTO! Tenga en cuenta que ibdata1no se ha reducido en absoluto.
Limpieza de Infraestructura InnoDB
Para reducir de ibdata1una vez por todas, debe hacer lo siguiente:
Volcar (por ejemplo, con mysqldump) todas las bases de datos en un .sqlarchivo de texto ( SQLData.sqlse usa a continuación)
Descarte todas las bases de datos (excepto mysqly information_schema) CAVEAT : Como precaución, ejecute este script para asegurarse de que tiene todas las concesiones de usuarios en su lugar:
Inicie sesión en mysql y ejecute SET GLOBAL innodb_fast_shutdown = 0;(Esto eliminará por completo todos los cambios transaccionales restantes de ib_logfile0y ib_logfile1)
Apagar MySQL
Agregue las siguientes líneas a /etc/my.cnf(o my.inien Windows)
(Nota al margen: Sea cual sea su juego innodb_buffer_pool_size, asegúrese de que innodb_log_file_sizesea el 25% de innodb_buffer_pool_size.
Además: innodb_flush_method=O_DIRECTno está disponible en Windows)
Eliminar ibdata*y ib_logfile*, opcionalmente, puede eliminar todas las carpetas /var/lib/mysql, excepto /var/lib/mysql/mysql.
Inicio de MySQL (Esto volverá a crear ibdata1[10MB por defecto] y ib_logfile0y ib_logfile1al 1G cada uno).
Importar SQLData.sql
Ahora, ibdata1seguirá creciendo pero solo contendrá metadatos de tabla porque cada tabla InnoDB existirá fuera de ibdata1. ibdata1ya no contendrá datos e índices de InnoDB para otras tablas.
Por ejemplo, suponga que tiene una tabla InnoDB llamada mydb.mytable. Si observa /var/lib/mysql/mydb, verá dos archivos que representan la tabla:
mytable.frm (Encabezado del motor de almacenamiento)
mytable.ibd (Tabla de datos e índices)
Con la innodb_file_per_tableopción activada /etc/my.cnf, puede ejecutar OPTIMIZE TABLE mydb.mytabley el archivo /var/lib/mysql/mydb/mytable.ibdse reducirá.
Lo he hecho muchas veces en mi carrera como DBA MySQL. De hecho, la primera vez que hice esto, reduje 50GBibdata1 archivo de a solo 500 MB.
Darle una oportunidad. Si tiene más preguntas sobre esto, solo pregunte. Créeme; esto funcionará a corto plazo y a largo plazo.
CONSIDERACIÓN
En el Paso 6, si mysql no puede reiniciarse debido a que el mysqlesquema comienza a caer, vuelva al Paso 2. Realizó la copia física del mysqlesquema. Puede restaurarlo de la siguiente manera:
Desde entonces, he escrito publicaciones en el DBA StackExchange sobre el cálculo del tamaño del registro y dónde hice referencia a esos dos artículos de Percona.
Personalmente, seguiría con la regla del 25% para una configuración inicial. Luego, como la carga de trabajo puede determinarse con mayor precisión a lo largo del tiempo en la producción, puede cambiar el tamaño de los registros durante un ciclo de mantenimiento en solo minutos.
También utilicé la opción innodb_file_per_table con gran efecto, al tener 200 bases de datos con 200 tablas cada una en un solo servidor, pude vincular bases de datos de diferencias en diferentes particiones, por lo tanto, utilicé más buffers y husillos de E / S que de otro modo hubieran estado disponibles :)
Dave Rix
2
@SeanDowney BTW recuerda subir innodb_open_tablessi es necesario. El valor predeterminado es 300.
RolandoMySQLDBA
2
@ giorgio79 necesita establecer su inserción masiva en un valor mayor. Este es un buen punto. Agregaré la esencia de su pregunta a mi respuesta.
RolandoMySQLDBA
3
En sistemas de 32 bits, no se permite un valor de 4 Gb para innodb_buffer_pool_size . Mysql comenzará silenciosamente con innodb deshabilitado y las tablas restauradas se cambiarán a myisam. Use un valor un poco más pequeño para arreglarlo.
David
55
Dios bueno. Solo quiero decir que esta es quizás una de las mejores respuestas que he visto en SO Maldición, señor. Me ayudó a encontrar una solución a mi problema cuando recibía un ERROR 2013 (HY000) al importar un dg de 154 g. Gracias por la excelente respuesta!
Josh Brown
4
El motor InnoDB no almacena datos eliminados. A medida que inserta y elimina filas, el espacio no utilizado queda asignado dentro de los archivos de almacenamiento de InnoDB. Con el tiempo, el espacio general no disminuirá, pero con el tiempo el espacio "eliminado y liberado" será reutilizado automáticamente por el servidor DB.
Puede ajustar y administrar aún más el espacio utilizado por el motor a través de una reorganización manual de las tablas. Para hacer esto, voltee los datos en las tablas afectadas usando mysqldump, descarte las tablas, reinicie el servicio mysql y luego vuelva a crear las tablas de los archivos de volcado.
Respuestas:
Aquí hay una respuesta más completa con respecto a InnoDB. Es un proceso un poco largo, pero puede valer la pena.
Manten eso en mente
/var/lib/mysql/ibdata1
es el archivo más ocupado en la infraestructura de InnoDB. Normalmente alberga seis tipos de información:Pictorial Representation of ibdata1
Arquitectura InnoDB
Muchas personas crean múltiples
ibdata
archivos con la esperanza de una mejor gestión y rendimiento del espacio en disco, sin embargo, esa creencia es errónea.Puedo correr
OPTIMIZE TABLE
?Desafortunadamente, ejecutar
OPTIMIZE TABLE
contra una tabla InnoDB almacenada en el archivo de espacio de tabla compartidoibdata1
hace dos cosas:ibdata1
ibdata1
crecer porque los datos contiguos y las páginas de índice se agregan aibdata1
Sin embargo, puede segregar datos de tabla e índices de tabla
ibdata1
y administrarlos de forma independiente.¿Puedo correr
OPTIMIZE TABLE
coninnodb_file_per_table
?Supongamos que tuvieras que agregar
innodb_file_per_table
a/etc/my.cnf (my.ini)
. ¿Puedes entonces ejecutarOPTIMIZE TABLE
todas las tablas de InnoDB?Buenas noticias : cuando ejecuta
OPTIMIZE TABLE
coninnodb_file_per_table
habilitado, esto producirá un.ibd
archivo para esa tabla. Por ejemplo, si tiene una tabla con unmydb.mytable
directorio de datos/var/lib/mysql
, producirá lo siguiente:/var/lib/mysql/mydb/mytable.frm
/var/lib/mysql/mydb/mytable.ibd
El
.ibd
contendrá las páginas de datos y las páginas de índice para esa tabla. Excelente.Malas noticias : todo lo que ha hecho es extraer las páginas de datos y las páginas de índice de
mydb.mytable
vivir enibdata
. La entrada del diccionario de datos para cada tabla, incluidamydb.mytable
, aún permanece en el diccionario de datos (consulte la representación gráfica de ibdata1 ). ¡NO PUEDE SIMPLEMENTE BORRARibdata1
EN ESTE PUNTO! Tenga en cuenta queibdata1
no se ha reducido en absoluto.Limpieza de Infraestructura InnoDB
Para reducir de
ibdata1
una vez por todas, debe hacer lo siguiente:Volcar (por ejemplo, con
mysqldump
) todas las bases de datos en un.sql
archivo de texto (SQLData.sql
se usa a continuación)Descarte todas las bases de datos (excepto
mysql
yinformation_schema
) CAVEAT : Como precaución, ejecute este script para asegurarse de que tiene todas las concesiones de usuarios en su lugar:Inicie sesión en mysql y ejecute
SET GLOBAL innodb_fast_shutdown = 0;
(Esto eliminará por completo todos los cambios transaccionales restantes deib_logfile0
yib_logfile1
)Apagar MySQL
Agregue las siguientes líneas a
/etc/my.cnf
(omy.ini
en Windows)(Nota al margen: Sea cual sea su juego
innodb_buffer_pool_size
, asegúrese de queinnodb_log_file_size
sea el 25% deinnodb_buffer_pool_size
.Además:
innodb_flush_method=O_DIRECT
no está disponible en Windows)Eliminar
ibdata*
yib_logfile*
, opcionalmente, puede eliminar todas las carpetas/var/lib/mysql
, excepto/var/lib/mysql/mysql
.Inicio de MySQL (Esto volverá a crear
ibdata1
[10MB por defecto] yib_logfile0
yib_logfile1
al 1G cada uno).Importar
SQLData.sql
Ahora,
ibdata1
seguirá creciendo pero solo contendrá metadatos de tabla porque cada tabla InnoDB existirá fuera deibdata1
.ibdata1
ya no contendrá datos e índices de InnoDB para otras tablas.Por ejemplo, suponga que tiene una tabla InnoDB llamada
mydb.mytable
. Si observa/var/lib/mysql/mydb
, verá dos archivos que representan la tabla:mytable.frm
(Encabezado del motor de almacenamiento)mytable.ibd
(Tabla de datos e índices)Con la
innodb_file_per_table
opción activada/etc/my.cnf
, puede ejecutarOPTIMIZE TABLE mydb.mytable
y el archivo/var/lib/mysql/mydb/mytable.ibd
se reducirá.Lo he hecho muchas veces en mi carrera como DBA MySQL. De hecho, la primera vez que hice esto, reduje 50GB
ibdata1
archivo de a solo 500 MB.Darle una oportunidad. Si tiene más preguntas sobre esto, solo pregunte. Créeme; esto funcionará a corto plazo y a largo plazo.
CONSIDERACIÓN
En el Paso 6, si mysql no puede reiniciarse debido a que el
mysql
esquema comienza a caer, vuelva al Paso 2. Realizó la copia física delmysql
esquema. Puede restaurarlo de la siguiente manera:Regrese al Paso 6 y continúe
ACTUALIZACIÓN 2013-06-04 11:13 EDT
Con respecto a establecer innodb_log_file_size en un 25% de innodb_buffer_pool_size en el Paso 5, esa regla general es bastante antigua.
De nuevo
July 03, 2006
, Percona tenía un buen artículo sobre por qué elegir un tamaño apropiado de innodb_log_file_size . Más tarde,Nov 21, 2008
Percona siguió con otro artículo sobre cómo calcular el tamaño adecuado en función de la carga de trabajo máxima manteniendo una hora de cambios .Desde entonces, he escrito publicaciones en el DBA StackExchange sobre el cálculo del tamaño del registro y dónde hice referencia a esos dos artículos de Percona.
Aug 27, 2012
: Ajuste adecuado para la tabla InnoDB de 30 GB en el servidor con 48 GB de RAMJan 17, 2013
: MySQL 5.5 - Innodb - innodb_log_file_size superior a 4GB combinados?Personalmente, seguiría con la regla del 25% para una configuración inicial. Luego, como la carga de trabajo puede determinarse con mayor precisión a lo largo del tiempo en la producción, puede cambiar el tamaño de los registros durante un ciclo de mantenimiento en solo minutos.
fuente
innodb_open_tables
si es necesario. El valor predeterminado es 300.El motor InnoDB no almacena datos eliminados. A medida que inserta y elimina filas, el espacio no utilizado queda asignado dentro de los archivos de almacenamiento de InnoDB. Con el tiempo, el espacio general no disminuirá, pero con el tiempo el espacio "eliminado y liberado" será reutilizado automáticamente por el servidor DB.
Puede ajustar y administrar aún más el espacio utilizado por el motor a través de una reorganización manual de las tablas. Para hacer esto, voltee los datos en las tablas afectadas usando mysqldump, descarte las tablas, reinicie el servicio mysql y luego vuelva a crear las tablas de los archivos de volcado.
fuente