【发布时间】:2015-09-24 18:08:41
【问题描述】:
我正在使用 sqlcmd (sqlcmd reference) 在 dos 批处理文件(不是 powershell)中备份大型数据库。大约需要 30 分钟。
sqlcmd -S 127.0.0.1 -d DbNameHere -E -Q "BACKUP DATABASE [DbNameHere] TO DISK = N'c:\Temp\MyBackup.bak' WITH COPY_ONLY, NOFORMAT, INIT, NAME = N'My Full Database Backup', SKIP, NOREWIND, NOUNLOAD, STATS = 10"
如果您在 SQL Management Studio 中运行 BACKUP 命令,您会得到如下输出:
10 percent processed.
20 percent processed.
...
在 DOS 批处理中,当备份完成时,我最多可以一次将所有 10、20、30..100 全部显示在屏幕上。
我尝试过使用这些参数,但我仍然没有在屏幕上获得所需的进度更新:
-m-1
-V 1
-r1
这些进度消息被缓冲,这可能是问题的一部分。这是在这里讨论的,例如:How do I flush the PRINT buffer in TSQL? 但我有一个长时间运行的命令,而不是多个命令。
您可以在其他地方运行单独的 SQL 语句,它会告诉您进度甚至预计完成时间:
SELECT session_id as SPID, command, a.text AS Query, start_time, percent_complete, dateadd(second,estimated_completion_time/1000, getdate()) as estimated_completion_time
FROM sys.dm_exec_requests r CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) a
WHERE r.command in ('BACKUP DATABASE','RESTORE DATABASE')
但要使用它,我必须创建第二个批处理文件(使用 sqlcmd 执行此语句),在运行 sqlcmd 备份之前将其在新窗口中打开,并在 1 分钟计时器上循环运行也许,并在备份完成后结束它。所有这些都是批量的。理想情况下,我宁愿将它们全部保存在一个批处理文件中!输出标准进度消息会简单得多!
有什么想法吗?
【问题讨论】:
-
运行
sqlcmd -S 127.0.0.1后交互输入命令是否会立即显示进度? -
wOxxOm,如果我以交互方式运行
sqlcmd -S 127.0.0.1,在1>之后输入备份命令,在2>之后输入GO然后[return],进度不会显示为它发生,在整个备份语句完成后,一口气全部显示出来。
标签: sql-server batch-file cmd database-backups sqlcmd