Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Порядок создания таблиц с внешними ключами в mysqldump. / 13 сообщений из 13, страница 1 из 1
18.02.2019, 15:52
    #39775661
Лебедкин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Порядок создания таблиц с внешними ключами в mysqldump.
Приветствую коллег! Вот такая проблема обнаружилась.

При восстановлении БД из дампа получаем ошибку:
Код: plaintext
Can't create table ... (errno: 150 "Foreign key constraint is incorrectly formed")
т.е. ругается на то что пытаемся создать таблицу с внешним ключом, на ещё не существующую другую таблицу.
Просмотр файла дампа показал, что действительно таблица с внешним ключом создаётся раньше чем таблица, на которую она ссылается.

Вопрос в следующем: почему утилита mysqldump не следит за тем чтобы таблицы создавались в правильном порядке? Или, может, ей для этого необходимо указать какие то опции?

p.s. Версия сервера: MariaDB 10.0.
...
Рейтинг: 0 / 0
18.02.2019, 16:38
    #39775719
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Порядок создания таблиц с внешними ключами в mysqldump.
Лебедкинпочему утилита mysqldump не следит за тем чтобы таблицы создавались в правильном порядке?Потому что восстановление ВСЕГДА проводится при отключении подсистемы контроля целостности.
...
Рейтинг: 0 / 0
18.02.2019, 16:49
    #39775735
Лебедкин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Порядок создания таблиц с внешними ключами в mysqldump.
ааа!! перед восстановлением надо так прописать:
Код: plaintext
set foreign_key_checks=0;
??

Тогда странно, почему этот оператор в дамп-файл не записывается по умолчанию?
...
Рейтинг: 0 / 0
18.02.2019, 16:57
    #39775750
Лебедкин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Порядок создания таблиц с внешними ключами в mysqldump.
Не получилось! перед восстановлением сделал так:
Код: plaintext
set foreign_key_checks=0;

ошибка сохранилась.
...
Рейтинг: 0 / 0
18.02.2019, 17:43
    #39775797
Melkij
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Порядок создания таблиц с внешними ключами в mysqldump.
Лебедкин
Код: plaintext
Can't create table ... (errno: 150 "Foreign key constraint is incorrectly formed")
т.е. ругается на то что пытаемся создать таблицу с внешним ключом, на ещё не существующую другую таблицу
Мне не с руки проверять, но нет, мне не кажется что ваш вывод по такой ошибке справедлив.
Скорее парсеру не нравится само выражение. Дамп снимался с базы этой же версии? Покажите строку из дампа на которой падает.
...
Рейтинг: 0 / 0
18.02.2019, 18:29
    #39775844
Лебедкин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Порядок создания таблиц с внешними ключами в mysqldump.
Melkij,
Падает здесь:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
DROP TABLE IF EXISTS `dinner_client_l_gift`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `dinner_client_l_gift` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `dlg_id` int(10) unsigned DEFAULT NULL,
  `clientId` int(10) unsigned DEFAULT NULL,
  `created` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `updated` datetime DEFAULT NULL,
  `expiry` datetime DEFAULT NULL,
  `activated` tinyint(3) unsigned NOT NULL,
  `ord_id` bigint(20) unsigned DEFAULT NULL,
  `promo_person` int(10) unsigned DEFAULT NULL,
  `dependent_person` int(10) unsigned DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `dlg_id` (`dlg_id`),
  KEY `clientId` (`clientId`),
  CONSTRAINT `dinner_client_l_gift_ibfk_1` FOREIGN KEY (`dlg_id`) REFERENCES `dinner_loyalty_gift` (`id`),
  CONSTRAINT `dinner_client_l_gift_ibfk_2` FOREIGN KEY (`clientId`) REFERENCES `clients` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=255 DEFAULT CHARSET=utf8;




