Mysql игнорирование ошибок

I am importing a fairly large database. The .sql file has almost 1,000,000 lines in it. Problem is that I am getting a syntax error when trying to import the database. It says:

ERROR 1064 (42000) at line 8428420: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘
Fatal error: Maximum execution time of 600 seconds exceeded in

Normally I’d just open the .sql file and fix the error. But my computer is really struggling to open this file.

Is there any way I can ignore errors when importing a MySQL database?

A.L's user avatar

A.L

9,95510 gold badges65 silver badges97 bronze badges

asked Jun 29, 2012 at 13:49

Dustin's user avatar

1

Use the --force (-f) flag on your mysql import. Rather than stopping on the offending statement, MySQL will continue and just log the errors to the console.

For example:

mysql -u userName -p -f -D dbName < script.sql

luchaninov's user avatar

luchaninov

6,7426 gold badges59 silver badges75 bronze badges

answered Sep 10, 2014 at 17:21

Craig Boobar's user avatar

Craig BoobarCraig Boobar

3,7611 gold badge10 silver badges3 bronze badges

2

Суть в том что при импорте из дампа .sql возникает ошибка в синтаксисе внутри файла и заливка в базу останавливается. Так вот, как сделать так чтобы при заливке дампа в базу ошибки просто игнорировались и проблемные места пропускались, а импорт шел дальше?


  • Вопрос задан

    более двух лет назад

  • 1710 просмотров

Используйте флаг —force, -f

—force, -f

Ignore all errors; continue even if an SQL error occurs during a table dump.

One use for this option is to cause mysqldump to continue executing even when it encounters a view that has become invalid because the definition refers to a table that has been dropped. Without —force, mysqldump exits with an error message. With —force, mysqldump prints the error message, but it also writes an SQL comment containing the view definition to the dump output and continues executing.

If the —ignore-error option is also given to ignore specific errors, —force takes precedence.

https://dev.mysql.com/doc/refman/8.0/en/mysqldump….

Пригласить эксперта


  • Показать ещё
    Загружается…

04 июн. 2023, в 01:35

1500 руб./за проект

04 июн. 2023, в 01:25

40000 руб./за проект

03 июн. 2023, в 23:42

1500 руб./за проект

Минуточку внимания

I am copying records from one table to another and there is a chance that some records may already be in the second table i am copying the records to.

Since there are lots of rows i am copying,i am looking a way to ignore all the record already exists messages from mysql and continue executing the mysql file.

Is there a way i can suppress the error messages?.

asked Jul 15, 2013 at 14:41

You Know Nothing Jon Snow's user avatar

1

As documented under INSERT Syntax:

The INSERT statement supports the following modifiers:

[ deletia ]
  • If you use the IGNORE keyword, errors that occur while executing the INSERT statement are treated as warnings instead. For example, without IGNORE, a row that duplicates an existing UNIQUE index or PRIMARY KEY value in the table causes a duplicate-key error and the statement is aborted. With IGNORE, the row still is not inserted, but no error is issued.

answered Jul 15, 2013 at 14:44

eggyal's user avatar

1

Try this:

zcat db.sql.gz | sed -e 's/INSERT/INSERT IGNORE/' | mysql -u user -p dbname

answered Aug 30, 2014 at 5:52

develCuy's user avatar

develCuydevelCuy

5675 silver badges14 bronze badges

When dumping a database, I’m getting

mysqldump: Couldn't execute 'show create table `some_table`': execute command denied to user 'some_user'@'%' for routine 'some_routime' (1370)

and then the dumping just stops.

How do I make mysqldump continue when it runs into these sorts of problems? 10 minutes of Google has offered no help.

Here is the command I used:

mysqldump -u username -h localhost --port=4406 -p --databases database_name --skip-lock-tables --force > database_name.sql

Следующая команда соединит нас с БД devdb, имя пользователя devuser и пароль mysecretpwd.

mysql -u devuser -pmysecretpwd devdb
mysql>

Мы будем вводить данные в таблицу employee. Структура таблицы приведена ниже:

mysql> desc employee;
+--------+-------------+------+-----+---------+----------------+
| Field  | Type        | Null | Key | Default | Extra          |
+--------+-------------+------+-----+---------+----------------+
| id     | int(11)     | NO   | PRI | NULL    | auto_increment |
| name   | varchar(20) | YES  |     | NULL    |                |
| dept   | varchar(10) | YES  |     | NULL    |                |
| salary | int(10)     | YES  |     | NULL    |                |
+--------+-------------+------+-----+---------+----------------+

Пример базового использования команды INSERT

Следующая команда добавит новую запись в таблицу. После ключевого слово VALUES указываются значения столбцов таблицы:

