mysqldump : Дамп базы c внешними ключами

Panchous

Павел
mysqldump : Дамп базы c внешними ключами

Для дампа базы (test) использую:
mysqldump --user=root --password= --opt --quote-names --all --result-file=dump.sql --compress test
Все прекрасно работает.

Но восстановить базу из полученного sql-дампа не удается.
В базе используются таблицы InnoDB с внешними ключами.
MySQL правомерно ругается на то, что не может создать таблицу с внешним ключом,
ссылающимся на несуществующее поле др. таблице (код родительской таблицы может идти в дампе ниже)

Как правильно создавать дамп такой базы?
(или правильно использовать полученный)
Вроде, был какой-то ключик, включающий/отключающий проверку целостности БД. Никак найти не могу.
Подскажите, плз.

----
MySQL 4.0.x
 

Panchous

Павел
Автор оригинала: chira
--disable-keys
да, спасибо.
с этим ключем перед кодом таблицы добавляется строчка:
/*!40000 ALTER TABLE `department` DISABLE KEYS */;
Может, я не догоняю немного...
Но зачем она закомменчена?
Можно ли как-то mysqldump'ом создать sql-дамп, чтобы потом его не модифицировать - а просто отдать MySQL при восстановлении БД?

-~{}~ 21.07.05 14:42:

и вообще, это в тему?
из мана:
При использовании команды ALTER TABLE для таблиц MyISAM все неуникальные индексы создаются в отдельном пакете (подобно REPAIR). Благодаря этому команда ALTER TABLE при наличии нескольких индексов будет работать быстрее.

Начиная с MySQL 4.0, вышеуказанная возможность может быть активизирована явным образом. Команда ALTER TABLE ... DISABLE KEYS блокирует в MySQL обновление неуникальных индексов для таблиц MyISAM. После этого можно применить команду ALTER TABLE ... ENABLE KEYS для воссоздания недостающих индексов. Так как MySQL делает это с помощью специального алгоритма, который намного быстрее в сравнении со вставкой ключей один за другим, блокировка ключей может дать существенное ускорение на больших массивах вставок.
-~{}~ 21.07.05 14:44:

Видимо, для InnoDB единственный выход:
To make it easier to reload dump files for tables that have foreign key relationships, mysqldump automatically includes a statement in the dump output to set FOREIGN_KEY_CHECKS to 0 as of MySQL 4.1.1. This avoids problems with tables having to be reloaded in a particular order when the dump is reloaded. For earlier versions, you can disable the variable manually within mysql when loading the dump file like this:

mysql> SET FOREIGN_KEY_CHECKS = 0;
mysql> SOURCE dump_file_name
mysql> SET FOREIGN_KEY_CHECKS = 1;

This allows you to import the tables in any order if the dump file contains tables that are not correctly ordered for foreign keys. It also speeds up the import operation. FOREIGN_KEY_CHECKS is available starting from MySQL 3.23.52 and 4.0.3.
 

Panchous

Павел
Автор оригинала: Profic
Panchous

В мануал. Нифига она не закомменчена. Вернее закомменчена для MySQL <4.0.0.
Почему тогда при выполнении кода из полученного дампа MySQL сообщает:
MySQL error: 150 = Foreign key constraint is incorrectly formed
C вышеуказанным ключиком имеем такой код (для одной таблицы):
--
-- Table structure for table `news2department`
--

DROP TABLE IF EXISTS `news2department`;
CREATE TABLE `news2department` (
`news_id` int(11) NOT NULL default '0',
`department_id` int(11) NOT NULL default '0',
PRIMARY KEY (`news_id`,`department_id`),
KEY `news_id` (`news_id`),
KEY `department_id` (`department_id`),
CONSTRAINT `news2department_ibfk_1` FOREIGN KEY (`news_id`) REFERENCES `news` (`news_id`),
CONSTRAINT `news2department_ibfk_2` FOREIGN KEY (`department_id`) REFERENCES `department` (`department_id`)
) TYPE=InnoDB COMMENT='Отношение новостей к отделам';

--
-- Dumping data for table `news2department`
--


/*!40000 ALTER TABLE `news2department` DISABLE KEYS */;
LOCK TABLES `news2department` WRITE;
INSERT INTO `news2department` VALUES (1,2);
UNLOCK TABLES;
/*!40000 ALTER TABLE `news2department` ENABLE KEYS */;
-~{}~ 21.07.05 15:36:

Этот ключ влияет только на вставку.
Но перед этим необходимо создать таблицу!
А она не создается из-за неправильной ссылки внешнего ключа.
И надо юзать FOREIGN_KEY_CHECKS ...
Я правильно понимаю?
 

Profic

just Profic (PHP5 BetaTeam)
Panchous
надо юзать FOREIGN_KEY_CHECKS ...
Я правильно понимаю?
Да. Мой пост был исключительно про "закомменченность".

ЗЫ. Кстати кому-то я уже отвечал про FOREIGN_KEY_CHECKS, не тебе ли случаем?
 
Сверху