Sql server 数据库的部分克隆

Sql server 数据库的部分克隆,sql-server,database-backups,database-restore,filegroup,Sql Server,Database Backups,Database Restore,Filegroup,我们目前正在将我们的LIMS(实验室信息管理系统)从Oracle迁移到MS-SQL,我在某个领域遇到了困难。我们运行三个独立的实例:生产、开发和测试。Prod实例是实验室使用的实时实例,dev实例是我开发新特性的地方,而测试实例是在部署到生产环境之前测试这些新特性的地方。在这种情况下,我会定期将生产数据库复制(使用备份/恢复)到其他两个实例,以便使用与操作员相同的配置。但是,生产数据库包含大量我在开发/测试实例中不需要的归档数据,因此我不在备份中包含这些表-这为我节省了数十分钟的时间。Oracl

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

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

我使用的备份命令是:
将数据库生产文件组='PRIMARY'备份到磁盘='C:\Temp\db.bak',格式为,仅复制_

我正在尝试的还原命令是:
使用REPLACE,NORECOVERY从磁盘class='C:\Temp\db.bak'还原数据库开发
它告诉我“备份集保存的是一个数据库的备份,而不是现有的“开发”数据库”

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


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

您的做法是正确的,但由于您处于完全恢复模式,因此还需要备份,并恢复自上次备份文件组以来的日志文件。如果日志备份不经常发生(如每小时一次),则只需进行尾部日志备份,并在恢复文件组后恢复此单个日志文件。您还需要在restore命令中添加带有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

非常感谢你的建议-这让我感动了,但我仍然有问题。我现在使用以下命令:

将数据库Prod FILEGROUP='PRIMARY'备份到磁盘='C:\Temp\Temp\Prod.bak',格式为;
将日志Prod备份到磁盘='C:\Temp\Temp\Prod.trn';
从磁盘class='C:\Temp\Temp\prod.bak'还原数据库测试文件组class='PRIMARY',并进行部分恢复;
从磁盘class='C:\Temp\Temp\prod.trn'恢复日志测试并进行恢复

我得到以下回应:

为数据库“Prod”和文件1上的文件“Prod”处理了376页。
已处理文件1上数据库“Prod”和文件“Prod_log”的2页。
备份数据库…文件=在0.082秒(36.013 MB/秒)内成功处理378页。
为数据库“Prod”和文件6上的文件“Prod_log”处理了7页。
备份日志在0.007秒(7.254 MB/秒)内成功处理了7页。
Msg 3154,第16级,第4状态,第3行
备份集保存现有“测试”数据库以外的数据库的备份。
Msg 3013,16级,状态1,第3行
还原数据库正在异常终止。
Msg 3154,第16级,第4状态,第4行
备份集保存现有“测试”数据库以外的数据库的备份。
Msg 3013,16级,状态1,第4行
还原日志异常终止。

如果我将
与REPLACE
一起使用,而不是将
与PARTIAL一起使用,则会收到不同的错误消息:

无法恢复数据库,因为未还原日志。
前滚起点现在是日志序列号(LSN)35000000203200001。需要通过LSN 35000000203200001的额外前滚来完成恢复序列。
此RESTORE语句成功执行了某些操作,但由于需要一个或多个还原步骤,数据库无法联机。前面的消息指出了此时无法进行恢复的原因。
还原数据库。。。FILE=在0.024秒(123.046 MB/秒)内成功处理378页。
味精4326,16级,状态1,第4行
此备份集中的日志终止于LSN 350000000092800001,现在应用于数据库还为时过早。可以恢复最近的日志备份,该备份包括LSN 35000000203200001。
Msg 3013,16级,状态1,第4行
还原日志异常终止。

如果我在数据库还原中使用NORECOVERY
时使用
,则该命令会成功,但
还原日志
会给出:

还原数据库。。。FILE=在0.032秒(92.285 MB/秒)内成功处理378页。
味精4326,16级,状态1,第4行
此备份集中的日志终止于LSN 350000000092800001,现在应用于数据库还为时过早。可以恢复最近的日志备份,该备份包括LSN 35000000203200001。
Msg 3013,16级,状态1,第4行
还原日志异常终止。


在任何情况下,目标数据库都处于“还原”状态。

您可以通过Restore filelistonly检查当前备份中的文件