【问题标题】:How to Deploy Database Changes to a Live Server?如何将数据库更改部署到实时服务器?
【发布时间】:2011-07-07 14:11:39
【问题描述】:
我有一个脚本,它是我的部署过程的一部分,用于将数据库更改推送到生产服务器。如果脚本由于某种原因(错误的更新)损坏了我的数据,则很难恢复。
解决此问题的一种方法是在更新时向用户关闭应用程序,因此如果出现问题,只需回到我在部署之前所做的备份即可。
但是我听说其他人部署并保持其站点运行...您将如何执行此操作,如果您失败了,您如何恢复自从您在部署前备份后传入的数据?
【问题讨论】:
标签:
mysql
sql-server
oracle
postgresql
rdbms
【解决方案1】:
这通常是一个棘手的问题,就像数据库管理中的许多事情一样。基本上有三种方法可以解决这个问题:
- 不惜一切代价避免失败。
- 锁定所有内容(并使升级速度非常快)。
- 可以丢失数据。
如果您有一个复杂的系统,请根据这些或类似类别隔离您的组件。
有一个暂存系统来测试升级。暂存系统或多或少是生产系统的副本;它与测试系统分开。另一件事是有一个审计或日志系统,如果您需要重放数据,可以参考。
真正的问题是,如果您在很久以后才注意到您的升级有问题。那你就完蛋了。
【解决方案2】:
您的数据库有多大?您能否承担在客户使用数据时以及您必须进行备份之前丢失更新的数据?每个部署计划都在某处涉及一些妥协,您必须决定哪些妥协对您想要做的事情最不痛苦。
对于只运行 pgsql 的简单网站,您可以断开客户端,并在一个大事务中运行整个更新。如果任何部分失败,整个事情就会回滚,就像你什么都没做一样。遗憾的是,这对其他数据库并不完全相同,但是通过闪回或任何 oracle 调用它,您可以获得类似的东西。
对于在复制的数据库服务器集之上运行的更大、更复杂的网站,事情变得更复杂更快。在我工作的地方,我们使用了 Slony,当您部署 DDL 更改时,与其他人一起玩并不好,而且您几乎必须在部署 DDL 时让所有客户离线。然而,停机时间对我们来说是以分钟为单位衡量的,即使数据库大小接近 1TB。