从SQL转储还原数据库时出错


14

我对MySQL非常陌生,并且正在Windows上运行它。我正在尝试从MySQL中的转储文件还原数据库,但是出现以下错误:

$ >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'.

我尝试$ > mysql -u root -p -h localhost -D database --binary-mode -o < dump.sql了一下,但这给了我以下内容ERROR at line 1: Unknown command '\☻'. 这是一个500 Mb的转储文件,当我使用gVIM查看其内容时,只能看到表达式和无法理解的数据。另外,当我尝试从文件中复制内容以发布到此处时,我只能复制的内容是:SQLite format 3这种似乎很奇怪。


1
您是备份者吗?
Menios 2013年

我遇到了这个错误,但是得到了一个新的MySQL转储,并尝试了重新导入,并且工作正常。我们的MySQL转储有两个压缩部分,必须将它们串联起来然后解压缩。我认为最初的解压缩被中断了,导致.sql文件中的字符和编码很奇怪。第二次尝试效果很好。
约书亚·品特

Answers:


18

--binary-mode对它的引用(在MySQL 5.6.3中引入)可能会分散注意力。

听起来好像您在处理mysqldump输出文件。尝试该file实用程序。

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

如果没有得到ASCII text响应,则说明您正在处理根本不是转储文件的文件mysqldump,或者正在处理已压缩的文件(例如,使用gzip或bzip2压缩的文件), d需要先解压缩,然后再将其导入mysql

如果看到的SQLite 3.x database话,您肯定会得到答案...这是一个原始SQLite数据库,而不是MySQL转储文件。

实际上,SQLite数据库的前几个字节是:

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

请注意,此处的第16个八位位组是0x00,说明了ERROR: ASCII '\0' appeared in the statement...这种情况下的消息。--binary-mode适当的建议是错误的警报。


Windows用户:“文件”实用程序是Unix的工具,但可以在此处找到Windows版本。


我收到此错误,运行file MySQL.sql时返回UTF-8 Unicode text, with very long lines。有任何想法吗?
约书亚·品特

@JoshuaPinter尝试less -S MySQL.sql。你看到了什么?它看起来像MySQL转储文件吗?它们大部分是人类可读的。(q用于退出。)
Michael-sqlbot

1
是的,第一行看起来像-- MySQL dump 10.13 Distrib 5.7.22, for Linux (x86_64)。通过空格键向下移动将显示典型的MySQL指令。但是,如果我继续下去,它会冻结在特定的行上。错误消息中出现的同一行。我进一步调查了一下,发现第一次没有正确解压缩MySQL转储。不知道出了什么问题,但是当我重新解压缩时,它可以正常工作。我在这里为其他人添加了有关此问题的答案:stackoverflow.com/a/51432853/293280非常 感谢您的帮助和快速回复。👍–
约书亚·品特

6

视窗

使用此命令创建转储文件

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

使用:

.\mysqldumb --help

-r,-结果文件=名称

                 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
这是正确的答案。Powershell的>创建导致问题的UTF-16编码文件。:搜索PowerShell的位置dev.mysql.com/doc/refman/5.7/en/mysqldump.html
SimZal

1

mysqldump像这样在Windows PowerShell上运行后,我一次遇到此错误:

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

我所做的就是将其更改为此(管道改为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

问题就解决了!


1

在PowerShell中我也是

我在使用PowerShell调用mysqldump>将输出通过管道传输到文件时遇到了此问题。PowerShell在创建文件时使用了错误的编码,当我尝试使用mysql .. <export-file.sql导入文件时,我也遇到了相同的错误

我发现在PowerShell会话中将默认编码设置为UTF8可以解决此问题。

我的解决方案-经过测试的PowerShell 5.1:

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

示例:我是如何生产出口的(简体)

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

注意:发现这在PowerShell 4.0上不起作用

我的开发环境正在运行5.1,但是prod是4.0,并且我的初始修复在PowerShell的较旧版本中不起作用。

需要使用 | Set-Content -Encoding UTF8 $fileName

Ifedi已经建议了这一点



0

有人给我压缩了一块酒。甚至对gtar都不是很熟悉,但这是另一种压缩格式。

$ 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

但是,我能够像往常一样解压缩它:

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

然后我可以导入:

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


0

就我而言,该文件已损坏。该数据库使用扩展名压缩,.bz2但实际上是一个.tar.bz2

使用进行解压缩bzip2 -dk不会输出任何错误并生成文件。file在文件输出上使用命令,bzip2 compressed data, block size = 900k因此使用它甚至看起来都没有错误。

我不得不用 tar -xf myfile.bz2

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.