需要在5000+上运行SQL脚本数据库。我应该如何接近?
我正在开发一个工具,最终将用于在 5000 多个生产数据库上同时运行 SQL 脚本。目前它仅用于在我们的开发和质量检查数据库上运行脚本。但我想以最可扩展的方式设计它,并且没有做这样的事情的经验,所以我可以使用一些建议。
我当前使用的技术: C# .Net 4.0 ADO.Net SMO
编辑:我想可扩展只是指能够以最有效的方式在任意数量的数据库上运行脚本。
I am developing a tool that will eventually be used to run a sql script on 5000+ production databases simultaneously. For now it will only be used to run scripts on our Dev and QA databases. But I want to design it in the most extensible way, and have no experience doing something like this, so I could use some advice.
Technology I'm currently using: C# .Net 4.0 ADO.Net SMO
EDIT: I suppose by extensible I only mean able to run the scripts on an arbitrary number of databases in the most efficient way possible.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
首先,我建议您仔细检查是否无法使用现有的管理工具之一,例如 基于策略的管理或中央管理服务器。特别是 PBM,它涵盖了许多传统上需要“在每个数据库上运行此脚本”之类的操作。还有许多文章描述了 PBM 的实际应用,例如。 基于策略的管理和集中管理服务器。
另一件需要考虑的事情是使用 PowerShell 而不是 C#/ADO/SMO。 PS 可交付成果是在生产中易于更改/维护的脚本,而不是已编译的可执行文件。此外,PS 的对象管道模型使得 PS 中的许多任务比原始 C# 中的任务更容易。 PS可以使用多线程执行。请参阅SQL Server PowerShell 概述。
看看还有哪些其他项目可以处理类似的任务。我自己有一个项目 dbUtilSqlcmd,它处理在 ADO.Net 环境中执行 .SQL 文件(处理批处理分隔符
GO
、处理 sqlcmd 变量:setvar
和$(variable)
、处理:connect
命令和很快)。最后,如果您最终编写代码而不是使用 PBM,那么更大的问题将是线程和错误报告。不要为每个服务器/数据库启动一个线程,5000 个线程是不可行的。请改用
ThreadPool.QueueUserWorkItem
。更好的是,如果可能的话,使用任务并行库。First I would recommend double-check if you cannot use one of the existing management facilities, like Policy Based Management or Central Management Servers. Specially PBM, it covers many operations that traditionally required something like 'run this script on every database'. There are also many articles describing PBM in action, eg. Policy-based Management and Central Management Servers.
Another thing to consider is to use PowerShell instead of C#/ADO/SMO. PS deliverables are scripts that are easily changed/maintained in production, as opposed to compiled executables. Also the object pipe model of PS makes a lot of tasks easier in PS than in raw C#. PS can use multithreaded execution. See SQL Server PowerShell Overview.
Look into what other projects are out there than handle similar tasks. I myself have a project, dbUtilSqlcmd, that handles executing .SQL files in a ADO.Net environment (handling batch delimiter
GO
, handling sqlcmd variables:setvar
and$(variable)
, handling:connect
commands and so on).Last, if you end up writing code instead of using PBM, your bigger problems are going to be threading and error reporting. Don't start a thread per server/database, 5000 threads are not viable. Use
ThreadPool.QueueUserWorkItem
instead. Better still, use the Tasks Parallel Library if possible.可扩展是什么意思?回答这个问题可能是找到您正在寻找的答案的最佳方式。求助:
当然,使其可扩展,然后从不使用该可扩展性意味着您浪费了时间。因此,请考虑一下现在是否真的需要这样做。
What do you mean by extensible? Answering that may be the best way to find the answer you're looking for. To help:
Of course, making it extensible and then never using that extensibility would mean you wasted your time. So, think about whether this is actually needed right now.
我建议你使用 SQL“批量输入”方法,这是我在 MS SQL 中遇到过的最快的方法。干杯
I would suggest you to use SQL 'Bulk input' method, That is the fast one I ever came accross with MS SQL. Cheers