Arquitectura InnoDB

Arquitectura InnoDB

Hola uso bacula y una de las tablas está llena:

JobId 8946: Fatal error: sql_create.c:860 Fill File table Query failed: INSERT INTO File (FileIndex, JobId, PathId, FilenameId, LStat, MD5, DeltaSeq) SELECT batch.FileIndex, batch.JobId, Path.PathId, Filename.FilenameId,batch.LStat, batch.MD5, batch.DeltaSeq FROM batch JOIN Path ON (batch.Path = Path.Path) JOIN Filename ON (batch.Name = Filename.Name): ERR=The table 'File' is full

Luego corro:

mysql> show table status from current_bacula like 'File';
+------+--------+---------+------------+----------+----------------+-------------+-----------------+--------------+------------+----------------+---------------------+-------------+------------+-------------------+----------+----------------+---------+
| Name | Engine | Version | Row_format | Rows     | Avg_row_length | Data_length | Max_data_length | Index_length | Data_free  | Auto_increment | Create_time         | Update_time | Check_time | Collation         | Checksum | Create_options | Comment |
+------+--------+---------+------------+----------+----------------+-------------+-----------------+--------------+------------+----------------+---------------------+-------------+------------+-------------------+----------+----------------+---------+
| File | InnoDB |      10 | Compact    | 52153488 |            142 |  7419723776 |               0 |   2593128448 | 2605711360 |      569929045 | 2013-04-15 21:03:59 | NULL        | NULL       | latin1_swedish_ci |     NULL |                |         |
+------+--------+---------+------------+----------+----------------+-------------+-----------------+--------------+------------+----------------+---------------------+-------------+------------+-------------------+----------+----------------+---------+
1 row in set (0.31 sec)

El archivo my.cnf tiene:

innodb_data_file_path = ibdata1:128M;ibdata2:50M:autoextend:max:12800M

Según tengo entendido el comando:

ALTER TABLE tbl_name MAX_ROWS=1000000000 AVG_ROW_LENGTH=nnn;

Funciona solo para el motor MyISAM, ¿no? (Por favor corrígeme si estoy equivocado)

Entonces mi pregunta es: ¿Puedo modificarsoloel autotextend:max por ejemplo, algo como esto:

innodb_data_file_path = ibdata1:128M;ibdata2:50M:autoextend:max:76800M

¿Debo realizar otra acción además de reiniciar el servicio? ¿es seguro? Sé que puedo definir otro archivo ibdataN, pero me gustaría afectar lo menos posible a las otras bases de datos que se ejecutan actualmente en el servidor.

¿Qué me recomiendas?

Tengo mysql-5.1.67-1.el6_3.x86_64 en CentOS 6.4

¡Gracias de antemano!

Respuesta1

Podrías iniciar otro archivo ibdata

Sin embargo, antes de hacerlo, necesita saber qué ocupa ibdata1y ibdata2.

  • Datos de la tabla (siinnodb_file_per_tableestá desactivado)
  • Índices de tabla (siinnodb_file_per_tableestá desactivado)
  • Datos MVCC (control de concurrencia multiversionante)
  • Metadatos de tabla
  • Segmentos de reversión
  • Deshacer registros
  • Búfer de escritura doble

Arquitectura InnoDB

Arquitectura InnoDB

Me había ocupado de agregar ibdata3 en el pasado con uno de los clientes de mi antiguo empleador (consulte mi publicación de DBA StackExchange¿Cómo solucionar “La tabla… está llena” con “innodb_file_per_table”?). Era necesario porque ibdata2 alcanzó el límite máximo de 2,196,875,759,616bytes de ext3. No tienes esa situación.

Podrías seguir tu idea.

innodb_data_file_path = ibdata1:128M;ibdata2:50M:autoextend:max:76800M

pero es mejor eliminar el máximo por completo

innodb_data_file_path = ibdata1:128M;ibdata2:50M:autoextend

ADVERTENCIA

La razón por la que te quedaste sin espacio tiene que ver con los registros de deshacer. El archivo ibdata contiene 1023 registros de deshacer. Esos registros requieren margen de maniobra para funcionar. Sin ese margen de maniobra interno, la información de MVCC no puede contener instantáneas de datos en caso de una reversión. Su margen de maniobra interno es 2605711360o aproximadamente 2.5G, lo cual aparentemente no es suficiente. Con el cliente de mi empleador anterior, tenían 106Gmargen de maniobra yno fue suficiente para ellos.

SUGERENCIA

Si desea dejar todos sus datos dentro ibdata1y ibdata2y cambiar la configuración a

innodb_data_file_path = ibdata1:128M;ibdata2:50M:autoextend:max:76800M

es necesario controlar el margen de maniobra.

Podrías monitorearlo así.

IBDATA_FILESIZE=8187281408
#
# 8187281408 is 7680M + 128M
#
SQL="SELECT SUM(data_length+index_length)"
SQL="${SQL} FROM information_schema.tables WHERE ENGINE='InnoDB'"
IBDATA_DATAINDEX=`mysql -uroot -p... -ANe"${SQL}"`
(( WIGGLE_ROOM = IBDATA_FILESIZE - IBDATA_DATAINDEX )))
echo ${WIGGLE_ROOM}

Cada vez que ejecute esto, sabrá cuánto espacio libre. No necesitará saber qué tabla está involucrada porque cualquier tabla InnoDB tiene el potencial de quejarse de que está llena cuando no hay margen de maniobra (espacio para información de deshacer).

información relacionada