sql-server - 数据库的部分克隆
问题描述
我们目前正在将我们的 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 的同一个实例中,但将来它们将在完全不同的机器上,可能没有直接连接(所以我必须通过某种类型的文件传输)。两者都配置了完全恢复。
我发现了一些类似的问题,但它们并没有真正帮助我。这是创建我的生产数据库的部分克隆的合理方法吗?如何让我的恢复命令按我的需要工作?
解决方案
您在正确的轨道上,但是由于您处于完全恢复模式,因此您还需要备份尾日志,并恢复自上次备份文件组以来的日志文件。如果日志备份不经常发生(例如每隔一小时),那么您只需在恢复文件组后进行尾部日志备份并恢复此单个日志文件。您还需要向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
推荐阅读
- sql - SQL:从不同的表中提取单元格中间的数字
- python - Pygame 碰撞只对一个对象起作用
- sql - 如何删除sql上的分区功能
- java - 除了长按之外,如何开始在 RecyclerView 中拖动项目?
- powershell - 删除 xml 文件中的特定标签
- python - TensorFlow/Keras:为什么在调用 fit 时会出现“ValueError:从 float32 到 uint8 的不兼容转换”?
- command-line - 在 GStreamer 中混合时,视频比音频快得多
- facebook - Facebook 通过我的网站分享并获得点赞和分享次数?
- docker - 将 RUN 命令放在一行中可以加快构建速度?
- spring-boot - Tomcat 的 TCP 连接调试日志