web-dev-qa-db-fra.com

Comment configurer MySQL 5.6 LONGBLOB pour des données binaires volumineuses

Avant de poser ma question un peu d’arrière-plan: je fais l’export/import de données en utilisant MySQL Workbench 6.1 d’une base de données MySQL 5.5 d’une machine à une 5.6 d’une autre. Les deux machines sont ubuntu 32 bits, 64 bits.

Je vide les données sans problème, mais lorsque j'essaie de les charger, je reçois le:

ERREUR 1118 (42000) à la ligne 1807: taille de ligne trop grande (> 8126). Modifier certaines colonnes en TEXT ou BLOB ou utiliser ROW_FORMAT = DYNAMIC ou ROW_FORMAT = COMPRESSED peut aider. Dans le format de ligne actuel, le préfixe BLOB de 768 octets est stocké en ligne.

Voici la table crée:

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

J'ai les paramètres pertinents suivants de my.cnf ...

max_allowed_packet = 1G
innodb_file_per_table = 1
innodb_file_format = Barracuda

Je passe beaucoup de temps sur Google à essayer de comprendre le problème. BTW si je supprime la clé primaire (pas de problème ici, mais une autre table qui a une clé étrangère dans cette table se plaint.

Comme par hasard, j’ai l’accès ssh à la boîte pour pouvoir voir le fichier mysqldb.log. pourquoi je trouve qu'il est vraiment intéressant ...

2014-08-12 20:42:12 25246 [ERREUR] InnoDB: la longueur totale des données d'objet blob (14179167) est supérieure à 10% de la taille du fichier journal de restauration (3072). Veuillez augmenter innodb_log_file_size.

Augmenter la taille du fichier journal à 10 fois la taille de LONGBLOB a donc résolu mon problème. Cependant, cela signifie-t-il que pour insérer un 1G LONGBLOB (c’est le maximum actuel en raison de la taille du paquet), il me faudra un 10G innodb_log_file_size.

Quelqu'un peut-il expliquer comment "une erreur de taille de journal de reprise" se transforme en une erreur de "taille de ligne trop grande (> 8126)".

BTW, je n’ai aucun contrôle sur la structure de cette base de données, donc pas de "pourquoi stockez-vous de gros blobs dans la base de données".

TIA

39
nrapopor

La raison de ce problème est un changement de MySQL 5.6.2 comme on pourrait le lire dans le journal des modifications:

En raison de la limite d'écriture BLOB du journal de rétablissement introduite pour MySQL 5.6, le paramètre innodb_log_file_size doit être 10 fois plus grand que la plus grande taille de données BLOB trouvée dans les lignes de vos tables, plus la longueur d'autres longueurs variables. champs (champs de type VARCHAR, VARBINARY et TEXT). Aucune action n'est requise si votre paramètre innodb_log_file_size est déjà suffisamment grand ou si vos tables ne contiennent aucune donnée BLOB.

Pour résoudre votre problème, vous devez augmenter la valeur de l'option innodb_log_file_size dans votre my.ini sous le [mysqld] section. Sa valeur par défaut est 48M. Le mettre à

[mysqld]
innodb_log_file_size=256M

aidé dans mon cas.

Soyez prudent lorsque vous modifiez la valeur de innodb_log_file_size que vous faites ceci en toute sécurité :

  1. Vous devez arrêter le serveur proprement et normalement.
  2. Éloignez (ne supprimez pas) les fichiers journaux nommés ib_logfile0, ib_logfile1, etc.
  3. Consultez le journal des erreurs pour vous assurer qu'il n'y a pas eu de problème d'arrêt.
  4. Puis redémarrez le serveur et observez attentivement la sortie du journal des erreurs. Vous devriez voir des messages d’impression InnoDB indiquant que les fichiers journaux n’existent pas. Il va en créer de nouveaux et ensuite commencer.
  5. À ce stade, vous pouvez vérifier qu'InnoDB fonctionne et supprimer les anciens fichiers journaux.
78
naitsirch

Pour ceux qui ne peuvent pas trouver cela pour XAMPP:
Au début, je ne trouvais pas le fichier correct pour éditer innodb_log_file_size

Fichier actuel: xampp/mysql/bin/my.ini

1
Ingus

Naviguez simplement dans les emplacements suivants: xampp\mysql\bin\my.ini et essayez de modifier la taille de innodb_log_file_size en 256 Mo

0
Natnael Abate