Erreur lors de la restauration d'une base de données à partir d'un vidage SQL


14

Je suis extrêmement nouveau sur MySQL et je l'exécute sur Windows. J'essaie de restaurer une base de données à partir d'un fichier de vidage dans MySQL, mais j'obtiens l'erreur suivante:

$ >mysql -u root -p -h localhost -D database -o < dump.sql
ERROR: ASCII '\0' appeared in the statement, but this is not allowed unless option --binary-mode is enabled and mysql is run in non-interactive mode. Set --binary-mode to 1 if ASCII '\0' is expected. Query: 'SQLite format 3'.

J'ai essayé $ > mysql -u root -p -h localhost -D database --binary-mode -o < dump.sqlmais cela m'a donné ce qui suit. ERROR at line 1: Unknown command '\☻'. Il s'agit d'un fichier de vidage de 500 Mo, et lorsque je regarde son contenu à l'aide de gVIM, tout ce que je peux voir, ce sont des expressions et des données qui ne sont pas compréhensibles. De plus, lorsque j'essaie de copier le contenu du fichier pour le publier ici, tout ce que je peux copier est: SQLite format 3Ce genre de chose semble étrange.


1
Étiez-vous celui qui a pris la sauvegarde?
Menios

J'obtenais cette erreur mais j'ai obtenu un nouveau vidage MySQL et j'ai essayé de réimporter et cela a bien fonctionné. Notre vidage MySQL est livré en deux parties zippées qui doivent être concaténées puis décompressées. Je pense que la décompression initiale a été interrompue, entraînant un .sqlfichier avec des caractères et des encodages étranges. La deuxième tentative a bien fonctionné.
Joshua Pinter

Réponses:


18

La référence à --binary-mode(introduite dans MySQL 5.6.3) est probablement une distraction.

Il ne semble pas que vous ayez affaire à un fichier de sortie mysqldump, là. Essayez l' fileutilitaire.

shell> file dumpfile.sql
dumpfile.sql: ASCII text

Si vous n'obtenez pas la ASCII textréponse, vous avez affaire à quelque chose qui n'est pas du tout un fichier de vidage mysqldump, ou vous avez affaire à quelque chose qui a été compressé (avec gzip ou bzip2, par exemple), que vous ' d besoin de décompresser avant de le canaliser mysql.

Si vous voyez, SQLite 3.x databasevous avez certainement votre réponse ... c'est une base de données SQLite brute, pas un fichier de vidage MySQL.

En effet, les premiers octets d'une base de données SQLite sont les suivants:

53 51 4C 69 74 65 20 66  SQLite f
6F 72 6D 61 74 20 33 00  ormat 3^@

Notez que le 16e octet est ici 0x00, expliquant le ERROR: ASCII '\0' appeared in the statement...message dans ce cas. La suggestion --binary-modeappropriée est une fausse alarme.


Utilisateurs Windows: l'utilitaire 'file' est un outil d'Unix, mais la version Windows peut être trouvée ici .


Je reçois cette erreur et lors de son exécution, file MySQL.sqlelle revient UTF-8 Unicode text, with very long lines. Des idées?
Joshua Pinter

@JoshuaPinter essayez less -S MySQL.sql. Que vois-tu? Cela ressemble-t-il à un fichier de vidage MySQL? Ils sont pour la plupart lisibles par l'homme. (Utilisez qpour sortir.)
Michael - sqlbot

1
Oui, la première ligne ressemble -- MySQL dump 10.13 Distrib 5.7.22, for Linux (x86_64). Et le déplacement vers le bas via la barre d'espace affiche des instructions MySQL typiques. Cependant, si je continue à descendre, il gèle sur une certaine ligne. La même ligne qui est apparue dans le message d'erreur. Je l'ai approfondi et j'ai découvert que le vidage MySQL n'avait pas été décompressé correctement la première fois. Je ne sais pas ce qui s'est mal passé, mais quand je décompresse à nouveau, cela fonctionne très bien. J'ai ajouté une réponse à ce sujet ici pour les autres: stackoverflow.com/a/51432853/293280 Merci beaucoup pour votre aide et votre réponse rapide. 👍
Joshua Pinter

6

les fenêtres

Créez vos fichiers de vidage avec cette commande

.\mysqldump [dbname] -r [filename.sql]

En utilisant:

.\mysqldumb --help

-r, --result-file = nom

                 Direct output to a given file. This option should be used
                 in systems (e.g., DOS, Windows) that use carriage-return
                 linefeed pairs (\r\n) to separate text lines. This option
                 ensures that only a single newline is used.

2
Ceci est la bonne réponse. Powershell's> crée un fichier encodé UTF-16 qui cause des problèmes. Recherchez Powershell ici: dev.mysql.com/doc/refman/5.7/en/mysqldump.html
SimZal

1

J'ai eu cette erreur une fois, après avoir exécuté mysqldumpsur Windows PowerShell comme ceci:

mysqldump -u root p my_db --no-data --no-create-db --no-create-info --routines --triggers --skip-opt --set-gtid-purged=OFF > db_objects.sql

Ce que j'ai fait était de le changer en ceci (à la place de Set-Content):

mysqldump -u root p my_db --no-data --no-create-db --no-create-info --routines --triggers --skip-opt --set-gtid-purged=OFF | Set-Content db_objects.sql

Et le problème a disparu!


1

Moi aussi dans PowerShell

J'ai rencontré ce problème lorsque j'utilisais PowerShell pour appeler mysqldump et > pour diriger la sortie vers un fichier. PowerShell utilisait un encodage incorrect lors de la création du fichier et j'ai été confronté à la même erreur lorsque j'ai essayé d'importer le fichier en utilisant mysql .. <exports-file.sql

J'ai constaté que la définition du codage par défaut sur UTF8 dans la session PowerShell a résolu ce problème.

Ma résolution - Tested PowerShell 5.1:

$PSDefaultParameterValues["Out-File:Encoding"] = "utf8";

Exemple: Comment je produisais l'exportation (simplifiée) :

$cmdExportDB = "mysqldump --host $Host --databases $DbName -u $UID =p$PWD > $fileName";
Invoke-Expression "& $cmdExportDB";

Remarque: découvert que cela ne fonctionne pas sur PowerShell 4.0

Mon environnement de développement fonctionnait sous 5.1, mais prod est à 4.0 et mon correctif initial ne fonctionne pas dans les anciennes versions de PowerShell.

Besoin d'utiliser | Set-Content -Encoding UTF8 $fileName

Cela a déjà été suggéré par Ifedi



0

Quelqu'un m'a envoyé un gtar compressé. Je ne connaissais même pas trop gtar, mais c'est un autre format de compression.

$ file core_production-1432173533.sql.gtar
core_production-1432173533.sql.gtar: gzip compressed data, from Unix, last modified: Wed May 20 21:59:31 2015

Cependant, j'ai pu le décompresser comme d'habitude:

tar -zxvf core_production-1432173533.sql.gtar
$ file core_production-1432173533.sql
core_production-1432173533.sql: ASCII text, with very long lines

Et puis je pourrais faire l'importation:

mysql -u root -p -h localhost core_production < core_production-1432173533.sql


0

Dans mon cas, le fichier était corrompu. La base de données a été compressée avec extension .bz2mais c'était en fait un fichier .tar.bz2.

La décomposition en utilisant bzip2 -dkne génère aucune erreur et génère le fichier. En utilisant la commande filesur les sorties de fichiers bzip2 compressed data, block size = 900k, il ne semble même pas mauvais de l'utiliser.

Je devais utiliser tar -xf myfile.bz2

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.