INSERT INTO employee VALUES(100, 'Thomas', 'Sales', 5000);

Используйте команду SELECT для проверки введенных данных.

SELECT * FROM employee;

Вставка данных только для определенных столбцов

Если вы хотите вставить данные только в несколько столбцов, то их следует перечислить. Следующая команда вставит значения только в столбцы id и name.

INSERT INTO employee(id, name) VALUES(200, 'Jason');

Мы не указали значения полей dept и salary. В итоге, мы получили NULL в этих столбцах. Обратите внимание, это не строковое значение “NULL”, это значение, указывающие на то, что ячейка пуста.

mysql> SELECT * FROM employee;

+-----+--------+-------+--------+
| id  | name   | dept  | salary |
+-----+--------+-------+--------+
| 100 | Thomas | Sales |   5000 |
| 200 | Jason  | NULL  |   NULL |
+-----+--------+-------+--------+
2 rows in set (0.00 sec)

Пример Insert Set

Вместо ключевого слова values вы можете использовать слово SET для установки значения нужному полю.

Следующая команда является полным аналогом той, что мы рассмотрели выше:

mysql> INSERT INTO employee SET id=300, name='Mayla';

mysql> select * from employee;

+-----+--------+-------+--------+
| id  | name   | dept  | salary |
+-----+--------+-------+--------+
| 100 | Thomas | Sales |   5000 |
| 200 | Jason  | NULL  |   NULL |
| 300 | Mayla  | NULL  |   NULL |
+-----+--------+-------+--------+

Вставка значений на основе значений из другой таблицы

В этом примере мы используем INSERT...SELECT метод, для выбора значений из другой таблицы.

Следующая команда копирует значения из таблицы contractor в employee.

INSERT INTO employee SELECT * FROM contractor;

Также вы можете комбинировать условия WHERE, для выбора определенных полей.

INSERT INTO employee SELECT * FROM contractor WHERE salary >= 7000;

Внимание: Если вы работаете с БД Oracle, то используйте синтаксис insert into employee AS select * from contractor. MySQL не поддерживает ключевого слова AS в данном контексте.

Ввод выбранных столбцов из другой таблицы

Конечно, вы можете выбрать определенный набор столбцов для ввода их значений в другую таблицу.

Следующая команда выбирает поля id и name всех записей из таблицы contractor и вводит их в таблицу employee.

INSERT INTO employee(id,name) SELECT id,name FROM contractor;

Также допускается использование условий WHERE.

INSERT INTO employee(id,name) SELECT id,name FROM contractor WHERE salary >= 7000;

Обратите внимание, если запись с указанным ID уже существует, вы получит ошибку. ERROR 1062 (23000): Duplicate entry ‘100’ for key ‘PRIMARY’

Ввод записей в определенную секцию

Если вы создавали таблицу разбитую на разделы по диапазону записей, то вы можете указать определенный раздел для записи.

В следующем примере данные вводятся в раздел p1.

INSERT INTO employee PARTITION (p1) VALUES(100,'Thomas','Sales',5000);

Обратите внимание, что запись с этим ID уже существует в указанном разделе. Поэтому мы получим соответствующую ошибку.

ERROR 1729 (HY000): Found a row not matching the given partition set

Внимание: Этот пример отработает только в MySQL 5.6 и выше.

Вставка записей в несколько разделов таблицы

Вы можете при помощи одной команды вставить записи сразу в несколько разделов таблицы. Следующий запрос вставит данные в разделы p1 и p2.

INSERT INTO employee PARTITION (p1, p2) VALUES(100,'Thomas','Sales',5000), (200,'Jason','Technology',5500);

Обратите внимание, если по какой-либо причине одна из записей вызовет ошибку при обработке, то весь запрос будет отменен.

Снова, пример отработает только в MySQL 5.6 и выше.

Игнорирование ошибок при вводе данных

Если по каким-либо причинам вам необходимо пропускать ошибки при вводе данных, то вы можете использовать ключевое слово IGNORE.

К примеру, следующая команда вызовет ошибку, так как запись с таким ID уже существует.

mysql> INSERT INTO employee VALUES(100,'Thomas','Sales',5000);
ERROR 1062 (23000): Duplicate entry '100' for key 'PRIMARY'

Чтобы пропускать подобные ошибки вы можете обратиться в команде insert ignore. Помните, что запись не будет внесена в таблицу. Вы просто игнорируете возникающую ошибку.

mysql> INSERT IGNORE INTO employee VALUES(100,'Thomas','Sales',5000);
Query OK, 0 rows affected (0.00 sec)

Значение по-умолчанию

Если MySQL запущен в строгом режиме, то, не указав значения по-умолчанию для полей, мы получим ошибки.

