一次更新多个 SQL 数据库中的 SQL 模式
Updating SQL Schema in Multiple SQL Databases at One Time
我们的问题是我们有一个包含个人身份数据的在线申请。我们已将此应用程序出售给多个客户,他们所在州的法律规定数据必须实际存在于他们所在的州。所以这就是为什么我们在不同位置有相同的数据库(不是相同的数据)。
现在我们使用 RedGate SQL 比较,但随着我们的不断发展,每次更新都要这样做八、九、十次(无论是小的存储过程错误修复还是更大的更改创建new table) 变得越来越低效。市场营销告诉我们还有五个州即将到来。
我们研究了 RedGate 方法,但它的编码和故障排除比它的价值更多。
那么...有什么想法可以将 SCHEMA 从一个数据库更新到多个数据库吗?
我假设这是 SQL 服务器,因为您指定的是“RedGate SQL 比较”而不是“MySQL 比较”。如果不是 SQL 服务器,请忽略它。
无需采用新的工具集(或什至为某些东西向 RedGate 付费)并且由于数据库(而非数据)相同,您可以设置一个中央管理服务器 (Microsoft documentation on that here),注册每个单个 SQL 服务器实例,构建您的部署脚本(您仍然可以使用 SQL 比较),然后使用 CMS 将架构更改同时推送到所有实例或随意定义组。
这假设您正在对所有服务器使用 windows 身份验证,并且执行部署的任何人都将在所有服务器上拥有相同的访问权限,但这对于 multi-server 这种类型的一般管理,它是一个可靠的功能,已经存在了一段时间 (2008)。
SQL Management Studio 中有一个功能可以使用。在 SMS 中使用 CTRL-ALT-G。这带来了 'Registered Servers'。在本地组下,您可以创建组。说一个用于测试,一个用于现场。然后在您创建的本地组上 right-click 并选择“新服务器注册”。在“常规”选项卡下,您为其命名,然后在“连接属性”选项卡中,您 select 只是一个数据库。继续为组中所需的每个数据库添加“新服务器注册”。完成后,只需右键单击您的组并选择新建查询。你放在那里的任何东西都会 运行 在组中的所有数据库上。
因此,如果我们所有的数据库都相同,并且您需要进行更新,请使用 Redgate 进行比较。选择 'Create a Deployment Script' 而不是 'Deploy Using SQL Compare' 并复制 SQL。 Right-click 在组中说“新查询”粘贴并执行。
我在Redgate工作,所以我很想宣传它,但是暂时忽略它。
如果您想同时自动部署到大量服务器,我建议您使用 Azure DevOps Pipelines 或 AWS DeveloperTools 之类的工具,甚至是 Octopus 或 Jenkins 之类的第三方产品。这个想法很简单,使用任何你喜欢的工具,直到你的键盘,来创建部署所需的工件(你的 T-SQL 脚本用于 SQL 服务器)。然后,这些流量控制工具之一中的代理会执行确保脚本部署到多个位置的繁重工作。因为您可以为这些代理配置独立的安全性,所以您自己不必拥有通过 SSMS 或中央管理服务器控制内容所需的相同级别的安全性。此外,这种方法允许非常容易的并行执行。您自己可以做到这一点的唯一方法是通过一些相当广泛的 PowerShell(或 Python)工作。
尽管我很想将 Redgate 推广为该解决方案的一部分,但实际上没有必要(它只是更好)。您可以以任何方式生成必要的工件。重要的一点是能够准确地控制它们的部署方式,处理跟踪成功和失败的部署,不同级别的必要安全性,所有这些东西。这正是我之前提到的那些工具的目的。
另外,是的,这是一项繁重的工作。自动化部署绝对是必经之路。然而,这并非没有劳动。与其将时间花在容易出错、重复、无聊和缓慢的手动流程上,不如花时间和精力使事情自动化。与其说工作被淘汰,不如说它被重新定位。然后,您将获得该自动化的所有好处。但是,您确实必须维护它、发展它、扩展它并处理其中的问题。所有工作。
我们的问题是我们有一个包含个人身份数据的在线申请。我们已将此应用程序出售给多个客户,他们所在州的法律规定数据必须实际存在于他们所在的州。所以这就是为什么我们在不同位置有相同的数据库(不是相同的数据)。
现在我们使用 RedGate SQL 比较,但随着我们的不断发展,每次更新都要这样做八、九、十次(无论是小的存储过程错误修复还是更大的更改创建new table) 变得越来越低效。市场营销告诉我们还有五个州即将到来。
我们研究了 RedGate 方法,但它的编码和故障排除比它的价值更多。
那么...有什么想法可以将 SCHEMA 从一个数据库更新到多个数据库吗?
我假设这是 SQL 服务器,因为您指定的是“RedGate SQL 比较”而不是“MySQL 比较”。如果不是 SQL 服务器,请忽略它。
无需采用新的工具集(或什至为某些东西向 RedGate 付费)并且由于数据库(而非数据)相同,您可以设置一个中央管理服务器 (Microsoft documentation on that here),注册每个单个 SQL 服务器实例,构建您的部署脚本(您仍然可以使用 SQL 比较),然后使用 CMS 将架构更改同时推送到所有实例或随意定义组。
这假设您正在对所有服务器使用 windows 身份验证,并且执行部署的任何人都将在所有服务器上拥有相同的访问权限,但这对于 multi-server 这种类型的一般管理,它是一个可靠的功能,已经存在了一段时间 (2008)。
SQL Management Studio 中有一个功能可以使用。在 SMS 中使用 CTRL-ALT-G。这带来了 'Registered Servers'。在本地组下,您可以创建组。说一个用于测试,一个用于现场。然后在您创建的本地组上 right-click 并选择“新服务器注册”。在“常规”选项卡下,您为其命名,然后在“连接属性”选项卡中,您 select 只是一个数据库。继续为组中所需的每个数据库添加“新服务器注册”。完成后,只需右键单击您的组并选择新建查询。你放在那里的任何东西都会 运行 在组中的所有数据库上。 因此,如果我们所有的数据库都相同,并且您需要进行更新,请使用 Redgate 进行比较。选择 'Create a Deployment Script' 而不是 'Deploy Using SQL Compare' 并复制 SQL。 Right-click 在组中说“新查询”粘贴并执行。
我在Redgate工作,所以我很想宣传它,但是暂时忽略它。
如果您想同时自动部署到大量服务器,我建议您使用 Azure DevOps Pipelines 或 AWS DeveloperTools 之类的工具,甚至是 Octopus 或 Jenkins 之类的第三方产品。这个想法很简单,使用任何你喜欢的工具,直到你的键盘,来创建部署所需的工件(你的 T-SQL 脚本用于 SQL 服务器)。然后,这些流量控制工具之一中的代理会执行确保脚本部署到多个位置的繁重工作。因为您可以为这些代理配置独立的安全性,所以您自己不必拥有通过 SSMS 或中央管理服务器控制内容所需的相同级别的安全性。此外,这种方法允许非常容易的并行执行。您自己可以做到这一点的唯一方法是通过一些相当广泛的 PowerShell(或 Python)工作。
尽管我很想将 Redgate 推广为该解决方案的一部分,但实际上没有必要(它只是更好)。您可以以任何方式生成必要的工件。重要的一点是能够准确地控制它们的部署方式,处理跟踪成功和失败的部署,不同级别的必要安全性,所有这些东西。这正是我之前提到的那些工具的目的。
另外,是的,这是一项繁重的工作。自动化部署绝对是必经之路。然而,这并非没有劳动。与其将时间花在容易出错、重复、无聊和缓慢的手动流程上,不如花时间和精力使事情自动化。与其说工作被淘汰,不如说它被重新定位。然后,您将获得该自动化的所有好处。但是,您确实必须维护它、发展它、扩展它并处理其中的问题。所有工作。