我需要导出没有外键的大型数据库。执行此操作的命令是什么?
这是我尝试的但我知道这是不正确的。
mysqldump -u root -p DBNAME SET FOREIGN_KEY_CHECKS = 0; | gzip > database.sql.gzip
答案 0 :(得分:5)
从这个SO线程:
Can you automatically create a mysqldump file that doesn't enforce foreign key constraints?
MySQL 5.0.51中包含的mysqldump命令(根据4.1.1以来的更改日志版本)确实关闭了外键检查。默认情况下,mysqldump在转储文件的顶部包含以下行:
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/ *!40014 ... * / syntax是一个条件注释,将在MySQL 4.0.14及更高版本上执行。旧的外键检查设置将在转储文件的末尾恢复:
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
答案 1 :(得分:3)
这很难看,但我最后只修改了架构文件以删除外键。
mysqldump -uuser -ppassword --no-data dbname | sed '$!N;s/^\(\s*[^C].*\),\n\s*CONSTRAINT.*FOREIGN KEY.*$/\1/;P;D' | grep -v 'FOREIGN KEY' > dbname_schema_no_fk.sql
sed
查找在外键约束声明之前的行,并用自己替换这些行,减去尾随逗号。 grep
排除外键约束。
mysqldump -uuser -ppassword --no-create-info dbname > dbname_data.sql
$ mysql -uuser -ppassword
> create database foo
> use foo
> source dbname_schema_no_fk.sql
> source dbname_data.sql
使用mysqldump Ver 10.13 Distrib 5.6.32-78.1测试,适用于Linux(x86_64)。
答案 2 :(得分:2)
您可以在每个会话的基础上使用--init-command
标记:
mysql --init-command="SET SESSION FOREIGN_KEY_CHECKS=0;" ... < dump.sql