Sql 数据库部署:脚本还是备份

Sql 数据库部署:脚本还是备份,sql,sql-server,deployment,Sql,Sql Server,Deployment,如果您有一位DBA负责在实时环境中部署数据库,您会选择给他什么?数据库创建脚本或备份,他可以恢复到现有数据库?有哪些优点/缺点?(我们使用的是MSSQLS2000和MSSQLS2005)数据库创建脚本更好-您可以随时打开记事本并修复它。我不确定备份选项,但使用数据库创建脚本,dba可以根据需要设置数据库(必须、权限等)然后用脚本创建表等。我更喜欢用于部署的脚本,它们的干扰性要小得多。恢复将覆盖整个数据库、数据和所有内容,这在您的生产环境中可能不是一个好主意。对于第一次部署;数据库备份。。。它是如

如果您有一位DBA负责在实时环境中部署数据库,您会选择给他什么?数据库创建脚本或备份,他可以恢复到现有数据库?有哪些优点/缺点?(我们使用的是MSSQLS2000和MSSQLS2005)

数据库创建脚本更好-您可以随时打开记事本并修复它。

我不确定备份选项,但使用数据库创建脚本,dba可以根据需要设置数据库(必须、权限等)然后用脚本创建表等。

我更喜欢用于部署的脚本,它们的干扰性要小得多。恢复将覆盖整个数据库、数据和所有内容,这在您的生产环境中可能不是一个好主意。

对于第一次部署;数据库备份。。。它是如此的快和容易

如果数据库已处于活动状态;它必须是一系列编号的脚本。就个人而言,我对脚本进行编号,并且只通过脚本对数据库进行更改。这确保了所有数据库都是同步的,或者可以很容易地使其同步


有些人认为这是一种肛门。。。但我永远不会遇到生产部署问题。

虽然我同意John关于使用数据库备份的第一个部署建议,但我更喜欢至少让脚本可供审查,以便检查编码标准、性能评估等

如果您希望将已经审核过的内容交钥匙,那么备份/恢复对于第一次部署来说是一个完美的选择,如果该数据库中存在已“暂存”的配置数据,则更是如此。这有助于避免冗长或复杂的insert语句


这是一个给定的版本,超过第一个将被脚本。在我们的环境中,我们需要发行说明来指定脚本的服务器、实例和路径。脚本应以数字顺序提供,由目标数据库分隔成文件夹,并带有第二组回滚脚本。我们甚至要求每个脚本的顶部都有一个USE语句,这样我们就不必担心在主数据库中创建新对象了!;)

我更喜欢脚本,因为您可以将其放入存储库并跟踪它。您还可以非常轻松地在远程服务器上运行它。

在源代码管理下使用脚本-一个可爱的附带好处是,您可以建立数据库中每个对象的可搜索历史记录,并且它是人类可读的。备份是黑匣子——你不知道它们会对你的数据库做什么。

我会用脚本——人类可读性的结合,源代码控制的兼容性和轻松处理数据库引擎升级的潜力使这成为我们组织的一种方式。

由于SQL脚本可以进行版本控制,所以一定要使用SQL脚本。最好将它们变小,并有某种批处理以已知顺序(增量)运行它们,以便在已投入生产的数据库中轻松运行它们

SQL脚本的另一种选择是使用迁移框架。您可以在源代码中以小步骤指定数据库更改。迁移框架的好处是,不懂SQL的程序员可以简单地对数据库进行更改(但这并不意味着不需要了解一些数据库基础知识)

它们非常明确地说明了如何在增量步骤中建立和拆除数据库。这使得在不同版本的数据库系统或应用程序中测试和重新创建bug变得更加容易

我所知道的一些迁移框架示例如下:

  • 对于在生成脚本(如msbuild)中运行的.NET
  • 使用通过Rake运行的迁移

备份意味着实际备份数据库。随着数据库的增长,可移植性降低。所以程序员只需要数据的一个子集。出于安全原因,他们应该处理测试数据,而不是真实数据。有一些测试数据生成器在手是一种很好的做法,这样开发人员和测试人员就可以通过他们的实现进行测试,而不会破坏生产中的数据。

而使用数据库备份是初始部署的一种简单解决方案,如果部署在区域设置与备份服务器不同的服务器上,这可能不是一个好的解决方案。我们过去曾使用过这种方法,但在事后我们的客户在海外遇到了排序冲突问题。数据库备份保留其排序规则,而脚本将使用服务器的默认排序规则创建数据库(除非您指定)。出于这个原因,我们已经转移到脚本进行初始部署和后续更新。