DevShot - 开发人员的数据库快照






4.67/5 (3投票s)
2005年11月25日
5分钟阅读

49715

519
如何创建 SQL Server 2005 的运行时备份并恢复它们。
引言
几周前,我萌生了一个想法,想写一个简单的工具,用于在编码周期之间切换数据库状态。我认为这对于任何从事数据库相关项目并需要切换数据库状态的人来说都会是一个很好的工具,因为我认为大多数数据库附带的工具(如 Microsoft SQL Server 中的 Enterprise Manager)对于创建简单的备份和轻松恢复来说都太大了。
随着想法的演变,Visual Studio 2005 和 SQL Server 2005 出现了,特别是免费提供的 Express 版本。我必须承认:当我第一次看到 SQL Server 2005 Express 处理数据库的方式时,我大吃一惊:数据库文件散落在文件夹中,没有任何一致性。好吧,好处是它们很容易与项目关联,并且比集中式 SQL Server 版本更容易移植,但管理它们会很糟糕。幸运的是,我只将 Express 版本用于开发,并且可以通过兼容性,在需要时升级内容。
好的,回到问题:我为什么认为这个工具对开发人员来说很棒,是因为有时我们(所有人?)会遇到这种情况,我们的应用程序处理底层数据库中的数据,但数据是错误的,我们需要从某个地方获取备份来恢复,然后我们继续,或者更糟:我们必须以编程方式或手动“生成”数据库中的数据。
简单的例子可能是一个场景,您使用数据访问层对象进行单元测试,并且希望数据库中存在一些实际数据。可能不多,以保持测试相当快,但仍然有一些东西可以填充数据集并处理数据 - 这是恢复标记为“用于单元测试”的数据库快照的绝佳场所。另一种情况可能是需要测试报告以处理非常大的数据集,并且需要包含大量数据的另一个快照。此外,可能还需要第三个快照来复制实际的生产数据(有限制或修改),用于应用程序的最终测试。可能需要更多快照来测试数据处理,如果第三方(Web 服务或其他应用程序)在未经您的应用程序同意的情况下修改数据并弄乱数据库中的数据 - 您的应用程序如何处理这种情况?
DevShot 是一个执行备份/恢复数据库到/从文件等简单任务的应用程序,并提供了一个简单的 API 来完成此操作。我知道 SQL Server 的 DMO 和 SMO API 非常好,但对于这种功能,它们充满了不需要的选项,例如磁带备份、更精细的事物日志备份等。
我的安排方式是一个简单的框架(可以这么说),它包含一个 DBAdapter
抽象类,该类具有一些相当自 explanatory 的方法和属性,用于备份和恢复数据。提供的解决方案还包括一个简单的 WinForms 应用程序,其中包含一个带有单个表的示例数据库以及备份和恢复数据的函数示例。还提供了一些带有几行数据的现成快照(实际上快照 4 是一个空表)。
正如在 WinForms 应用程序中所见,实际要做的(使用 SQL Server 2005 Express)非常简单。以下几行就是所需的全部内容
Dim dsfw As New DevShot.Framework
Dim dba1 As New DevShot.MSSQL2005Adapter
dba1.ConnectionString = My.Settings.TestDatabaseConnectionString
dba1.DatabaseName = Application.StartupPath & "\TestDatabase.MDF"
dba1.BackupFile = Application.StartupPath & _
"\TestDatabase_State_" & _
Me.ComboBox1.SelectedItem & ".BAK"
dsfw.DBAdaptersCollection.Add(dba1)
dsfw.Backup()
dsfw.Backup()
也可以是 Restore()
,因为这些方法不需要其他任何东西来完成任务。上面的代码实际上所做的是初始化一个简单的 DBAdapter
对象集合(MSSQL2005Adapter
的基类),并将 MSSQL2005Adapter
的一个对象添加到 DBAdaptersCollection
中,这是框架中包含所有要备份项的集合。
请注意,DatabaseName
属性被提供为一个文件名,因为数据库将在运行时附加。如果这是在线数据库,如 Northwind,您应该使用名称“Northwind”,而不是文件路径。此外,此路径是指应用程序启动的启动目录。这是用于调试目的,因为 Visual Studio 实际上会在构建期间将创建的数据库复制到应用程序根目录下的“bin\Debug”(和“bin\Release”)子目录中。这起初令人困惑,因为 Visual Studio 中的 Server Explorer 修改应用程序根目录中的数据库,然后将修改后的数据库复制到 bin\Debug 文件夹,如果软件对数据库进行了任何更改,当应用程序重新运行时,所有更改都会在新复制的数据库中丢失(实际上这是我开始呼吁需要这种工具的另一个原因)。
另一个很酷的地方是,可以使用 Visual Studio 构建的连接字符串来配合 Server 对象的 ConnectionContext.ConnectionString
属性中的 SMO.Server
对象。Server 对象唯一的问题是,在构造对象时,它需要连接到某个可用的 SQL Server 数据库。因此,即使您使用连接字符串连接到外部服务器,您也需要为 Backup()
和 Restore()
方法(可选)提供服务器名称 - 默认值为“.\SQLEXPRESS”,它会连接到您的计算机的 SQL Server(如果可用)。例如,以下连接字符串在连接到服务器时连接到数据库
Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory| \TestDatabase.mdf;Integrated Security=True;User Instance=True
现在,在运行此示例时,您应该记住这仍然是一个进行中的工作,并且更新即将到来。但是,我非常感谢您的反馈——您会觉得这种应用程序有用吗?您在连接到 SQL Server 2005 Standard、Workgroup 或 Enterprise 时可能会遇到一些问题,但当我能够获得一台体面的服务器来运行 SQL Server 2005 实例时,这些问题将得到解决。
此外,很可能会出现更多适配器,例如文件适配器(用于文件复制)、Oracle、DB2、MySQL、PostgreSQL 等。此外,降级将会很棒,可以创建一个 MS SQL Server 2000 适配器来使用 DMO COM+ 对象来备份/恢复 SQL Server 2000 数据库(或 MSDE)中的数据。