如何转储MySQL数据库的结构并将其导入以使用现有数据更改表?

时间:2011-10-14 05:08:02

标签: mysql git mysqldump

首先给出一些上下文,我的用例是我的合作伙伴和我处于Web应用程序的早期阶段。数据库已经设计完毕,但我们最终还是对结构进行了更改以满足我们的需求。因此,我们需要一种向数据库传递结构变化的方法。我一直在尝试使用git存储mysqldumps,以便我们可以来回传递所有数据(以及还原错误),但由于我们的帖子主键冲突,我们遇到了重大冲突!如果有任何解决方法,我的问题的其余部分将基本上没有实际意义。假设没有解决方案, 我需要一些方法来转储可以在不从数据库表中删除所有现有数据的情况下运行的结构。

我已经学会了如何使用mysqdump -d转储MySQL数据库的结构。但是,这包括DROP和CREATE命令。因此,运行此SQL脚本会导致我的数据库为空(因为每个表在创建之前都会被删除)。我正在寻找一种方法来转储我的数据库结构,以便我可以导入它而不会丢失我的数据。简而言之,我希望能够转储数据库并输出ALTER命令,或类似的效果。

现在我已经解决了这个问题,似乎不太可能使用ALTER命令转储数据库。无论如何,有没有办法转储MySQL数据,以便它可以在不删除现有数据的情况下更改表的结构?

非常感谢!

帕拉贡

1 个答案:

答案 0 :(得分:2)

您已经有了答案 - 编写改变数据库结构的脚本,在git中对它们进行版本化,并提出运行它们的过程。无论谁改变结构,都应该在sql脚本中正式化这些更改。通常它只是创建表或alter table DDL。与任何其他类型的代码一样,应该测试这些更改。然后它很容易让你们中的任何一个从git获取最新的必需update.sql脚本,并通过命令行mysql或在工具中运行它。

有时只是改变表是不够的 - 您还需要进行转换数据的查询。我还将锁定相关表,以便在需要时可以针对生产运行这些查询。只需将脚本命名为name.sql,并建立一个约定,说明如何命名它们以及将它们存储在树中的位置。它可以像update_1.sql一样简单如果您已经对DDL进行了版本控制,可以将它们粘贴在该目录中。

另一件事......大多数alter table更改都不会影响数据库中的数据。在极少数情况下可能会出现问题,但您始终可以在脚本中编写变通方法,例如使用临时列或表,以及一些在翻译期间来回移动数据的SQL语句。

有些工具会为你做这类事情,但我不明白为什么你在控制结构变化时会需要它们。 PHP ORM Doctrine2具有其中一些功能,我见过其他产品提供相同类型的功能...比较2 db并确定结构更改和同步结构所需的DDL。当你们都想独立工作时,这对你没有帮助。

我的建议简单有效,并且已用于我参与的众多项目中。