【发布时间】:2009-09-28 19:39:37
【问题描述】:
如果我在开发服务器上工作并且对我们的某些版本的数据库结构进行了更新,那么在生产服务器上更新结构的最佳方法是什么?
目前我们创建一个仅包含该结构的新生产数据库,对“旧”生产数据库上的数据进行 SQL 转储,然后运行 SQL 查询将数据插入新数据库。
我知道有更简单的方法来进行这些更新,对吧?
提前致谢。
【问题讨论】:
标签: mysql sql database structure sql-update
如果我在开发服务器上工作并且对我们的某些版本的数据库结构进行了更新,那么在生产服务器上更新结构的最佳方法是什么?
目前我们创建一个仅包含该结构的新生产数据库,对“旧”生产数据库上的数据进行 SQL 转储,然后运行 SQL 查询将数据插入新数据库。
我知道有更简单的方法来进行这些更新,对吧?
提前致谢。
【问题讨论】:
标签: mysql sql database structure sql-update
我们不会在没有脚本的情况下在 prod 上运行任何东西,并且该脚本必须在源代码控制中。此外,我们必须编写一个回滚脚本,以防初始脚本出错并且我们必须将其退出。当我们转向 prod 配置管理时,会在 prod 和 dev 之间进行差异比较,看看我们是否遗漏了生产脚本中的任何内容(任何差异都必须可追溯到开发,我们还没有准备好转向 prod 并记录在案)。像 Red-gate 的 SQL compare 这样的产品可以做到这一点。我们的流程非常正式,因此我们可以维持大客户所需的认证。
如果您有大型表,即使更改表也可能会很慢,但在总时间上通常比使用新名称和结构复制表、将数据复制到该表、重命名旧表更有效,然后将新表命名为原始表的名称,然后删除旧表。
但是,有时这是一个更可取的过程,因为在这种情况下,用户明显的总停机时间是重命名两个表所需的时间,因此这对于仅从后端而不是应用程序(如果应用程序可以更新表,这样做是一种危险的做法,因为您可能会丢失在表转换时所做的更改)。使用什么流程取决于您所做更改的性质。应该在不允许用户访问数据库的维护窗口中进行一些更改。例如,如果您要向具有 100,000,000 条记录的表添加一个具有默认值的新字段,您可能会在更新发生时锁定用户使用该表。最好在非工作时间以单用户模式执行此操作(并且当用户被提前告知数据库将不可用时)。其他更改只需几毫秒,并且在用户登录时很容易发生。
【讨论】:
查看 alter table 以更改架构
这可能并不比你的方法简单,但它意味着更少的数据库复制
【讨论】:
这其实是一个很深奥的问题。如果您所做的唯一更改是添加一些列,那么 ALTER TABLE 可能就足够了。但是,如果您要重命名或删除列,那么 ALTER 语句可能会破坏各种外键约束。此外,有时您需要同时更改数据库和数据,这几乎是无法编写脚本的。
最有可能实现自动化的最佳方法是为每个部署编写一个简单的脚本(以及一个用于回滚的脚本!),我相信这基本上是像 Rails 这样的系统会为您做的事情。有些脚本可能只是 ALTER 语句,有些可能会暂时禁用外键检查和触发器等,有些可能还会运行一些更新语句。有些人可能会转储数据库并重建它。我认为这里没有一刀切的解决方案,抱歉:)
【讨论】:
使用 ALTER TABLE 命令:http://dev.mysql.com/doc/refman/5.0/en/alter-table.html
【讨论】: