我正在使用 SQL Server 2005 sqlmaint.exe 备份远程 sql server 数据库。通常我会使用 -CkDB -BkUpOnlyIfClean 选项设置备份。
sqlmaint.exe -S IPForRemote\SLQInstance -U user -P pwd -D db -CkDB -BkUpOnlyIfClean
-Rpt C:\LocalPath\MSSQL_Backup\Log\dbbackup.log -VrfyBackup -BkUpMedia DISK
-BkUpDB C:\RemotePath\MSSQL_Backup -DelBkUps 3days -DelTxtRpt 3weeks
-HtmlRpt C:\LocalPath\MSSQL_Backup\HTMLRpt\dbbackup.html -DelHtmlRpt -3weeks
这个在大多数 SQL Server 数据库中都运行良好。今天我尝试对另一个 SQL Server Express 数据库执行相同的操作。我无法使用以下选项进行备份。备份在第一步就失败了:
[1] Database ctc_config: Check Data and Index Linkage...
以下是错误信息:
[Microsoft SQL-DMO (ODBC SQLState: 42000)] 错误 5030:[Microsoft][ODBC SQL Server 驱动程序][SQL Server]无法独占锁定数据库以执行操作。[Microsoft][ODBC SQL Server 驱动程序][SQL Server]检查语句中止。无法检查数据库,因为无法创建数据库快照,无法锁定数据库或表。请参阅联机丛书,了解何时会出现此行为以及存在哪些解决方法的详细信息。另请参阅以前的错误以了解更多详细信息。
如果我不包含它们,后面就没问题了。该数据库与我以前做过的数据库非常相似。
我还尝试使用 SQL Management Studio 在该远程 PC 上执行备份,方法是调用数据库的上下文菜单:task->backup.... 运行正常。我猜想 Studio 的备份可能不包括检查。
我不确定数据库是否有问题。我真的很想备份数据库并进行完整性检查。
答案1
我建议放弃 sqlmaint.exe(将被弃用)并结合实际 SQL 查询转向 SQLCMD http://msdn.microsoft.com/en-us/library/ms180944.aspx
sqlcmd -S <ComputerName>\<InstanceName> -i <MyScript.sql> -o <MyOutput.rpt>
我已将 DBCC CHECKDB 安排为每周计划作业,因此您不需要在每次备份时检查它