快速,持续,稳定,傻瓜式
支持Mysql,Sqlserver数据同步

使用SQL虚拟还原进行对象级恢复

在线QQ客服:1922638

专业的SQL Server、MySQL数据库同步软件

偶尔,用户的错误对DBA的要求可能会比简单的时间点恢复高得多。当事情变得复杂,并且您必须急忙工作时,SQL Virtual Restore和SQL Data Compare可以一起工作来节省一天。

我以前很害怕这样的电话:

“嗯,格兰特。您知道,昨天,我不小心删除/编辑/删除/更新了行/表,现在我需要您还原数据库…什么?…不,我不想丢失最后17个小时的数据…是,我知道CEO认为我们应该赚钱与这有什么关系…哦,昨天记录的销售不是吗?但是我只想要一个行/表/索引。您没有日志或其他东西吗?”

当那个调用通过时,它是代码,索引或我在源代码控制中可以轻松检索的东西,实际上没什么大不了的。我将去源代码控制系统,检索适当的代码,然后重新应用它;通常在我撤消该人对生产系统的访问权限之后。如果它是非易失性数据(例如,查找信息)可以在完整备份中使用,则可以使用SQL数据比较并将生产数据库与最后一个备份文件进行比较,以直接检索信息。但是当通话是关于易失性数据时;跨表的依赖关系不断变化的数据集,然后,一切都改变了。

这一次(不,不是在乐队训练营中),我不得不解决一个问题,该问题是由于生产访问权限过高的人能够进入服务器并从几个键中删除几行表。数据虽然不多,但是却记录了价值数百万美元的交易。因为白痴这个人直到第二天才意识到他们做了什么,并且由于该系统还有将近24小时的其他已提交事务,所以我不能简单地从以前的完整备份中检索他们的数据。由于表之间的依赖关系,我也不能简单地将此信息与其他数据源进行比较或重新输入它的密钥。我必须在时间上进行一点恢复,但是,在不丢失所有已承诺事务并造成各种停机时间的情况下,我无法对我们的生产系统进行任何处理。

旧时光

挂断电话后不久,我走进了一个长笛,接着是一声尖叫。我知道我需要将数据库还原到某个时间点,这意味着我必须具有完整备份和日志备份。我还知道,我必须在必须保持在线和活动状态的生产系统之外执行此操作。我知道我必须从该时间点获取数据并将其移至生产系统,而不必关闭该系统或修改其中的所有其他数据。完成所有这些操作后,系统应恢复在线,并保留丢失的数据。

让我们逐步介绍解决此问题所需的所有知识。第一个问题是确定您要恢复多少数据的最大问题,数据库是否启用了完全恢复?太好了 这意味着日志备份,您可以在电话上的朋友删除此关键任务信息之前(直到我们将其称为“事件”)恢复数据库。下一个问题,这个数据库到底有多大?哦,那么大?不好。是时候寻找磁盘空间了。QA团队不是用最新版本的VikingThunder项目完成的吗?很好,因此您可以删除QA机器上的数据库并创建一些用于从生产中还原的空间。你有备份文件吗?你有日志备份文件吗?您是否必须使用磁带或异地存储才能将它们取回?收集所有必要的食物,

最后,您可以开始该过程。首先,您必须还原数据库。目前,我们甚至不需要担心您是否已经测试了此备份的还原。让我们假设它可行。您还原了数据库,但将其置于恢复模式,然后开始应用日志备份和/或差异备份,直到事件发生之前。终于,数小时后,您有了一个数据库,其外观与活动前的昨天基本相同。现在,您在哪里放置了差异脚本?你知道的 您将其从某个网站上的某个地方撤出,它向您显示了两个不同数据库之间哪些列具有不同的数据。嗯,是的,但是它的写法是您必须为要比较的每个表修改它。再过一会儿,再过一两个诅咒,脚本就可以工作了。最终,您可以比较所需的各种表是否生成了可以组合的多个脚本。现在,您可以在Production中的表顶部从重新创建的数据库中还原差异。但是首先,您需要测试脚本。那是什么意思?您需要制作生产数据库的另一个副本,让我们替换在质量检查中使用的副本,希望生成的脚本可以在第一次使用,而我们不必再次回到时间点数据库,但这是可能的。

您运行脚本,现在生产重新联机。一整天都在拍摄,现在电话又响了:

“是的,嗨,这是质量检查部门。质量检查服务器发生了什么?我们正在测试VikingThunder …是的,嗯,您需要立即将其恢复在线状态。我们正准备明天为首席执行官进行演示……”

欢迎来到21世纪

