我正在编写脚本,将数据库从一台服务器复制到另一台服务器。两台服务器都运行 SQL Server 2005,并且数据库处于完整恢复模式。
这些数据库上的事务日志可能会变得非常大,我不需要它们在要复制到的服务器上。(即我不需要能够恢复到任何时间点,我只想要执行备份时的数据库副本)。因此,如果可能的话,我想避免执行日志备份、通过慢速网络复制和恢复所花费的时间。
我正在尝试使用“NO_LOG”备份选项来实现这一点。这样可以正常生成备份,但当我尝试将备份还原到目标服务器上时,数据库仍处于“正在还原”状态,无法访问。我猜这是因为它希望我还原事务日志。
有什么方法可以解决这个问题并创建一个新的空事务日志?请注意,我不能在备份之前截断源服务器上的事务日志(没有 NO_LOG),因为它们很重要。
如果没有,除了备份/恢复之外,还有哪些其他选项可以获取数据库副本?我已经尝试了“传输”方法,该方法将所有对象和数据编写成脚本,但由于对象数量太多,这种方法对我来说太慢了。
谢谢
编辑:这是使用的命令
BACKUP DATABASE FrontEnd TO DISK='c:\somepath\abackup.bak' WITH NO_LOG, COPY_ONLY
RESTORE DATABASE FrontEnd FROM Disk='c:\somepath\abackup.bak' WITH RECOVERY
对该命令的响应是
Processed 1944 pages for database 'FrontEnd', file 'DimensionPrototype' on file 1.
The database cannot be recovered because the log was not restored.
This RESTORE statement successfully performed some actions, but the database could not be brought online because one or more RESTORE steps are needed. Previous messages indicate reasons why recovery cannot occur at this point.
RESTORE DATABASE ... FILE=<name> successfully processed 1944 pages in 0.923 seconds (17.253 MB/sec).
答案1
我认为最简单的方法是将前端数据库的事务日志缩小到其初始大小并备份数据库,然后将事务日志扩大到适当的大小。
您应该在交易活动最少的安静时间执行此操作。
答案2
您无需将 NO_LOG 与 COPY_ONLY 选项结合使用即可实现此目的。COPY_ONLY 完整备份足以进行恢复。当您恢复数据库时,它将创建日志和数据文件,使其大小与备份时的大小相同。您无法绕过这一点。NO_LOG 正在截断您的事务日志,因此在运行此命令后,您无法对主数据库进行时间点恢复。如果您已发出此命令,则需要通过执行标准完整备份来重新开始备份集。
答案3
首先,这里似乎存在一些误解,认为整个事务日志(.ldf 文件)最终都会出现在备份文件中。事实并非如此。SQL Server 复制了足够多的事务日志,因此还原操作可以恢复数据库。
您无法恢复数据库的原因是您需要在刚刚恢复的备份之上恢复日志备份,以便数据库执行恢复。如果没有日志备份,SQL Server 就无法通过恢复使数据库联机。有关更多信息,请参阅ms kb文章。
没有办法解决这个问题。忍一忍,再去买一些磁盘空间。