如果您怀疑原始数据库损坏,您可以执行以下操作:
对于 MyISAM 表:
CHECK TABLE <table_name>;
REPAIR TABLE <table_name>;
对于 InnoDB 表:
http://www.mysqlperformanceblog.com/2008/07/04/recovering-innodb-table-corruption/
我个人在少数情况下看到了 MyISAM 表的损坏,CHECK 和 REPAIR 能够检测和纠正。我从未经历过 InnoDB 表的损坏,因此无法从个人经验中谈论链接中提供的信息。
也就是说,如果我站在你的立场上,我会先仔细查看 mysqldump 生成的输出文件,看看我是否可以查明错误的根源。mysqldump 通常为每个表输出一个 INSERT 语句,所有数据都在一行上,因此诊断错误有点棘手,因为错误消息中包含的行号没有多大帮助。所以,我要做的是编辑 mysqldump 输出文件并在每一行之间插入换行符。例如:
原来的:
INSERT INTO table VALUES (a,b,c),(d,e,f),(g,h,i), ...
改成:
INSERT INTO table VALUES (a,b,c),
(d,e,f),
(g,h,i),
...
由于您对命令行很熟悉,因此您可以使用 sed 等自动执行此操作。
然后,尝试导入修改后的文件。您应该得到相同的错误,但这次行号将有助于查明导致问题的确切行。此时,您应该能够诊断问题(或在此处发布 mysqldump 输出的违规部分,我们将尽力提供帮助)。
编辑:
您引用的错误消息是在您导入数据库时发生的吗?还是数据库导入成功,但应用程序访问数据库时却报错?我假设前者,但现在重新阅读您的问题后认为可能是后者。
另一个想法:您的数据库是否包含存储过程?如果是这样,mysqldump 默认不包括那些。您需要使用--routines选项:
mysqldump --routines -u <user> -p<password> <database> > output