那没什么好玩的,不是吗?但是今天,我们有很多可用的选择,这些选择将使该过程的痛苦减轻很多。您仍然需要准备好备份。您需要使数据库处于完全恢复状态,并且还需要备份日志,以便将数据库还原到某个时间点。您还应该测试备份,以确保它们在需要时可以使用。但是,有了一组经过测试的良好备份,从事件前数据库恢复数据的过程应该非常简单。

我们将利用Red Gate SQL虚拟还原。使用SQL Virtual Restore立即解决了在旧的数据恢复方法中遇到的一些问题。首先,我们不必占用磁盘空间。我们已经为备份文件分配了空间,SQL Virtual Restore仅需要为数据库定义一小组非常小的占位符文件,通常大小不超过几兆字节。顾名思义,SQL虚拟还原实际上并不还原数据库。而是在SQL Server和文件系统之间运行文件筛选器进程,这使SQL Server进程认为它正在访问标准数据库文件,而实际上却在访问备份。为了使此工作有效,将为使用SQL Virtual Restore恢复的数据库创建数据和日志文件。这些占位符文件非常小,因为它们没有将所有数据存储在数据库中,而是存储了足够的信息来定义数据文件。从那里,对备份文件中存储的数据的任何更改都存储在这些占位符文件中。在我们的情况下,通过时间点恢复,我们必须能够存储在先前的完全备份和事件之间更新数据的时间段内日志中的更改。这些其他数据将进入占位符文件。在大多数OLTP系统上,这根本不是太多的空间,尤其是与完整数据库相比时。因此,我们的第二个问题,即在很大程度上存储数据的地方消失了。我们可以将它还原到生产系统上的数据库副本中,它是如此之小。绝对最好转到其他服务器上,以避免生产中的资源争用问题。但是您不必担心干扰VikingThunder项目。

接下来,我们将尝试使用SQL Data Compare来代替滚动自己的比较脚本。使用此工具,我们可以根据需要快速而简单地识别两个数据库之间的相关数据。单个脚本可以非常快速地生成。

SQL虚拟还原比真正的还原操作要快。它的速度并不快,但是将恢复时间缩短了25-35%(我在测试中看到的节省额)意味着您可以更快地修复生产系统。

通过使用SQL Virtual Restore,我们还可以从完整备份创建生产数据库的副本,该副本非常小且可以快速恢复,因此我们可以测试从SQL Data Compare生成的脚本。不管SQL Data Compare在生成脚本方面有多好,您仍然需要在生产中运行它们之前对其进行测试。生产系统的第二个虚拟副本非常适合此要求。

为了进行测试,我创建了一个名为MyDb的小型数据库。它上面有一对表,称为ParentTable和ChildTable。我有完整的备份和几个日志备份可用。就我而言,该事件发生在我们电话上的朋友从ChildTable删除几行时。现在,我们将恢复该表到某个时间点以恢复这些行。

设置虚拟数据库

SQL Virtual Restore可以与本机备份配合使用。它也与Red Gate SQL Backup压缩文件和SQL Hyperbac压缩文件一起很好地工作。无论备份的来源如何,还原过程都基本相同。我将首先介绍如何使用GUI,然后再使用TSQL命令展示相同的内容,我更喜欢这样做,因为您可以通过这种方式自动执行还原。而且,GUI仅允许您从数据和日志文件执行完整还原。为了进行时间点恢复,必须使用TSQL。

SQL虚拟还原GUI

您可以从“开始”菜单启动SQL Virtual Restore的GUI。更妙的是,如果您像我一样,并且是早上打开的第一件东西以及关闭前关闭的最后一件东西,就是SQL Server Management Studio,则可以从那里的“工具”菜单访问它。打开它,您将看到以下屏幕:

1310-image002.png

如您所见,这是一个相当标准的“介绍和连接”窗口,也是创建虚拟数据库的向导过程的开始。您可以连接到安装了Hyperbac Service的本地实例。Hyperbac Service作为使我们能够创建虚拟数据库的过程而运行。您可以通过Active Directory样式Windows身份验证或使用SQL Server登录名的标准方式进行连接。无论使用哪种方式,请选择要连接的实例,然后单击“下一步”按钮。这将打开备份文件选择窗口:

1310-image004.png

这是一个简单的窗口。基本上,您需要向其中添加有效的备份文件。这些是本机SQL Server备份,SQL Backup或Hyperbac文件。单击“添加文件…”按钮,将打开一个标准文件选择窗口。选择完全备份和日志备份文件非常简单。一旦完成,窗口将如下所示:

1310-image006.png

选择所需文件后,此步骤无需执行任何其他操作。如您所见,您可以通过单击“全部删除”按钮来删除所有文件。您也可以选择单个文件,然后单击“删除”按钮将其从列表中删除。当您满意所有内容后,请单击下一步。这将在向导中打开下一步,指定有关数据库的选项:

