Ne mysqldump manipuler des données binaires de manière fiable?

j'ai quelques tables dans MySQL 5.6 qui contiennent de grandes données binaires dans certains domaines. Je veux savoir si je peux faire confiance décharges créé par mysqldump et assurez-vous que ces champs binaires ne seront pas corrompus facilement lors du transfert des fichiers dump à l'aide de systèmes tels que FTP, SCP et autres. En outre, dois-je forcer ces systèmes à traiter les fichiers dump comme des transferts binaires au lieu d'ascii?

Merci d'avance pour tout commentaire!

14
demandé sur Francisco Zarabozo 2013-05-15 11:22:33

3 réponses

Oui, vous pouvez faire confiance décharges générées par mysqldump.

Oui, vous devez utiliser les binaires de transfert afin d'éviter toute conversion au cours du transfert. MySQL dump ajoute des commandes de contrôle au dump de sorte que le serveur interprète le fichier dans un encodage spécifique lors de la réimportation. Vous ne voulez pas changer cet encodage.

-3
répondu RandomSeed 2013-05-15 08:32:29

non, ce n'est pas toujours fiable quand vous avez des blobs binaires. Dans ce cas, vous devez utiliser le "--hex-blob" drapeau d'obtenir des résultats corrects.

j'ai un cas où ces appels échouent (importation sur un serveur différent mais les deux fonctionnant avec Centos6 / MariaDB 10):

mysqldump --single-transaction --routines --databases myalarm -uroot -p"PASSWORD" | gzip > /FILENAME.sql.gz
gunzip < FILENAME.sql.gz | mysql -p"PASSWORD" -uroot --comments

il produit un fichier qui échoue silencieusement à importer. Ajouter "-- skip-extended-insert" me donne un fichier qui est beaucoup plus facile à déboguer, et je trouve que cette ligne est générée mais ne peut pas être lue (mais aucune erreur n'est signalée d'importation ou d'exportation):

INSERT INTO `panels` VALUES (1003,1,257126,141,6562,1,88891,'??\\?ŖeV???,NULL);

Notez que la résiliation devis sur les données binaires manque dans l'original.

select hex(packet_key) from panels where id=1003;
--> DE77CF5C075CE002C596176556AAF9ED

la colonne est binaire:

CREATE TABLE `panels` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `enabled` tinyint(1) NOT NULL DEFAULT '1',
  `serial_number` int(10) unsigned NOT NULL,
  `panel_types_id` int(11) NOT NULL,
  `all_panels_id` int(11) NOT NULL,
  `installers_id` int(11) DEFAULT NULL,
  `users_id` int(11) DEFAULT NULL,
  `packet_key` binary(16) NOT NULL,
  `user_deleted` timestamp NULL DEFAULT NULL,
  PRIMARY KEY (`id`),
  ...

donc non, non seulement vous ne pouvez pas nécessairement faire confiance à mysqldump, vous ne pouvez même pas compter sur elle pour signaler une erreur lorsqu'elle se produit.


une mauvaise solution de contournement que j'ai utilisée était de mysqldump exclure les deux tables affligées en ajoutant des options comme cela à la décharge:

--ignore-table=myalarm.panels 

puis ce hack bash script. Essentiellement lancer un SELECT qui produit des valeurs INSERT où les colonnes nulles sont manipulées et la colonne binaire est transformée en UNHEX () call comme so:

(123,45678,UNHEX("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"),"2014-03-17 00:00:00",NULL),

Coller dans votre éditeur de choix pour jouer avec elle si vous en avez besoin.

echo "SET UNIQUE_CHECKS=0;SET FOREIGN_KEY_CHECKS=0;DELETE FROM panels;INSERT INTO panels VALUES " > all.sql
mysql -uroot -p"PASSWORD" databasename -e "SELECT CONCAT('(',id,',', enabled,',', serial_number,',', panel_types_id,',', all_panels_id,',', IFNULL(CONVERT(installers_id,CHAR(20)),'NULL'),',', IFNULL(CONVERT(users_id,CHAR(20)),'NULL'), ',UNHEX(\"',HEX(packet_key),'\"),', IF(ISNULL(user_deleted),'NULL',CONCAT('\"', user_deleted,'\"')),'),') FROM panels" >> all.sql
echo "SET UNIQUE_CHECKS=1;SET FOREIGN_KEY_CHECKS=1;" > all.sql

cela me donne un fichier appelé "tout.sql " qui a besoin de la virgule finale dans L'insertion transformée en un point-virgule, Alors il peut être exécuté comme ci-dessus. J'avais besoin de la "large import buffer" retouche à la fois l'interpréteur de commandes mysql et la ligne de commande pour traiter ce fichier parce qu'il est grand.

mysql ... --max_allowed_packet=1GB

quand j'ai signalé le bug, j'ai finalement été pointé vers le drapeau "--hex-blob", qui fait la même chose que mon contournement, mais d'une manière triviale de mon côté. Ajoutez cette option, les blobs sont jetés comme des hexagones, la fin.

25
répondu Code Abominator 2015-11-08 22:05:07

Les décharges générées à partir de mysqldump peut être digne de confiance.

pour éviter les problèmes avec les encodages, les transferts binaires, etc, Utilisez le --hex-blob option, donc il traduit chaque octet dans un nombre hexadécimal (par exemple, 'abc' devient 0x616263). Il va rendre le dump plus grand, mais il sera le moyen le plus compatible et sûr d'avoir l'information (depuis qu'il sera du texte pur, pas d'erreurs d'interprétation bizarres en raison de symboles spéciaux générés avec les données binaires sur un fichier de texte).

vous pouvez Vous assurer l'intégrité (et accélérer le transfert) des fichiers dump l'empaquetant sur un fichier rar ou zip. De cette façon, vous pouvez facilement détecter qu'il n'a pas été corrompu avec le transfert.

Lorsque vous essayez de le charger sur votre serveur, vérifiez que vous avez attribué à votre my.cnf fichier de configuration de serveur

[mysqld]
max_allowed_packet=600M

, ou plus si nécessaire.

BTW en ce moment je viens de faire une migration, et j'ai balancé beaucoup de données binaires avec mysqldump et il a parfaitement fonctionné.

5
répondu Gusstavv Gil 2015-07-31 08:47:17