具有不同供应商的数据库镜像
SQL Server ISS 可以简化跨多个供应商的数据库镜像
引言
开发人员经常会遇到来自供应商的关键企业数据库,即使在生产时读取数据的风险也可能非常高。一种低级解决方案是恳求从关键的生产 DBA 人员那里获取文本文件提取。作为替代方案,Microsoft SqlServer 产品现在通过行业标准 ODBC 连接技术为来自大多数供应商的数据库提供了一个高速接口。当可以容忍延迟(例如 24 小时)时,可以使用 SqlServer Integration Services (ISS) 功能将数据库镜像到几乎任何东西(例如 Oracle、Intersystems Cache)。现在可以使用三太字节硬盘驱动器,镜像端的空间问题比以往任何时候都小。
背景
在 ISS 或之前的 DTS 版本之前,人们面临着编写大量代码来解析友善地提供给开发人员的文本文件,这些开发人员使用 SqlServer 进行镜像。通过最新版本的 SqlServer (2000, 2005, 2008) 提供的工具集和向导,应该可以消除大多数手动编写代码来解析文本文件的需求。要做到这一点,关键是与生产 DBA 人员协商达成协议,以便可以为 SqlServer 的 ODBC 连接进行非工作时间只读访问。在镜像站点到位并运行后,可以从生产环境以及双方的参与者那里消除巨大的压力。我的第一个镜像站点的动机是生产 DBA 运行一个新查询,该查询导致企业停摆了几分钟!
Using the Code
为了最大限度地减少构建镜像站点的努力,我首先协商对企业 DBA 所需的最小表集进行只读访问。每个企业源表然后成为一个 ISS 包。SqlServer 导入向导将为您构建特定表的简单基本起始包。
首先,我构建了一个名为 Mirror
的新数据库。导入向导如下所示,以示例 Northwind Employees
作为要镜像的表

源表来自 Northwind
进入目标 Mirror。

字段将在新 Mirror
表的同名表中。

包将被保存,并可选地在表较小时运行。

基本包已作为 Iss2008PkgNorthwindEmployees
保存在 SqlServer 中,用于在 Visual Studio (VS) 的 BI 版本中使用。将基本包导入到 VS 的一个新项目中会产生以下内容,稍作注释后

在真实的镜像中,需要更多逻辑,如扩展包所示
--
-- TSQL source code for the above blocks is:
--
IF EXISTS (SELECT * FROM sys.objects _
WHERE object_id = OBJECT_ID(N'[dbo].[Employees_NEW]') AND type in (N'U'))
drop table [dbo].[Employees_NEW] -- drop table in case of partial
-- results in a previous run
CREATE TABLE [dbo].[Employees_NEW] (
[EmployeeID] int,
[LastName] nvarchar(20),
[FirstName] nvarchar(10),
[Title] nvarchar(30),
[TitleOfCourtesy] nvarchar(25),
[BirthDate] datetime,
[HireDate] datetime,
[Address] nvarchar(60),
[City] nvarchar(15),
[Region] nvarchar(15),
[PostalCode] nvarchar(10),
[Country] nvarchar(15),
[HomePhone] nvarchar(24),
[Extension] nvarchar(4),
[Photo] image,
[Notes] ntext,
[ReportsTo] int,
[PhotoPath] nvarchar(255)
)
-- data flows here
drop table [dbo].[Employees] -- remove older copy inside the mirror
exec sp_rename 'employees_new', 'employees' -- put new copy into working mirror
create index employees_0 on employees(EmployeeID)
create index employees_1 on employees(LastName,FirstName)
在真实的镜像站点中,上述包将扩展到索引之外,可能还有更多步骤。总体包设计用于即使新的镜像读取失败,镜像表仍然可用。
要将包变成一个小小的软件机器人,BI 项目属性将设置为允许部署实用程序。然后,该包被构建用于在重复的 SqlServer 作业步骤中使用。使用 BI 构建选项会在项目 bin\deployment 目录中产生以下内容

双击清单会启动一个向导,用于安装该包以在 SqlServer 作业中使用。
很值得研究 ISS 技术,因为本文仅仅触及了其可能性的表面。通过使用 VS 项目工具栏上的脚本任务,您可以在整个流程中包含 VB 或 C# 中的 .NET 代码块。您还可能会发现,镜像站点将变得至关重要,几乎就像相关的生产环境一样。
由于 SqlServer 和 ISS 中提供了如此多的功能,因此可以进行一些非显而易见的额外用途,例如用于自动化测试或安全扫描等框架。
历史
- 初始版本 1.0 - 2011 年 7 月 5 日