1310-image008.png

您可以做出多种选择来完成还原。首先,您可以选择使用此虚拟还原覆盖现有数据库或创建新数据库。出于我们的目的,在生产环境中恢复丢失的表,覆盖生产数据库是一件很愚蠢的事情。您可以确定将虚拟数据库的数据文件放置在何处。选择相当明确。您可以使用SQL Server中定义的默认目录。您可以使用备份本身内文件定义的目录。或者,就像我所做的那样,您可以选择将这些文件放在其他位置。这里没有最合适的选择,只有最适合您的选择。如果您不确定备份一致性的状态,您可以选择包括DBCC检查作为还原的一部分。选择该选项后,您将有机会在一致性检查后立即删除数据库。同样,由于我们要访问该数据库,因此在我们的情况下,这样做是一个糟糕的选择。最后,在还原操作完成后,选择要保留数据库的状态。对于使用GUI的第一个示例,我将继续进行操作,并使用WITH RECOVERY还原数据库并使数据库处于可操作状态。但是,如果需要,您可以使用GUI来恢复数据库和一些日志集,但保持它们处于恢复状态。然后,您可以退出GUI并完成将日志还原到某个时间点,然后恢复数据库。最后,如果您不确定何时希望结束恢复,您可以指定WITH STANDBY,以便您可以查看数据库以确定是否应还原更多日志文件,或者是否将所需的数据置于正确的状态。一旦确定,就可以手动恢复数据库。此处的正确选择再次取决于您的情况。单击“下一步”按钮将打开一个摘要窗口:

1310-image010.png

该窗口仅显示您在先前窗口中所做的所有选择。如果您做出了错误的选择,则可以使用“返回”按钮进行修改。您也可以单击“查看脚本…”窗口,以查看SQL Virtual Restore如何执行数据库还原过程。在下一节中,我们将讨论如何使用TSQL执行此操作。如果单击“还原”按钮,数据库将被还原,并且您将看到执行的操作的摘要以及在此过程中使用的空间:

1310-image012.png

使用GUI还原数据库非常简单。现在,让我们进入胆量,看看如何使用TSQL语句执行相同的操作,以便我们可以还原到某个时间点。

SQL虚拟还原到某个时间点

如果您已经熟悉使用TSQL还原数据库,则可能不会在本节中学到很多新知识。您只需在脚本中进行最细微的改动即可创建虚拟数据库,而无需从TSQL语句创建真实数据库。这是此还原过程的第一条TSQL语句:

此脚本与完全正常的还原脚本之间的区别是修改虚拟数据库上的文件扩展名,并在其中添加字母“ v”。这是向Hyperbac Engine发出的信号,表明这些文件很特殊。这将导致Hyperbac Engine创建虚拟数据库。TSQL脚本表示的过程与我们从GUI启动的过程完全相同。

从那里开始,其余与日志的还原操作将完全符合您的期望:

这是到达时间点的完全正常的还原脚本集。没什么好奇怪的 这意味着您围绕脚本创建的任何自动化集只需要进行很小的修改即可创建虚拟数据库并将其恢复到某个时间点。

现在,我们已经有了一个数据库,并且已将数据库还原到该不良事件之前,让我们使用Red Gate SQL数据比较对数据进行比较。

从虚拟数据库移动数据

您可以像使用任何其他数据库一样,使用SQL Data Compare连接到虚拟数据库。您指定服务器并选择数据库,然后对生产数据库执行相同的操作,您将看到一个类似于此窗口的打开窗口:

1310-image014.png

我们假设数据库之间的结构是相同的,因此我们应该能够简单地使用SQL Data Compare中的默认值。运行SQL Compare将导致存在的数据存在一些差异:

1310-image016.png

您可以再次使用同步向导来移动此数据。SQL Data Compare也可以通过命令行自动执行。在实际的生产环境中,如果事件修改了一行或几行,并且您希望仅将它们从虚拟数据库中移出,则可能需要通过GUI,以便可以选择以下哪一项:这些行将被移动或修改,而不是让其自动发生。您还需要在生产环境中运行脚本之前对其进行测试。由于您拥有第二个虚拟数据库,因此此测试既快速又容易。

结论

是的,在生产系统中丢失数据是一个主要问题,尤其是当它只是数据的子集时。但是,将SQL Virtual Restore与Red Gate的其他数据库工具结合使用将使恢复比以前更加轻松和快捷。请记住,您必须确保拥有良好的备份和良好的日志备份,否则无法采用整个方法。这使得担心电话响起的理由减少了。

相关推荐

咨询软件
 
QQ在线咨询
售前咨询热线
QQ1922638