mysql:仅复制外键

50few1ms  于 2021-06-21  发布在  Mysql
关注(0)|答案(1)|浏览(363)

我最近将一个数据库复制到了一个dev示例中,在对它做了大量工作之后,我发现它缺少了原始数据库的外键约束。纳入指标。我可以从只包含外键的原始数据库创建导出脚本吗?
提前谢谢!

olmpazwi

olmpazwi1#

首先,我想问一下,为什么它不在您的dev示例上创建外键?您是否将这些表创建为myisam表?myisam不支持外键,因此即使可以分离出正确的定义,也肯定无法创建它们。
您可以使用 mysqldbcompare ,这是免费mysql实用程序中提供的工具。
例如,我创建了一个 test 带表的数据库 foo 还有一张儿童桌 bar 使用外键引用 foo . 我复制了 test 数据库到 test2 数据库(仍在本地主机上)。然后我把外键掉在了车里 test2.bar table,所以有区别。
我可以使用mysqldbcompare来检测这个差异,并输出所需的alter表来重新创建外键:

mysqldbcompare 
  --server1=root:password@localhost 
  --server2=root:password@localhost 
  --difftype=sql 
  --run-all-tests 
  --changes-for=server2 
  test:test2

在我的例子中,两个数据库都在localhost示例上,但它们可能在不同的服务器上。我只需要指定 --server1 以及 --server2 选项。 --difftype=sql 表示输出sql语句以使两个数据库同步。 --changes-for=server2 意味着我希望server2改变以匹配另一个。 test:test2 命名要比较的数据库。如果它们位于不同的服务器上,则它们可能都具有相同的数据库名称。
输出如下:


# server1 on localhost: ... connected.

# server2 on localhost: ... connected.

# Checking databases test on server1 and test2 on server2

# 

# Defn    Row     Data

# Type      Object Name                             Diff    Count   Check

# -------------------------------------------------------------------------

# TABLE     bar                                     FAIL    pass    -

# - Compare table checksum                                FAIL

# - Find row differences                                  pass

# 

# Transformation for --changes-for=server2:

# 

ALTER TABLE `test2`.`bar` 
ADD CONSTRAINT bar_ibfk_1 FOREIGN KEY(foo_id) REFERENCES `test`.`foo`(id);

# TABLE     foo                                     pass    pass    -

# - Compare table checksum                                FAIL

# - Find row differences                                  pass

# Database consistency check failed.

# 

# ...done

看起来它将尝试创建fk来引用旧的数据库名称 test . 如果我用这个,它不会做我想做的,所以我必须在运行它之前编辑它。如果您在不同的服务器上比较一个副本,可能数据库名称没有改变,所以它可以正常工作。
默认情况下,它还会比较每个表中的数据,但是有一些选项可以跳过这些测试。
有关更多信息,请阅读文档:https://dev.mysql.com/doc/mysql-utilities/1.6/en/mysqldbcompare.html

相关问题