我最近将一个数据库复制到了一个dev示例中,在对它做了大量工作之后,我发现它缺少了原始数据库的外键约束。纳入指标。我可以从只包含外键的原始数据库创建导出脚本吗?提前谢谢!
olmpazwi1#
首先,我想问一下,为什么它不在您的dev示例上创建外键?您是否将这些表创建为myisam表?myisam不支持外键,因此即使可以分离出正确的定义,也肯定无法创建它们。您可以使用 mysqldbcompare ,这是免费mysql实用程序中提供的工具。例如,我创建了一个 test 带表的数据库 foo 还有一张儿童桌 bar 使用外键引用 foo . 我复制了 test 数据库到 test2 数据库(仍在本地主机上)。然后我把外键掉在了车里 test2.bar table,所以有区别。我可以使用mysqldbcompare来检测这个差异,并输出所需的alter表来重新创建外键:
mysqldbcompare
test
foo
bar
test2
test2.bar
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
--server2
--difftype=sql
--changes-for=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
1条答案
按热度按时间olmpazwi1#
首先,我想问一下,为什么它不在您的dev示例上创建外键?您是否将这些表创建为myisam表?myisam不支持外键,因此即使可以分离出正确的定义,也肯定无法创建它们。
您可以使用
mysqldbcompare
,这是免费mysql实用程序中提供的工具。例如,我创建了一个
test
带表的数据库foo
还有一张儿童桌bar
使用外键引用foo
. 我复制了test
数据库到test2
数据库(仍在本地主机上)。然后我把外键掉在了车里test2.bar
table,所以有区别。我可以使用mysqldbcompare来检测这个差异,并输出所需的alter表来重新创建外键:
在我的例子中,两个数据库都在localhost示例上,但它们可能在不同的服务器上。我只需要指定
--server1
以及--server2
选项。--difftype=sql
表示输出sql语句以使两个数据库同步。--changes-for=server2
意味着我希望server2改变以匹配另一个。test:test2
命名要比较的数据库。如果它们位于不同的服务器上,则它们可能都具有相同的数据库名称。输出如下:
看起来它将尝试创建fk来引用旧的数据库名称
test
. 如果我用这个,它不会做我想做的,所以我必须在运行它之前编辑它。如果您在不同的服务器上比较一个副本,可能数据库名称没有改变,所以它可以正常工作。默认情况下,它还会比较每个表中的数据,但是有一些选项可以跳过这些测试。
有关更多信息,请阅读文档:https://dev.mysql.com/doc/mysql-utilities/1.6/en/mysqldbcompare.html