No, non è sempre affidabile quando si dispone di blob binari. In tal caso è necessario utilizzare il flag "--hex-blob" per ottenere risultati corretti.
Ho un caso in cui queste chiamate non riescono (importazione su un server diverso, ma entrambi in esecuzione 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
Si produce un file che non riesce in silenzio da importare. L'aggiunta di "--skip-extended-insert" mi dà un file che è molto più facile da eseguire e scopro che questa linea è generata ma non può essere letta (ma non viene segnalato alcun errore né esportandolo o importandolo):
INSERT INTO `panels` VALUES (1003,1,257126,141,6562,1,88891,'??\\\?ŖeV???,NULL);
Si noti che la virgoletta di terminazione sui dati binari manca nell'originale.
select hex(packet_key) from panels where id=1003;
--> DE77CF5C075CE002C596176556AAF9ED
La colonna è dati binari:
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`),
...
Quindi no, non solo si può non necessariamente fidare di mysqldump, si può nemmeno contare su di esso per segnalare un errore quando si verifica.
Una soluzione brutta che ho usato è stato quello di mysqldump escludendo le due tabelle afflitti con l'aggiunta di opzioni come questo per la discarica:
--ignore-table=myalarm.panels
Poi questo hack script bash. Fondamentalmente eseguire un SELECT che produce valori INSERISCI in cui le colonne NULL sono gestite e la colonna binaria viene trasformato in un UNHEX() chiamano in questo modo:
(123,45678,UNHEX("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"),"2014-03-17 00:00:00",NULL),
incollarlo nel vostro editor di scelta per giocare con lui se avete bisogno a.
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
Questo mi dà un file chiamato "all.sql" che ha bisogno la virgola finale nella INSERT trasformato in un punto e virgola, allora può essere eseguito come sopra. Avevo bisogno dei tweak "large import buffer" impostati sia nella shell interattiva mysql sia nella riga di comando per elaborare quel file perché è grande.
mysql ... --max_allowed_packet=1GB
Quando ho segnalato il bug che stavo finalmente indicò il flag "--hex-blob", che fa la stessa come la mia soluzione, ma in un banale dal mio modo di lato.Aggiungi questa opzione, i BLOB vengono scaricati come esadecimali, alla fine.
http://forums.devshed.com/mysql-help-4/does-mysqldump-backs-up-blob-fields-of-tables-163361.html Uso sempre la modalità ftp binaria per tutti i file. Mai avuto alcuna corruzione. – user4035
Si dovrebbe sempre controllare l'importazione in qualche modo. Idealmente, eseguendo un'utilità di confronto dei dati, ma spesso implica la duplicazione di gran parte del trasferimento. Ma anche i dump discografici binari diffusi a entrambe le estremità tramite checksum sono migliori del semplice sperare che tutto sia a posto. –