Ответ 1
Если вы можете сделать дамп снова, вы можете добавить - insert-ignore в командную строку при сбросе.
Или вы можете попробовать использовать команду mysqlimport с --force, которая будет продолжаться, даже если она встречает ошибки MySQL.
Учитывая плохой 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'
Есть ли простой способ сказать import, чтобы просто пропустить указанную строку и продолжить?
(Да, я знаю, что могу вручную отредактировать файл или выполнить синтаксический анализ, но это не очень удобно)
Если вы можете сделать дамп снова, вы можете добавить - insert-ignore в командную строку при сбросе.
Или вы можете попробовать использовать команду mysqlimport с --force, которая будет продолжаться, даже если она встречает ошибки MySQL.
mysql -f -p < 2010-12-01.sql
-f
(force), являющийся оперативным вариантом, работал у меня.
Следуя рекомендациям jmlsteele answer и comment, здесь, как превратить вставки в 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
Просто вы удалили директивы MySQL в верхней части дампа? (Я непреднамеренно сделал, когда я перезапустил восстановление после удаления всех записей/таблиц, которые я уже вставил с помощью команды sed). Эти директивы говорят MySQL, помимо прочего, не выполнять уникальные тесты, тесты внешнего ключа и т.д.)
/*!40101 SET @[email protected]@CHARACTER_SET_CLIENT */;
/*!40101 SET @[email protected]@CHARACTER_SET_RESULTS */;
/*!40101 SET @[email protected]@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40103 SET @[email protected]@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @[email protected]@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @[email protected]@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @[email protected]@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @[email protected]@SQL_NOTES, SQL_NOTES=0 */;
Другие варианты, безусловно, являются жизнеспособными параметрами, но другим решением было бы просто отредактировать файл .sql
, полученный из mysqldump
.
Изменить:
INSERT INTO table_name ...
К
INSERT IGNORE INTO table_name ...