【问题标题】:How do I dump MySQL file without Foreign Keys via command line?如何通过命令行转储没有外键的 MySQL 文件?
【发布时间】:2012-06-15 18:25:21
【问题描述】:

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

这是我尝试过的,但我知道这是不正确的。

mysqldump -u root -p DBNAME SET FOREIGN_KEY_CHECKS = 0; | gzip > database.sql.gzip

【问题讨论】:

标签: mysql mysqldump


【解决方案1】:

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

mysql --init-command="SET SESSION FOREIGN_KEY_CHECKS=0;" ... < dump.sql

【讨论】:

  • 这是最简单最干净的解决方案。这也适用于管道 mysqldumpmysql
【解决方案2】:

来自这个 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 ... */ 语法是一个条件注释,将在 MySQL 4.0.14 及更高版本上执行。旧的外键检查设置在转储文件的末尾恢复:

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

【讨论】:

  • 但这就是问题的答案吗?这会导出所有外键,只是确保它们在导入期间不会被强制执行。
  • 这看起来不像是我的答案。问题是要有一个没有 FK 约束的转储,而不是暂时禁用它。转储文件仍将包含 FK 约束。
【解决方案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)。

【讨论】:

    猜你喜欢
    • 2017-01-14
    • 2011-07-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多