数据库版本控制和部署的解决方案?


11

目前,我使用转储脚本并将数据库提交到git repo。 --skip-extended-insert --skip-comments --skip-dump-date意味着diff可以使我对更改的内容有一个清晰的了解,但是如果我尝试合并,所有内容都会掉落。

WP_SITEURL,WP_HOME和所有其他wordpress存储完整URL的地方都需要在导入到另一个主机(测试,登台,生产)时进行更新

有人在使用更好的方法吗?

主要问题:

  • WordPress会在整个数据库中存储完整的URL(不可移植)
  • 许多其他不相关的记录发生更改
    • auto_increment值(我只是删除了这些值,但是遇到ID问题)
    • 时间戳记(也可能剥离)
    • 临时 *记录...不知道该如何处理

一个创建带有时间戳的迁移,仅添加或删除事物的过程将是理想的……但是我不确定是否有可能?


您要版本化所有数据更改还是仅更改结构更改?那才是您真正的业务任务?
Lazy Badger

当像WordPress那样对CMS进行更改时,通常会发生内容和配置(数据库数据)更改以及逻辑(代码)更改。我希望能够同时对两者进行版本控制。结构更改将是一个不错的开始。业务任务:客户要求新的小部件。在临时服务器上安装插件,提交回购->配置插件并添加示例内容->批准后,将代码更改拉入生产环境,然后在生产管理员中手动进行相同的数据更改。
Jacob Dorman 2014年

1
@JacobDorman我正在尝试解决这个完全相同的问题。你有工作了吗?经过研究后,我开始认为某些定制插件可以按顺序创建特定的更新脚本(可能仅导出配置更改(例如已安装的插件和配置选项),而不必导出一般的帖子,类别和内容) 。很想听听您是否还有其他想法。
维克托·洛佩斯·加西亚

Answers:


4

这是两个可能的解决方案,它们实际上都是通用的MySQL版本控制工具,但可以适应您的工作流程:

dbv.php

该工具根据在数据库上检测到的更改创建“迁移”,基本上是SQL脚本。这些脚本存储在本地目录中,因此可以提交到您当前的VCS(例如git)。

通过PHP Web界面使用。

DBVC

从根本上讲,它与以前的工具类似,它基于命令行界面。它是通过json文件配置的。主要区别在于它不会自动生成迁移文件。

要将其与以前的同类产品集成在一起,还有一个悬而未决的问题,因此需要寻找。

WordPress插件

一些有助于创建可重复工作流程的插件:


dbvc看起来像我一直在寻找的那种工具。谢谢!
Jacob Dorman 2014年

1
我很高兴它有所帮助。我刚刚发现了另一个有趣的工具,它并没有在一段时间更新,但它可能是值得采取的战利品:github.com/idler/MMP
维克托·洛佩斯·加西亚

@JacobDorman使用DBVC,您能够成功合并来自不同环境的数据库更改吗?我已经建立了自己的策略,但是DBVC是生成更新文件还是在SQL转储之间使用mysqldiff之类的东西?我无法想象这个工具是否有用,除非它有助于产生实际上可比较的SQL差异,尤其是在单独的行上插入INSERT语句参数...尽管我认为可以编辑一个文件来处理该问题...
Spencer Williams

@SpencerWilliams我最终没有使用DBVC(也没有使用mysqldiff),但仍然将db dumps添加到版本控制中……在大多数情况下,我并不是真正将它们视为可合并的,但是使用超越比较进行差异化可以帮助突出显示变化和问题。
Jacob Dorman

@victor我检查了MMP。它会进行模式更改,但不会进行数据差异/插入。
大卫·席尔瓦·史密斯

2

我正在MYSQL上执行此操作。

它将所有表的架构和数据放入它们自己的文件中,因此我可以轻松地看到已更改的内容。

与该线程中的大多数其他解决方案不同,该解决方案获取数据,这对于CMS很重要。

该解决方案不使用任何工具,仅使用命令行脚本。

编辑:我发现我的旧代码有一个错误,其中导入顺序很重要。脱掉--compact标志修复了该错误。

for x in `mysql --skip-column-names -u root -ppassword dbname -e 'show tables;'`; do
     echo exporting $x
     mysqldump -u root -ppassword --skip-add-drop-table --skip-add-locks --skip-disable-keys --skip-set-charset --extended-insert=FALSE --replace --skip-dump-date dbname $x > "./db/$x.sql"
done

较旧的代码

for x in `mysql --skip-column-names -u root -ppassword dbname -e 'show tables;'`; do
     mysqldump -u root -ppassword --compact --extended-insert=FALSE --replace dbname $x > "./db/$x.sql"
done

这是如何导入

for x in `ls ./db/*.sql`; do
     echo importing $x
     mysql -pdbpassword dbname --force < $x
done
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.