导入错误的MySQL转储时如何跳过行

Alm*_*mad 35 mysql bash backup mysqldump mysql-error-1062

鉴于mysqldump导致导入错误的错误:

namtar backups # mysql -p < 2010-12-01.sql
Enter password: 
ERROR 1062 (23000) at line 8020: Duplicate entry 'l?he?' for key 'wrd_txt'
Run Code Online (Sandbox Code Playgroud)

是否有一种简单的方法可以告诉导入只是跳过给定的行并继续?

(是的,我知道我可以手动编辑文件或解析输出,但它不是很方便)

jml*_*ele 46

如果您可以再次进行转储,则可以在转储时添加--insert-ignore到命令行.

或者你可以尝试使用mysqlimport命令--force,即使它遇到MySQL错误也会继续.

  • 我只是尝试将 --force 与 mysql 一起使用,它会在发生错误时导致插入停止。mysqlimport 不适用于 --all-databases 转储,因此这也是不可能的。最简单的方法是编辑文件,而不是删除可能很乏味的违规行,而是将“INSERT”命令转换为“INSERT IGNORE”命令。一个简单的查找/替换就足够了。我意识到这不是一个理想的解决方案,但是当您发现它们时,它比不得不通过手动替换有问题的插入的文件进行挖掘要好。 (2认同)

Pat*_*ann 36

mysql -f -p < 2010-12-01.sql

-f(力)正在此间手术的选择,为我工作.


Ben*_*Ben 22

根据jmlsteele的回答和评论的建议,这里是如何将插入转换INSERT IGNORE为动态.

如果您要从sql文件导入:

sed -e "s/^INSERT INTO/INSERT IGNORE INTO/" < 2010-12-01.sql | mysql -p
Run Code Online (Sandbox Code Playgroud)

如果您要从gz文件导入,只需将gunzip的输出传输到sed而不是使用文件输入:

gunzip < 2010-12-01.sql.gz | sed -e "s/^INSERT INTO/INSERT IGNORE INTO/" | mysql -p
Run Code Online (Sandbox Code Playgroud)

  • @Almad - 它只会更改第一个INSERT INTO,并且不会更改同一行上的任何其他内容.据我所知,只要你在文本字段中有"INSERT INTO",它就会遵循一个INSERT INTO语句 - 但是,我改变了答案以确保它只在它的开头处被替换一条新线. (2认同)