Если же строгий режим отключен (по-умолчанию), то не указав значение для поля, будет использовано значение по-умолчанию для поля уровня таблицы.

Например, в таблице bonus оба поля не могут принимать значение NULL.

mysql> DESC bonus;

+--------+---------+------+-----+---------+-------+
| Field  | Type    | Null | Key | Default | Extra |
+--------+---------+------+-----+---------+-------+
| id     | int(11) | NO   |     | NULL    |       |
| amount | int(11) | NO   |     | NULL    |       |
+--------+---------+------+-----+---------+-------+

Введем значение только для id.

INSERT INTO bonus(id) VALUES(100);

При выборке данных, мы видим, что поле amount приняло значение 0.

SELECT * FROM bonus;

+-----+--------+
| id  | amount |
+-----+--------+
| 100 |      0 |
+-----+--------+

Если мы опустим оба поля при вводе данных, то они примут значение 0. Если поля не указаны при вводе, то они принимают значения по-умолчанию для таблицы.

INSERT INTO bonus VALUES();

mysql> select * from bonus;

+-----+--------+
| id  | amount |
+-----+--------+
|   0 |      0 |
+-----+--------+

Внимание: допускается применения ключевого слова DEFAULT. Результат выполнения запроса идентичен предыдущему.

INSERT INTO bonus VALUES(DEFAULT, DEFAULT);

Для строковых полей значение по-умолчанию — пустая строка. Обратите внимание, что для полей AUTO_INCREMENT значение по-умолчанию — увеличенное на единицу значение предыдущей записи.

Выражения в качестве значение в INSERT

В следующем примере, в качестве значения поля bonus мы указали 5000+id. В результате поле bonusбудет равно сумме размера бонуса и ID.

Допускается использование +, -, *, или любого другого корректного оператора MySQL. В следующем примере используется 50*2 в качестве значения ID. В итоге ID примет значение 100.

Вы также можете обращаться к значения других столбцов. Например, 5000+id для поля bonus. То есть мы используем значение столбца id (100) и добавляем его к 5000. Результирующее значение — 5100.

mysql> INSERT INTO employee VALUES(50*2, 'Thomas', 'Sales', 5000+id);

mysql> select * from employee;
+-----+--------+-------+--------+
| id  | name   | dept  | salary |
+-----+--------+-------+--------+
| 100 | Thomas | Sales |   5100 |
+-----+--------+-------+--------+

Изменение приоритета команды INSERT

При работе с движками, допускающими блокирование таблиц (MyISAM), допускается указывать приоритет команде INSERT.

Например, следующая команда откладывает операцию INSERT до тех пор, пока сервер не обработает все операции чтения над таблицей.

INSERT LOW_PRIORITY INTO employee VALUES(100, 'Thomas', 'Sales', 5000);

Также можно указывать высокий приоритет. Это операции полностью противоположна предыдущей.

INSERT HIGH_PRIORITY INTO employee VALUES(100, 'Thomas', 'Sales', 5000);

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

Обратите внимание, что команда очень похожа на INSERT...DELAY, которая считается устаревшей начиная с MySQL версии 5.6.6, поэтому стоит избегать её использования.

Обновления строки при повторении

Если в процессе записи будет обнаружена запись с повторяющимся значением ID, операция будет остановлена с соответствующей ошибкой.

mysql>  INSERT INTO employee VALUES(100,'Thomas','Sales',5000);
ERROR 1062 (23000): Duplicate entry '100' for key 'PRIMARY'
mysql> select * from employee;

+-----+--------+-------+--------+
| id  | name   | dept  | salary |
+-----+--------+-------+--------+
| 100 | Thomas | Sales |   5000 |
+-----+--------+-------+--------+

Но, вы можете обновить поля такой записи (при обнаружении дубликата) при помощи команды ON DUPLICATE KEY UPDATE.

В примере ниже мы обновляем значение поля salary, при возникновении дубликата записи, увеличив его на 500.

mysql> INSERT INTO employee VALUES(100,'Thomas','Sales',5000) on DUPLICATE KEY UPDATE salary=salary+500;

mysql> select * from employee;

+-----+--------+-------+--------+
| id  | name   | dept  | salary |
+-----+--------+-------+--------+
| 100 | Thomas | Sales |   5500 |
+-----+--------+-------+--------+

Обратите внимание, что, хотя в предыдущем примере мы добавляем только одну строку, мы все равно получаем в ответ 2 rows affected.


Post Views:
555

Понравилась статья? Поделить с друзьями:
  • Mysql workbench ошибка 1050
  • Mysql unexpected identifier ошибка
  • Mysql shutdown unexpectedly ошибка
  • Mysql server ошибка установки
  • Mysql no packages found ошибка