无法镜像数据库SQL Server 2012


11

尝试使用以下命令镜像数据库时

ALTER AVAILABILITY GROUP SQLAlwaysonGroup ADD DATABASE test0916aj8CJ

我收到以下错误

消息1475,级别16,状态105,行1
数据库“ test0916aj8CJ”可能包含尚未备份的大容量记录更改。在主体数据库或主数据库上进行日志备份。然后在镜像数据库上启用数据库备份以恢复备份,或者在每个辅助数据库上还原该备份以将其加入可用性组。

可以不备份数据库就可以做到吗?还是应该备份然后放弃备份。它用于新创建的数据库,因此无论如何我现在都不需要备份。

我尝试了以下方法...

BACKUP
DATABASE [test0916aj8CJ] TO DISK = NNUL
WITH COPY_ONLY, NOFORMAT, INIT,
NAME = Ntest-Full Database Backup’,
SKIP, NOREWIND, NOUNLOAD
GO

但是上述方法也不起作用。

谢谢


几件事...您实际上并不是在使用该命令进行镜像,而是将数据库添加到可用性组。然后,这使我问到如何设置AG,数据库处于哪种恢复模式以及为什么要解决日志问题,您正在执行COPY_ONLY备份,这会使日志保持原样,而这并不是错误所指定的?在我看来,您似乎缺少一些步骤,或者对要执行的操作感到非常困惑。
Steve Mangiameli 2015年

Answers:


15

容易重现您得到的错误

  • 在主数据库上以完全恢复模式创建数据库。
  • 在辅助数据库中以完全恢复模式创建数据库。
  • 启动GUI并尝试配置主要和次要之间的镜像。

以下是您将得到的错误:

数据库“ test_mirroring_kin”可能包含尚未备份的大容量记录更改。在主体数据库或主数据库上进行日志备份。然后在镜像数据库上启用数据库备份以恢复备份,或者在每个辅助数据库上还原该备份以将其加入可用性组。(Microsoft SQL Server,错误:1475)

在此处输入图片说明

让我们了解一下该错误是什么:

您以完全恢复模式配置了数据库,并认为数据库确实处于完全恢复模式。

以上是不正确的。创建数据库后,即使数据库处于FULL恢复模式,也没有进行FULL备份,但是它处于伪SIMPLE恢复状态

您可以使用dbcc dbinfo-> dbi_dbbackupLSN具有值0:0:0(0x00000000:00000000:0000)使用Paul Randal的脚本轻松地进行验证

dbcc traceon (3604)
go
dbcc dbinfo('test_mirroring_kin') with tableresults
go
dbcc traceoff (3604)

在此处输入图片说明

编辑:即使使用COPY_ONLY选项进行第一次完全备份也无法建立备份链

backup database test_mirroring_kin
to disk = 'D:\test_mirroring_kin_FULL.bak'
with init, stats=10, COPY_ONLY

dbcc dbinfo-> dbi_dbbackupLSN仍具有的值0:0:0(0x00000000:00000000:0000)。这意味着数据库仍处于伪简单恢复模式。

解决上述错误需要做什么?

您需要在主数据库上进行完整备份+一个事务日志备份,然后在辅助数据库上将其还原with norecovery,然后将数据库加入AG组或镜像中。

作为附带说明和完整起见,对于您的脚本讲解backup to NUL,请阅读Gail Shaw撰写的此博客文章。


5

为什么TO DISK = N’NUL’

我不明白您为什么使用TO DISK = N’NUL’

BACKUP
DATABASE [test0916aj8CJ] TO DISK = NNUL

如果执行此操作,则备份将保存到NUL,即=到无处/无处,并且由于其文件不存在而无法使用。

虽然NUL也可以用作LOG备份的目标,但也不应使用它,尤其是在Prod服务器上,因为LOG将会丢失并且备份链将断开。(〜类似于SHRINKFILE

日志备份

在将数据库添加到组之前,您必须准备它。当您要准备辅助数据库时,必须至少备份并还原1个事务日志。镜像使用它来确定哪些事务已在辅助数据库上同步,哪些事务尚未与主数据库同步。

因此,您必须在主数据库上备份事务日志:

BACKUP LOG [test0916aj8CJ] TO  DISK = N'....bak' 
WITH  COPY_ONLY, FORMAT, INIT,  NAME = N'test0916aj8CJ-Transaction Log  Backup', STATS = 10

COPY_ONLY必须使用该选项。确保在日志备份结束时日志不会被截断。

主数据库备份链

但是,您不能单独还原日志备份,这意味着没有备份链(另请参阅“ Kin答案”)。这意味着必须在执行完整数据库备份(如果需要,+可选的差异备份)之后进行事务日志备份。

由于该COPY_ONLY选件不会破坏备份链,因此也不会创建备份链。该COPY_ONLY选项不能用于数据库备份。

备份顺序:

  • 没有COPY_ONLY选项的完整数据库备份
  • 可选的差异备份
  • 1个带有COPY_ONLY选项的日志备份
  • 必要时进行另一个(或更多)LOG备份...

还原辅助数据库

然后,必须在辅助数据库上还原数据库备份(+差异)。

必须使用该NORECOVERY选项将其还原,因为一旦还原了完整备份,您还想还原日志备份。

最后,您将还原LOG Backup。您仍然需要使用该NORECOVERY选项,因为镜像将保持到位还原事务。

  • 使用NORECOVERY选项还原完整备份
  • 使用NORECOVERY选项还原DIFF备份
  • 使用NORECOVERY选项按顺序还原所有LOG备份

让我们放在一起(适应您的环境)

  • 在主服务器上运行:

    USE master
    Go
    BACKUP DATABASE [test0916aj8CJ] TO DISK = N'....bak'
    WITH FORMAT, INIT, NAME = N'test0916aj8CJ-Full Database Backup', STATS = 10
    GO
    BACKUP LOG [test0916aj8CJ] TO DISK = N'....bak' 
    WITH COPY_ONLY, FORMAT, INIT, NAME = N'test0916aj8CJ-Transaction Log Backup', STATS = 10
    GO
  • 在辅助服务器上运行:

    USE master
    Go
    RESTORE DATABASE [test0916aj8CJ] FROM DISK = N'....bak' 
    WITH FILE = 1, NORECOVERY, NOUNLOAD, REPLACE, STATS = 10
    GO
    RESTORE LOG [test0916aj8CJ] FROM DISK = N'....bak' 
    WITH FILE = 1, NORECOVERY, NOUNLOAD, STATS = 10
  • 然后,您可以继续将新的辅助数据库添加到可用性组中。

可选动作

  • 最好将DISK选项设置为可从主服务器和辅助服务器访问的共享文件夹。
  • 另外,最好将数据库文件存储在主服务器和辅助服务器上的相似磁盘和位置上。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.