Сама таблица dinner_loyalty_gift определена на несколько десятков строк ниже:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
DROP TABLE IF EXISTS `dinner_loyalty_gift`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `dinner_loyalty_gift` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `restaurantId` int(10) unsigned DEFAULT NULL,
  `giftType` tinyint(3) DEFAULT '1' COMMENT 'тип подарка. 1- сумма, 2- подарок, 3- скидка',
  `name` varchar(250) CHARACTER SET utf8 DEFAULT NULL,
  `description` varchar(250) CHARACTER SET utf8 DEFAULT NULL,
  `value` int(10) DEFAULT NULL COMMENT 'значение подарка, например, id товара, или процент скидки',
  `minOrdLimit` int(11) DEFAULT NULL,
  `ttl` int(8) unsigned DEFAULT '0' COMMENT 'время жизни в минутахасах, ноль - бесконечно',
  `created` datetime DEFAULT CURRENT_TIMESTAMP,
  `updated` datetime DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `restaurantId` (`restaurantId`),
  CONSTRAINT `dinner_loyalty_gift_ibfk_1` FOREIGN KEY (`restaurantId`) REFERENCES `object` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=latin1;
...
Рейтинг: 0 / 0
19.02.2019, 07:42
    #39776004
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Порядок создания таблиц с внешними ключами в mysqldump.
ЛебедкинСама таблица dinner_loyalty_gift определена на несколько десятков строк ниже:В этом случае ошибка легитимна - нельзя создать FK на то, чего нет. Порядок создания таблиц, увы, нужно корректировать вручную (в общем случае построение корректного порядка создания таблиц невозможно, ибо ничто не запрещает циклических зависимостей). Поэтому обычная практика - отдельно бэкап структуры (--no-data), который потом рихтуется руками, отдельно данные (--no-create-info).

Ещё лучше - сначала создание таблиц, потом создание ключей. Но это ещё более вдумчивая ручная рихтовка дампа структуры. Впрочем, делается-то это один раз, в отличие от бэкапа данных.
...
Рейтинг: 0 / 0
19.02.2019, 07:47
    #39776007
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Порядок создания таблиц с внешними ключами в mysqldump.
AkinaВ этом случае ошибка легитимна - нельзя создать FK на то, чего нет.Насколько я помню, set foreign_key_checks=0; должно помочь и в этом случае. Бывают же и кольцевые зависимости, которые порядком создания таблиц не исправишь.
...
Рейтинг: 0 / 0
19.02.2019, 07:48
    #39776008
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Порядок создания таблиц с внешними ключами в mysqldump.
ЛебедкинНе получилось! перед восстановлением сделал так:
Код: plaintext
set foreign_key_checks=0;
ошибка сохранилась.Как именно сделал?
...
Рейтинг: 0 / 0
19.02.2019, 08:13
    #39776013
Лебедкин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Порядок создания таблиц с внешними ключами в mysqldump.
AkinaЕщё лучше - сначала создание таблиц, потом создание ключей. Но это ещё более вдумчивая ручная рихтовка дампа структуры. Впрочем, делается-то это один раз, в отличие от бэкапа данных.
Но при малейшем изменении структуры данных, придется делать всё по новой ((
...
Рейтинг: 0 / 0
19.02.2019, 08:15
    #39776014
Лебедкин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Порядок создания таблиц с внешними ключами в mysqldump.
miksoftЛебедкинНе получилось! перед восстановлением сделал так:
Код: plaintext
set foreign_key_checks=0;
ошибка сохранилась.Как именно сделал?
В начало дамп-файла эту строчку добавил.
...
Рейтинг: 0 / 0
19.02.2019, 09:36
    #39776027
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Порядок создания таблиц с внешними ключами в mysqldump.
Лебедкинпри малейшем изменении структуры данных, придется делать всё по новойА никто не обещал, что будет легко...
...
Рейтинг: 0 / 0
04.03.2019, 09:40
    #39781729
Лебедкин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Порядок создания таблиц с внешними ключами в mysqldump.
Похоже проблема с порядком создания таблиц с внешними ключами возникает только в MariaDB. Когда я этот же дамп стал разворачивать на MySQL-5.7, все развернулось без проблем.
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Порядок создания таблиц с внешними ключами в mysqldump. / 13 сообщений из 13, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]