首页 > 解决方案 > 数据库的部分克隆

问题描述

我们目前正在将我们的 LIMS(实验室信息管理系统)从 Oracle 迁移到 MS-SQL,我在某个领域遇到了困难。我们运行三个独立的实例:生产、开发和测试。Prod 实例是实况实例,由实验室使用,dev 实例是我在开发新功能的地方,而测试实例是在部署到生产之前测试这些新功能的地方。在这种情况下,我会定期将生产数据库复制(使用备份/恢复)到其他两个实例,以便我使用与操作员相同的配置。但是,生产数据库包含大量我在开发/测试实例中不需要的存档数据,因此我没有将这些表包含在备份中——这为我节省了数十分钟的时间。Oracle 对此很有用,因为您可以指定要包含在备份中的表。但是,AFAIK 这在 MS-SQL 中是不可能的,但可以做的是将活动表和存档表放入不同的文件组中。然后可以单独备份这些文件。

我已经成功地创建了我的 PRIMARY 文件组的备份,但是我很难恢复它。有时命令完成但数据库仍然无法访问,我被告知恢复尚未完成 - 其他时候它只是拒绝执行命令。这似乎与事务日志有关,但这扩展了我的知识。

我正在使用的备份命令是: BACKUP DATABASE production FILEGROUP='PRIMARY' TO DISK='C:\Temp\db.bak' WITH FORMAT,COPY_ONLY

我正在尝试的还原命令是: RESTORE DATABASE development FROM DISK='C:\Temp\db.bak' WITH REPLACE,NORECOVERY它告诉我“备份集包含一个数据库的备份,而不是现有的‘开发’数据库”。

目前源和目标在 SQL Server 的同一个实例中,但将来它们将在完全不同的机器上,可能没有直接连接(所以我必须通过某种类型的文件传输)。两者都配置了完全恢复。

我发现了一些类似的问题,但它们并没有真正帮助我。这是创建我的生产数据库的部分克隆的合理方法吗?如何让我的恢复命令按我的需要工作?

标签: sql-serverdatabase-backupsdatabase-restorefilegroup

解决方案


您在正确的轨道上,但是由于您处于完全恢复模式,因此您还需要备份尾日志,并恢复自上次备份文件组以来的日志文件。如果日志备份不经常发生(例如每隔一小时),那么您只需在恢复文件组后进行尾部日志备份并恢复此单个日志文件。您还需要向restore 命令添加WITH PARTIAL和。FILEGROUP = 'PRIMARY'

它看起来像这样:

BACKUP DATABASE production FILEGROUP='PRIMARY' TO DISK='C:\Temp\db.bak' WITH FORMAT
GO

BACKUP LOG productionLog TO DISK 'C:\Temp\tail.trn'
GO

RESTORE DATABASE development FILEGROUP = 'Primary' FROM DISK='C:\Temp\db.bak' WITH PARTIAL,NORECOVERY
RESTORE LOG FROM DISK 'C:\Temp\tail.trn' WITH RECOVERY

推荐阅读