需要在5000多个数据库上运行SQL脚本。我该怎么办?

时间:2010-10-07 20:50:15

标签: c# ado.net smo

我正在开发一种工具,最终将用于同时在5000多个生产数据库上运行sql脚本。目前它只用于在我们的Dev和QA数据库上运行脚本。但我想以最可扩展的方式设计它,没有经验做这样的事情,所以我可以使用一些建议。

我目前正在使用的技术:C#.Net 4.0 ADO.Net SMO

编辑:我认为通过可扩展性我只能以最有效的方式在任意数量的数据库上运行脚本。

3 个答案:

答案 0 :(得分:0)

你是什么意思可扩展?回答这可能是找到您正在寻找的答案的最佳方式。为了帮助:

  1. 将来需要扩展哪些功能?
  2. 您想使用插件还是仅修改主应用程序的代码?
  3. 任何“基础”都可以改变吗? (需要小心使用接口。)
  4. 当然,让它可扩展,然后永远不会使用这种可扩展性意味着你浪费了你的时间。所以,想想现在是否真的需要它。

答案 1 :(得分:0)

我建议你使用SQL'批量输入'方法,这是我遇到过MS SQL的快速方法。干杯

答案 2 :(得分:0)

首先,我建议您仔细检查是否不能使用现有的管理工具,例如Policy Based ManagementCentral Management Servers。特别是PBM,它涵盖了许多传统上需要“在每个数据库上运行此脚本”的操作。还有许多文章描述了行动中的PBM,例如。 Policy-based Management and Central Management Servers

要考虑的另一件事是使用PowerShell而不是C#/ ADO / SMO。 PS可交付成果是在生产中易于更改/维护的脚本,而不是已编译的可执行文件。 PS的对象管道模型使PS中的许多任务比原始C#更容易。 PS可以使用多线程执行。请参阅SQL Server PowerShell Overview

查看其他项目的内容,而不是处理类似的任务。我自己有一个项目dbUtilSqlcmd,它处理ADO.Net环境中的执行.SQL文件(处理批处理分隔符GO,处理sqlcmd变量:setvar$(variable),处理:connect命令等等。)

最后,如果您最终编写代码而不是使用PBM,那么更大的问题将是线程和错误报告。不要为每个服务器/数据库启动一个线程,5000个线程不可行。请改用ThreadPool.QueueUserWorkItem。更好的是,如果可能,请使用Tasks Parallel Library