2010-05-12 39 views
1

简单的问题。我正在研究几个办公室之间共享的单个SQL Server数据库。每个办公室在这个数据库中都有自己的模式,因此将数据库分为逻辑块。 (另外还有一个在多个办公室之间共享的架构)。数据库存储在专用服务器上,我们使用单个数据库来保持备份/恢复过程的轻松。如何做部分数据库备份和恢复?

然而,问题在于会计部门可能会修改大量数据,然后秘书处犯了一个错误,要求恢复备份。不幸的是,恢复备份意味着会计将失去他们最近添加的数据。

因此,替代解决方案是将备份恢复到新数据库中,从旧会计模式中删除数据并将数据从备份移到原始数据库。这是目前的解决方案,既费时又容易出错。

那么,有没有办法备份单个模式,可能通过代码?然后,还可以通过代码恢复该架构?

+1

你有那间去任何FKS模式? – 2010-05-12 14:59:27

+0

没有。每个模式都是一个独立的实体。所有办公室都有一个共享模式,但主要是通用数据,任何办公室都可以在需要时复制到自己的模式。 (基本上,它只是一个默认值的集合。) – 2010-05-13 11:00:40

回答

1

你可以创建一个脚本,每个模式的复制到一个单独的数据库(backup_Accounting,backup_Secretary,backup_Shared),然后创建一个备份每个这些数据库的文件。如果您需要执行恢复,则可以将备份文件恢复到适当的数据库中,然后运行脚本将数据复制回主DB。

+0

这就是我的想法。但是如何创建一个脚本来备份和恢复单个模式中每个表的所有数据? (不需要列出其中的所有表格)。 – 2010-05-13 11:26:19

0

无法仅备份和恢复单个模式。

但是,你可以尝试这种方法:将整个数据库(所有模式)还原到不同的数据库xyz_OLD或类似的东西。

然后,您可以修复使用脚本,如数据:

UPDATE y 
    SET col1=o.col1 
    FROM xyz.YourTable y 
     INNER JOIN xyz_Old.xyz.YourTable o ON y.PK=o.PK 

INSERT INTO xyz.YourTable 
     (col1, col2, col3,...) 
    SELECT 
     col1, col2, col3,... 
     FROM xyz_Old.xyz.YourTable o 
     WHERE NOT EXISTS (SELECT 1 FROM xyz.YourTable y WHERE o.PK=y.Pk) 

etc... 
+0

这不起作用,因为数据也将被删除。我所知道的唯一可行的建议是将所有表中的数据集中在一个模式中,然后将它们从备份数据库移至模式。虽然可能,但听起来很可怕...... – 2010-05-13 11:02:33

+0

这适用于删除,我只是没有写DELETE,你从本地表中删除旧的不存在。 – 2010-05-13 11:37:37

1

您可以使用filegroups和partial backup命令。

您需要将每个模式移动到不同的文件组,然后根据需要使用部分备份/恢复。

在这里看到的部分备份信息:http://msdn.microsoft.com/en-us/library/ms191539.aspx

在这里看到的信息在文件组:http://msdn.microsoft.com/en-us/library/ms179316.aspx

在这里看到的信息在段落还原:http://msdn.microsoft.com/en-us/library/ms177425.aspx

+0

有趣的建议。不幸的是,我们选择将所有内容合并到单个数据库中,以避免拥有大量数据库文件。另外,如何让SQL Server清楚哪个模式需要放在哪个文件中?它是否会将同一个文件中的所有表中的所有数据保存在该模式中? – 2010-05-13 11:13:54

+1

我不认为有任何方法来自动化架构和文件组之间的关系。在创建CREATE TABLE语句时(通过ON子句)定义创建表的文件组。如果许多人可以创建表,那么强制执行模式/文件组关系可能难以执行。但是,您可能可以使用DDL触发器来执行关系。请参阅http://msdn.microsoft.com/en-us/library/ms190989(v=SQL.100).aspx(这些也可在SQL2005中使用)。 – 2010-05-13 11:30:51