首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在现实世界中“升级”数据库?

如何在现实世界中“升级”数据库?
EN

Stack Overflow用户
提问于 2010-06-03 14:04:01
回答 3查看 149关注 0票数 6

我公司使用php + mysql开发了一个web应用程序。系统可以向用户显示产品的原价和折扣价。如果你没有登录,你会得到原价,如果你登录了,你会得到折扣价格。这很容易理解。

但是我的公司想要在系统中有更多的功能,它想根据不同的用户显示不同的价格。例如,用户A是一个黄金玩家,他可以获得50%的折扣。用户B是银牌合作伙伴,只有30%的折扣。但是这个逻辑没有在原始系统中准备好,所以我需要在数据库中添加一些属性,至少在本例中是一个用户类型。关于如何将当前数据库合并到我的新版本数据库中,有什么建议吗?另外,所有的数据都应该保存下来,服务器应该全天候工作。(在停止数据库的范围内)

这样做是可能的吗?另外,对未来的维护有什么建议吗?太赫兹u。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-06-03 15:36:18

您是否使用ORM作为数据访问层?我知道Doctrine有一个迁移API,它允许版本上下切换(以防新版本出现问题)。

在任何框架或ORM考虑之外,快速脚本将最小化减慢(或如果进程太长则停机)。

在我看来,我更喜欢30秒的网站访问中断和信息页面,而不是更短的中断时间,但得到可见的错误或根本没有显示。如果中断时间很重要,最好在晚上或流量较少的时候执行此操作。

这一切都可以在一个脚本中完成(或者至少通过一个命令行启动),当我们想要执行包含在shell脚本中的脚本时:

  • 将应用程序置于待机状态(临时静态页):您可以使用.htaccess重定向或任何适用于您的应用程序/服务器的更新(或切换)来升级
  • 空缓存、清理临时文件等。
  • 重建生成的类(使用ALTER / CREATE TABLE查询
  • 的symfony

DB structure如果需要,将数据从旧结构迁移到新结构:根据结构的不同,可能需要在更改DB结构之前获取数据,或使用临时表。H113如果一切顺利,删除临时页面。Upgrade done

  • 如果出现问题,将向操作员显示一条红色消息,以便操作员可以看到发生的情况,尝试修复它,然后手动删除等待的页面。

脚本应该在每个步骤都进行检查,并停止第一个错误,并且应该详细(但简洁)说明它在所有步骤中所做的事情,因此如果出现问题,您可以更快地修复应用程序。最好的是一个可恢复的脚本(步骤2中的错误-停止进程-手动修复-步骤3中的恢复),我从来没有花时间以这种方式实现它。

If工作得很好,但这些类型的脚本必须在尽可能接近生产环境的环境中进行密集测试。一般来说,我们在本地开发这样的脚本,并在与生产环境相同的平台上测试它们(只是不同的路径和DB)

如果不能选择等待页面,则可以不使用该页面,但需要确保数据和用户会话的完整性。例如,在升级/数据传输期间对表使用锁,对修改后的文件使用排它锁(我认为是SVN)

还有其他更好的解决方案,但它基本上就是我使用的,它为我们做了这项工作。主要的缺点是在每个主要版本都必须重写脚本,这促使我寻找其他选择来做到这一点,但哪一个?如果这里有人有更好更简单的选择,我会很高兴的。

票数 0
EN

Stack Overflow用户

发布于 2010-06-03 14:07:58

http://dev.mysql.com/doc/refman/5.1/en/alter-table.html

下面是更具体的ALTER TABLE示例。

http://php.about.com/od/learnmysql/p/alter_table.htm

可以使用ALTER TABLE将必要的列添加到表中,然后使用UPDATE为每个用户设置用户类型。然后部署应用程序的新版本。使用新列的。

票数 1
EN

Stack Overflow用户

发布于 2010-06-03 14:10:27

我建议您编写一个工具,以增量方式对您的数据库运行SQL查询。很像Rails迁移。

在我目前工作的系统中,我们用python编写了这样的工具,我们将脚本命名为类似000000_somename.sql的名称,其中0是配置管理(subversion)中的修订号,该工具作为开发/测试的一部分运行,最后部署到生产环境。

这有一个好处,就是能够在数据库更改方面追溯到过去,就像在代码中一样(如果您使用源代码版本控制工具)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2963641

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档