mostrar imagenes imagen guardar guardadas extraer ejemplo datos con archivos mysql sql row innodb

mysql - guardar - mostrar imagenes guardadas en base de datos php



Cómo configurar MySQL 5.6 LONGBLOB para datos binarios grandes (1)

Antes de hacer mi pregunta, un pequeño trasfondo: estoy haciendo la exportación / importación de datos usando MySQL Workbench 6.1 de una base de datos MySQL 5.5 de una máquina a una 5.6 en otra. ambas máquinas son ubuntu una de 32 bits la otra de 64 bits.

No arrojo los datos, pero cuando intento cargarlo obtengo el:

ERROR 1118 (42000) en la línea 1807: Tamaño de fila demasiado grande (> 8126). Cambiar algunas columnas a TEXT o BLOB o usar ROW_FORMAT = DYNAMIC o ROW_FORMAT = COMPRESSED puede ayudar. En el formato de fila actual, el prefijo BLOB de 768 bytes se almacena en línea.

Aquí está la tabla de crear:

CREATE TABLE `file_content` ( `fileid` bigint(20) NOT NULL, `content` LONGBLOB NOT NULL, PRIMARY KEY (`fileid`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Tengo la siguiente configuración relevante de my.cnf ...

max_allowed_packet = 1G
innodb_file_per_table = 1
innodb_file_format = Barracuda

Paso mucho tiempo buscando en Google tratando de descubrir cuál es el problema. Por cierto, si elimino la clave primaria (no hay problema aquí, pero otra tabla que tiene una clave foránea en esta tabla se queja.

Por suerte, tengo acceso ssh a la caja para poder ver mysqldb.log. ¿Por qué me parece que hay realmente interesante ...

2014-08-12 20:42:12 25246 [ERROR] InnoDB: la longitud total de los datos de blob (14179167) es mayor que el 10% del tamaño del archivo de registro de rehacer (3072). Por favor aumente innodb_log_file_size.

Así que aumentar el tamaño del archivo de registro de rehacer a 10x tamaño LONGBLOB solucionó mi problema. Sin embargo, eso significa que para insertar un 1G LONGBLOB (ese es el máximo real debido al tamaño del paquete) necesitaré un 10G innodb_log_file_size.

¿Alguien puede explicar cómo el "error de tamaño de registro de rehacer" se convierte en un error de "tamaño de fila demasiado grande (> 8126)"?

Por cierto, no tengo control sobre la estructura de este archivo db así que no "¿por qué está almacenando blobs grandes en la base de datos".

TIA


La razón de este problema es un cambio en MySQL 5.6.20 como se podría leer en el registro de cambios:

Como resultado del límite de escritura de redo BLOB introducida para MySQL 5.6, la configuración innodb_log_file_size debe ser 10 veces mayor que el tamaño de datos BLOB más grande encontrado en las filas de sus tablas más la longitud de otros campos de longitud variable (VARCHAR, VARBINARY y Campos de tipo TEXTO). No se requiere ninguna acción si su configuración innodb_log_file_size ya es lo suficientemente grande o sus tablas no contienen datos BLOB.

Para resolver su problema, debe aumentar el valor de la opción innodb_log_file_size en su my.ini debajo de la sección [mysqld] . Su valor predeterminado es 48M . Poniéndolo en

[mysqld] innodb_log_file_size=256M

ayudado en mi caso.

Tenga cuidado al cambiar el valor de innodb_log_file_size que lo haga de forma segura :

  1. Debe cerrar el servidor de manera limpia y normal.
  2. Alejarse (no eliminar) los archivos de registro, que se denominan ib_logfile0, ib_logfile1, y así sucesivamente.
  3. Verifique el registro de errores para asegurarse de que no haya problemas para apagarlo.
  4. Luego, reinicie el servidor y observe cuidadosamente el resultado del registro de errores. Debería ver los mensajes de impresión de InnoDB que dicen que los archivos de registro no existen. Creará nuevos y luego comenzará.
  5. En este punto, puede verificar que InnoDB esté funcionando, y luego puede eliminar los archivos de registro anteriores.