Как пропустить строку при импорте плохого дампа MySQL - PullRequest
35 голосов
/ 01 октября 2011

При плохом 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 ]

44 голосов
/ 01 октября 2011

Если вы можете сделать дамп снова, вы можете добавить --insert-ignore в командную строку при выгрузке.

Или вы можете попробовать использовать команду mysqlimport с --force, которая будет продолжаться, даже если она обнаружит ошибки MySQL.

35 голосов
/ 05 апреля 2012

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

-f (сила), действующая здесь, работает для меня.

22 голосов
/ 03 июля 2013

Следуя совету от ответа и комментария 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
1 голос
/ 17 марта 2017

Другие опции, безусловно, являются жизнеспособными, но другим решением будет просто отредактировать файл .sql, полученный из mysqldump.

Изменение:

INSERT INTO table_name ...

К

INSERT IGNORE INTO table_name ...
1 голос
/ 06 марта 2013

Просто мысль, вы удалили директивы 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 */;
0 голосов
/ 22 февраля 2019

Отличный совет. Я сделал это немного по-другому, но результат тот же.

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