3

假设我有一个这样的数据库:

Users
-----
ID int PK Identity
Name vchar(max)

Sales
-----
UserID int FK
Description vchar(max)

还有一些数据:

Users
1, "Daniel"
2, "Barnie"
3, "Frank"

Sales
2, "New computer"
2, "Rubber duck"
3, "Cabbage"

还有几个其他表链接到这个主键。现在有一个要求,只有某些用户想要备份,例如我只想导出用户 2 和 3 的数据和所有链接数据。

问题: 1) 有没有办法只使用部分数据来创建 .bak 文件?我不想备份整个事情,只是选择的记录。2) 如果 .bak 文件不是最好的方法,还能做什么?我曾想过生成一个 csv 文件或一个 INSERT sql 脚本,但这会导致导入功能出现问题。当您从两个或更多数据库导出并且您现在在用户表的主键中存在潜在冲突时,就会出现问题。你如何解决这个问题?我还在一些表中使用文件流,所以我有一些不能轻易提取为文本格式的数据。

我也想以编程方式完成所有这些。使用 sql server 2008。

4

7 回答 7

2

一个相对简单的选项是使用您要备份的用户填充表,在同一服务器实例上为存档用户创建另一个数据库,然后选择新数据库(显然首先是用户表)。从新数据库中存在值的旧数据库中删除,备份新数据库,您就可以了。

于 2010-07-21T16:04:07.523 回答
2

问题: 1) 有没有办法只使用部分数据来创建 .bak 文件?我不想备份整个事情,只是选择的记录。

不会。在 SQL Server 中,备份功能只会备份整个数据库。

2) 如果 .bak 文件不是最好的方法,还能做什么?

我建议在与原始服务器相同的服务器上设置第二个存档数据库,并使用复制仅同步某些记录。然后我只会备份存档数据库(或两者但在不同的时间表上)。

如果复制不是你喜欢的伏特加,那么你甚至可以触发 upsert 或删除到这个存档数据库。

我曾想过生成一个 csv 文件或一个 INSERT sql 脚本,但这会导致导入功能出现问题。当您从两个或更多数据库导出并且您现在在用户表的主键中存在潜在冲突时,就会出现问题。你如何解决这个问题?我还在一些表中使用文件流,所以我有一些不能轻易提取为文本格式的数据。

这是多租户的情况吗?无论如何,对于每个数据库,我都会创建第二个存档数据库,用于备份实际需要的信息。因此,没有两个数据库会输入同一个过滤存档数据库。

于 2010-07-28T22:34:43.690 回答
2

您可以使用分区在不同的文件组或不同的服务器之间划分数据。然后,您可以通过将不同的备份计划应用于文件组/服务器来选择备份每个分区的方式。

但总的来说,这些天存储非常便宜。除非你真的知道这会花费,否则我只会备份所有内容。备份系统越复杂,越容易出现故障,节省几场演出的成本不等于丢失所有数据的成本!

于 2010-07-29T20:52:02.010 回答
1

备份意味着能够拍摄数据库的快照,以便可以在其他时间恢复。如果您不关心某些记录,请删除它们,然后进行备份。

于 2010-07-21T12:07:13.333 回答
1

这个想法怎么样:

  • 为要备份的每个相关表创建备份表。
  • 使用一个简单的查询填充此表(您只需选择有关想要备份的用户的数据)
  • 每个相关表上的简单触发器(添加或更新)以使您的备份表同步。
  • 现在您可以从这个新表中导出备份
  • 恢复数据使用insert ignore

这只是一个想法,让我们批评:)

于 2010-07-21T16:12:37.810 回答
1

对于这个问题,我会采取一种通用的归档方法:

  • 为您需要导出的所有表创建一个包含所有模式的中央数据库

由于您想维护 Filestream 数据,我看不到如何使用 .csv 或 bcp 文件。另外,这符合您提到的拥有一个巨大的数据库来积累信息的想法。

  • 对于每个表,添加一个名为 DbName 的新列。

DbName 将是原始记录来自的数据库的名称。您可以将此列与用户 ID 组合以创建 复合键。这将允许您将身份字段保留在表中,并且仍然能够将具有相同 ID 的用户合并到一个表中。

  • 创建一个存储过程,它将必要的数据加载到新数据库中并同时删除它(或至少标记为删除)。

大概这个存储过程将作为 SQL 代理作业运行,并且您可以在每个数据库中都有一个。可以通过集中表引用要删除的用户。

于 2010-07-29T04:34:16.947 回答
1

另一种可能性是将 SSIS 与自定义选择语句和原始数据输出一起使用。内容将以本机格式非常快速地导入和导出,同时准确获得您想要的记录。此外,您可以在导出后对文件运行压缩或运行文件命令来移动它们。

于 2010-07-30T06:25:40.717 回答