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

时间:2011-10-01 18:51:08

标签: 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'

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

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

6 个答案:

答案 0 :(得分:44)

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

或者您可以尝试将 mysqlimport 命令与--force一起使用,即使遇到MySQL错误也会继续。

答案 1 :(得分:35)

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

-f(强制)是这里的操作选项,为我工作。

答案 2 :(得分:21)

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

如果您要从sql文件导入:

sed -e "s/^INSERT INTO/INSERT IGNORE INTO/" < 2010-12-01.sql | mysql -p

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

gunzip < 2010-12-01.sql.gz | sed -e "s/^INSERT INTO/INSERT IGNORE INTO/" | mysql -p

答案 3 :(得分:1)

您是否删除了转储顶部的MySQL指令? (我在删除所有已经使用sed命令插入的记录/表后重新启动恢复时无意中做了)。这些指令告诉MySQL,除其他外,不要做独特的测试,外键测试等)

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;

答案 4 :(得分:1)

其他选项当然是可行的选项,但另一种解决方案是简单地编辑从.sql获得的mysqldump文件。

变化:

INSERT INTO table_name ...

INSERT IGNORE INTO table_name ...

答案 5 :(得分:0)

很棒的提示。我做了一点不同,但结果相同。

perl -pi -e 's/INSERT INTO/INSERT IGNORE INTO/g' filename.sql