我们有一个在单个数据库服务器上使用SQL Server 2008的Web应用程序。 所有的存储是本地的。 在过去的一年中,我们一直试图获得任何forms的SQL Server复制来处理我们的configuration,但是它不会。 原因是我们有超过2000个不断更新的数据库(每个客户端都有一个),所以我们的testing表明,所有forms的复制都是资源密集型的。
每次我提出这个问题,人们都会关注数据库太多的事实。 这是不能改变的(出于监pipe和其他原因),所以我想专注于如何复制数据。
我们被告知,一种select是将所有数据移动到SAN,让SAN复制数据(或经常使用快照)。 但是,如果我们的数据库服务器发生故障,在这种情况下是否有数据库损坏的风险? 是否有可能利用SAN复制到另一个SAN来提供一个体面的灾难恢复解决scheme(在我们的例子中,我们可能会损失高达30分钟的数据,但是我们不能失去整整一天的价值……即我们可以“去前一晚的备份)。
正如其他答案中提到的:
旧式的数据库镜像和新式的AlwaysOn需要线程,而且你肯定会用2000个数据库来运行线程。 我记得,实际的限制远低于200个数据库。 (这里有个白皮书,但是我现在懒得去找,这个答案已经超长了。)当然,每个实例有200个数据库。 理论上,您可以启动20个实例,并在每个实例上运行100个数据库。 pipe理所有这些将是一件麻烦事,我怀疑在所有这些实例之间pipe理内存将是一件令人头疼的事情。
SQL Server复制(复制表(或表的子集),而不是文件)并不真正用于DR。 即使只有一些数据库,也很难build立和pipe理。 您可能需要更改数据模型才能使其正常工作,这可能意味着更改了您的应用程序。 您需要一种自动化的方法来将相同的复制configuration应用于您的每个2000(大致相同或几乎相同)的数据库。 您需要用来configuration复制的存储过程是混乱的。 pipe理configuration为通过GUI进行复制的2000数据库将是一场噩梦。 当/如果您进行故障转移时,您可能需要进行更改以使所有工作重新开始。 故障转移时间不是当你想做任何挑剔的变化或工作,你可以避免。 你想尽快恢复和运行。 这看起来像是一堆问题。
SAN存储单元之间的复制可能非常昂贵,特别是如果您正在讨论像EMC这样的设备的硬件时。 一旦你开始与一个供应商,你几乎已经结婚了他们的升级,维护,额外的空间等。
build议#1:你看过像Steeleye的DataKeeper之类的东西吗? 这是一款基于软件的复制产品,可在利用Windows故障转移群集的服务器上运行。 我从来没有真正使用它,除了坐在几个狗和小马的表演之外,我和公司没有任何关系。 它看起来适合你的情况。
build议#2:如果是我,我完全没有预算,我会看看一些自制的原木运输系统。 我怀疑内置的日志传送将很好地处理2000个数据库。 编写日志传送系统并不难,它可以解决所有与您的环境相关的问题。 (例如,也许你需要通过sftp将文件发送到DR站点。)
基本上,这个系统有三个部分。 每个部分都需要定期运行:
一部分采用事务日志备份,将每个数据库的tlog备份文件放入不同的文件夹(用于文件系统缩放)。 我不会使用这个维护向导,我已经看到它太多了,并开始跳过数据库,通常行为不端。 如果你想提供30分钟的保证,也许这每15分钟运行一次。
一部分将临时区域的备份文件复制到灾难恢复站点。 如果您的DR具有VPN,则这可能与robocopy CMD文件一样简单。 如果你需要更好的东西(sftp或者ssh / scp,或者如果你没有内置的备份压缩,也可以使用zip / unzip),你可以编写一个软件包或者一个powershell脚本。 这可以更快,也许每5分钟,以确保它获得一切。 一旦异地复制,它是“安全的”。
你想要审计所有三个步骤的表格,一些报告/脚本,告诉你发生了什么事情(是主要或辅助站点上运行的特定数据库?有辅助数据库没有看到tlog恢复在两个小时? )和警报scheme。
最重要的是,我也希望能够select一个特定的数据库来进行故障转移,并且能够对一切进行故障转移。 能够select一个数据库进行故障转移允许轻松进行testing(您将testing数据库而不是客户的数据库故障转移),并且如果您遇到扩展问题,可能会给您一个基本的负载平衡scheme。 您还需要一种自动的方式来在主服务器和辅助服务器之间进行“重新同步”(从主服务器进行完全备份并将其应用于辅助服务器,启动日志stream等)。对于发行版2.0,这些function可能会更好。
(每个人都忘记了MS支持的最早的tlog发送是通过几个可以下载并运行在SQL 7.0上的脚本来实现的,这里有GUI,UI是一些SQL报告和一些存储过程。
除了写一点tsql代码,这里面的挑战是:
更改为完整恢复模式(听起来您可能正在使用简单的恢复模式)以及可能用于日志备份的存储使用率的增加,数据库大小的增加以及您所拥有的。
确保您的存储系统能够及时处理频繁tlog备份的负载并将其复制到灾难恢复站点。 IOW,如果你有2000个数据库,并希望保证数据到最后一个小时,你需要能够对这2000个数据库中的每一个进行一次事务日志备份,并把它们放到networking存储上(不在你的主服务器上的某个地方)。
确保一切都保持一致。
在完成了所有这些工作之后,我开始考虑自动化故障转移,如何告诉我的网站哪里运行特定客户的数据库的实时版本等。如果您没有运行集群系统,请确保您保持所有login/密码,作业,链接服务器等等同步是一个PITA。
是的,数据库有被破坏的可能性,就像盒子掉电一样(你有“崩溃一致性”)。
但是数据库引擎需要采取很多预防措施。 每当您更改数据库中的数据时,都会显示“我将要更改”,然后进行更改,然后显示“我进行了更改”。 粒度级别取决于如何设置,但通过重播日志(它打算执行的操作),几乎总是能够回滚到一致的状态。
这并不意味着你不会丢失数据,它只是意味着什么是准确的。
在这种情况下你可能想要的东西(假设你不会丢失数千块钱,如果你恢复10分钟或者其他什么)是asynchronous复制(你不想等待写入数据库被远程存储器确认)。 对于大多数常见的存储系统,您只需说“每隔X分钟快照一次”即可设置。
最后,这不是100% – 你仍然需要做传统的备份。 但是非常可靠 这个设置是非常普遍的,并且与虚拟机以及数据库一起工作良好。
查看意图日志,回放,日志传送,高水位和一致性检查点以获取更多信息。
这绝对是可行的,我不知道有一个自由的方式来做到这一点,但我们使用这个 ,它基本上允许MSSQL框停顿其文件,然后告诉3PARarrays采取一个快照 – 这是固有的连贯性和然后继续。 然后数组就可以捕捉,并且可以让你拥有尽可能多的数量 – 实际上你只需要说24小时左右,所以你只需要在这个基础上转储它们。 正如我所说的远离免费,但每次工作100%,是专为这种这样的。 我很确定NetApp做类似/相同的东西 – 我只是不知道那个产品对不起。
是的,有腐败的机会。 短版本:在崩溃之后,SQL会重播事务日志以validation您的数据完整性。 如果日志文件被损坏,您的数据库将被标记为可疑。 (这里还有更多)
至于复制:听起来像日志传送可能是你最好的select。 如果你可能会损失30分钟,你可能会(根据数据库的大小和繁忙程度)每隔10分钟为你的三十分钟窗口发送1/3。 (换句话说,如果发生崩溃,三分之一的数据库将会是十分钟的时间,另外三分之二,另外三分之三。)
我在一个类似的应用程序工作。 我们假装的多租户应用程序不是多租户,所以每个客户一个DB。 吸。
您可以尝试将数据库拆分到多个SQL服务器上,以便在镜像/复制/日志传送时不会耗尽工作线程或遇到其他瓶颈之一。
我在SQL 2012中查看了AlwaysOn,它看起来像2008工作线程的镜像有相同的要求,所以升级不会帮助你。
正如您所询问的,您可以尝试存储层复制。 我没有太多的经验。