Php 从版本化mysql模式开始,不要过度使用。好的解决方案?

Php 从版本化mysql模式开始,不要过度使用。好的解决方案?,php,mysql,svn,version-control,database-versioning,Php,Mysql,Svn,Version Control,Database Versioning,我已经意识到必须开始对数据库模式和更改进行版本控制。因此,我阅读了关于该主题的现有帖子,但我不确定如何继续 我基本上是一个人的公司,不久前我甚至没有对我的代码使用版本控制。我在一个windows环境中,使用Aptana(IDE)和SVN(带Tortoise)。我从事PHP/mysql项目 什么是一种有效且充分(无过度杀伤力)的方式来版本化我的数据库模式 我确实在一些项目中有一两个自由职业者,但我不希望有太多的分支和合并。因此,基本上我希望跟踪代码修订的并发模式 [编辑]即时解决方案:目前我决定只

我已经意识到必须开始对数据库模式和更改进行版本控制。因此,我阅读了关于该主题的现有帖子,但我不确定如何继续

我基本上是一个人的公司,不久前我甚至没有对我的代码使用版本控制。我在一个windows环境中,使用Aptana(IDE)和SVN(带Tortoise)。我从事PHP/mysql项目

什么是一种有效且充分(无过度杀伤力)的方式来版本化我的数据库模式

我确实在一些项目中有一两个自由职业者,但我不希望有太多的分支和合并。因此,基本上我希望跟踪代码修订的并发模式

[编辑]即时解决方案:目前我决定只要提交一个标记(稳定版本),就用必要的初始数据进行模式转储。在现阶段,这似乎对我来说已经足够了


[edit2]另外,我现在还使用了第三个名为increments.sql的文件,在其中我将所有更改与日期等放在一起,以便于在一个文件中跟踪更改历史记录。有时我会将更改集成到另外两个文件中,并清空增量。对于小公司来说,一个简单的方法是:将数据库转储到sql中,然后将其添加到存储库中。然后,每次更改某些内容时,都将更改添加到转储文件中

然后,您可以使用diff来查看版本之间的更改,更不用说使用注释来解释您的更改了。这也将使您几乎不受MySQL升级的影响

我看到的一个缺点是,您必须记住手动将SQL添加到转储文件中。你可以训练自己时刻记住,但是如果你和别人一起工作,要小心。错过一个更新可能是一个痛苦以后

这可以通过创建一些精心制作的脚本来减轻,当你提交到subversion时,可以为你做这件事,但对于一个人秀来说,这有点过分

编辑:在这一年里,我不得不为一个小团队实施MySQL版本控制方案。手动添加每个更改被视为一个麻烦的解决方案,就像在评论中提到的那样,因此我们开始转储数据库并将该文件添加到版本控制中

我们发现,测试数据最终进入了转储,这使得我们很难找出发生了什么变化。这可以通过只转储模式来解决,但这对于我们的项目来说是不可能的,因为我们的应用程序依赖于数据库中的某些数据来运行。最终,我们返回到手动向数据库转储添加更改


这不仅是最简单的解决方案,而且还解决了某些MySQL版本在导出/导入时遇到的某些问题。通常,我们必须转储开发数据库,删除任何测试数据、日志条目等,删除/更改某些名称(如果适用),然后才能创建生产数据库。通过手动添加更改,我们可以精确地控制最终在生产中的内容,一次一点,以便最终一切就绪,并尽可能轻松地转移到生产环境中。

通过这样做生成的版本控制文件如何:

mysqldump --no-data database > database.sql

在我工作的地方,我们为每个新版本的应用程序都有一个安装脚本,其中包含升级所需的sql。这对于6个开发人员来说已经足够好了,并且为维护版本提供了一些分支。我们正在考虑转移到自动修补程序,该程序处理将哪些修补程序应用于您正在升级的任何数据库的问题。使用auto Patch处理分支可能会有一些小的复杂问题,但听起来这对您来说并不是问题。

我想,像这样的批处理文件应该可以完成这项工作(不要太努力)

mysqldump--no data-ufoo-pbar dbname>path/to/app/schema.sql
svn提交路径/to/app/schema.sql


更改模式后只需运行批处理文件,或者让cron/调度器执行(但我不知道…我认为,如果时间戳更改,即使内容相同,也会提交工作。不知道这是否会有问题。)

主要想法是在项目基本路径中有一个具有此结构的文件夹

/__DB
—-/changesets
——–/1123
—-/data
—-/tables
现在,你有3个文件夹: 表格 保存表创建查询。我建议使用命名“table_name.sql”

数据 保存表插入数据查询。我建议使用相同的命名“table_name.sql”。 注意:并非所有表都需要数据文件,您只需要在项目安装时添加需要此初始数据的表

变更集 这是您将使用的主文件夹。 这将保存对初始结构所做的更改集。这实际上保存了带有变更集的文件夹。 例如,我添加了一个文件夹1123,其中包含在修订版1123中所做的修改(编号来自您的代码源代码管理),并且可能包含一个或多个sql文件

我喜欢将它们添加到命名为xx_tablename.sql的表中-xx是一个数字,它告诉您它们需要运行的顺序,因为有时您需要按照特定的顺序运行修改

注意: 当您修改一个表时,您也会将这些修改添加到表和数据文件中…因为这些文件将用于执行新安装

这是主要的想法


有关更多详细信息,您可以在我们公司查看此信息,我们是这样做的:

我们将所有表/db对象放在它们自己的文件中,比如
tbl\u Foo.sql
。这些文件包含几个用分隔符分隔的“部分”

-- part: create
如果
create
只是给定零件的描述性标识,则该文件如下所示:

-- part: create
IF not exists ...
CREATE TABLE tbl_Foo ...
-- part: addtimestamp
IF not exists ...
BEGIN
   ALTER TABLE ...
END
然后我们有一个xml文件,它引用了我们想要执行的每个部分
<playlist>
   <classes>
     <class name="table" desc="Table creation" />
     <class name="schema" desc="Table optimization" />
   </classes>
   <dbschema>
      <steps db="a_database">
         <step file="tbl_Foo.sql" part="create" class="table" />
         <step file="tbl_Bar.sql" part="create" class="table" />
      </steps>
      <steps db="a_database">
         <step file="tbl_Foo.sql" part="addtimestamp" class="schema" />
      </steps>
   </dbschema>          
</playlist>