Я сбросил базу данных mysql, используя mysqldump, с помощью следующей команды:
mysqldump --no-create-db --no-create-info --compact --single-transaction --complete-insert --extended-insert=FALSE --flush-logs -uroot -ppassword databasename > databasename.db.data.dump.sql
Причина, по которой я использовал указанные выше параметры, заключалась в том, что мне нужно было:
- ТОЛЬКО дампданные
- Не создавать никаких операторов DDL, таких как CREATE TABLE и т. д.
У меня есть скрипт, который генерирует базу данных CLEAN (т.е. базу данных со структурами данных - таблицами, индексами и т. д., ноНЕТ данных).
Я хочу импортировать данные, выгруженные с помощью приведенной выше команды, в базу данных CLEAN.
Я пытаюсь импортировать сброшенные данные (т.е. восстановить данные) в CLEANбазы данных, введя следующую команду:
mysql -h hostname -u user --password=password databasename < filename
Когда я запускаю эту команду, я получаю следующую ошибку:
ERROR 1452 (23000) at line 13: Cannot add or update a child row: a foreign key constraint fails (`tpwsdb`.`sf_guard_group_permission`, CONSTRAINT `sf_guard_group_permission_FK_2` FOREIGN KEY (`permission_id`) REFERENCES `sf_guard_permission` (`id`) ON DELETE CASCADE)
Строка 13 в файле выгруженных данных:
INSERT INTO `sf_guard_group_permission` (`group_id`, `permission_id`) VALUES (1,1);
схема для sf_guard_group_permission:
mysql> describe sf_guard_group_permission;
+---------------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------------+---------+------+-----+---------+-------+
| group_id | int(11) | NO | PRI | NULL | |
| permission_id | int(11) | NO | PRI | NULL | |
+---------------+---------+------+-----+---------+-------+
2 rows in set (0.00 sec)
Permission_id - это FK в таблице sf_guard_permission.Из-за ошибки кажется, что mysql пытается заполнить таблицу зависимостями (так сказать, дочерней таблицей), ДО заполнения родительской таблицы.
После проверки содержимого выгруженного файла я вижу, что действительно операторы INSERT для зависимой (дочерней) таблицы PRECEDE и для родительской таблицы - что явно нарушает ограничения ссылочной целостности для таблицы.
Эта ошибка, по-видимому, вызвана порядком, в котором операторы INSERT создаются mysqldump, который, как ни странно, не обращает внимания на RI
Есть ли в любом случае принудительный порядок, в которомmysqldump создает операторы INSERT - т.е. чтобы таблицы, являющиеся FK в других таблицах, появлялись перед таблицами, на которые они ссылаются?
Я бы вручную изменил порядок отображения операторов INSERT, но файл содержит почти 10 тыс. строк,и я не наслаждаюсь перспективой сделать это.
Кто-то, должно быть, сталкивался с этой проблемой прежде, чем использовать mysqldump - как решить эту проблему?