如何通过命令行在没有外键的情况下转储MySQL文件?

use*_*145 6 mysql mysqldump

我需要导出一个没有外键的大型数据库.执行此操作的命令是什么?

这是我尝试的但我知道这是不正确的.

mysqldump -u root -p DBNAME SET FOREIGN_KEY_CHECKS = 0; | gzip > database.sql.gzip
Run Code Online (Sandbox Code Playgroud)

cod*_*ler 10

您可以--init-command在每个会话的基础上使用该标志:

mysql --init-command="SET SESSION FOREIGN_KEY_CHECKS=0;" ... < dump.sql
Run Code Online (Sandbox Code Playgroud)


phi*_*kle 7

从这个SO线程:

您可以自动创建不强制执行外键约束的mysqldump文件吗?

MySQL 5.0.51附带的mysqldump命令(并根据4.1.1之后的更改日志版本)确实关闭了外键检查。默认情况下,mysqldump在转储文件的顶部包括以下行:

/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;

/ *!40014 ... * /语法是一个条件注释,将在MySQL 4.0.14及更高版本上执行。在转储文件的末尾将还原旧的外键检查设置:

/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;

  • 但这是问题的答案吗?这将导出所有外键,只需确保在导入期间不强制使用它们即可。 (12认同)
  • 看起来不像是我的答案。问题是要进行没有FK约束的转储,而不是暂时禁用它。转储文件仍将包含FK约束。 (5认同)

Mat*_*ice 5

这很丑陋,但我最终只是修改架构文件以删除外键。


仅转储架构,无外键

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
Run Code Online (Sandbox Code Playgroud)

sed查找在外键约束声明之前的行,并用尾随逗号替换这些行。 grep排除外键约束。

仅转储数据,不创建表

mysqldump -uuser -ppassword --no-create-info dbname > dbname_data.sql
Run Code Online (Sandbox Code Playgroud)

首先加载架构,然后加载数据

$ mysql -uuser -ppassword
> create database foo
> use foo
> source dbname_schema_no_fk.sql
> source dbname_data.sql
Run Code Online (Sandbox Code Playgroud)

已针对Linux(x86_64)在mysqldump Ver 10.13 Distrib 5.6.32-78.1中进行了测试。