- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 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 分钟计时器上循环运行它也许吧,并在备份完成后结束它。所有这些都是批量的。理想情况下,我宁愿将其全部保存在一个批处理文件中!输出标准进度消息会简单得多!
有什么想法吗?
最佳答案
我想出了一种解决方案。缺点是它涉及第二个批处理文件。它基本上启动一个带有给定名称的进度窗口。该进度窗口会定期刷新。主进程完成后,它会使用给定的名称调用taskkill
。进度批处理依赖于超时
。两者都在我的 Windows 8 工作站以及 2008 R2 和 2012 服务器上。
主备份批处理:
@echo off
rem lots of other lines in my main batch file here
start "BACKUP_PROGRESS" /belownormal cmd /d /c "backup_progress2.cmd"
sqlcmd -S 127.0.0.1 -d DBNameHere-E -Q "BACKUP DATABASE [DBNameHere] TO DISK = N'c:\Temp\DBNameHere.bak' WITH COPY_ONLY, NOFORMAT, INIT, NAME = N'DBNameHere-Full Database Backup', SKIP, NOREWIND, NOUNLOAD, STATS = 10"
taskkill /FI "WINDOWTITLE eq BACKUP_PROGRESS" /F > nul
rem my main batch file continues here with lots of other lines
进度批处理文件(在主批处理中称为 backup_progress2.cmd
)。 setlocal enableextensionsenabledelayedexpansion
只是为了让我可以使用 !time!
显示以秒为单位的时间。
@echo off
rem http://stackoverflow.com/questions/21434982/windows-batch-scripting-catch-user-reaction-to-timeout-command
SET timeout=60
:loop
cls
setlocal enableextensions enabledelayedexpansion
echo.
echo Time now: !time!
echo.
endlocal
sqlcmd -S 127.0.0.1 -d DBNameHere -E -Q "SET NOCOUNT ON;SELECT start_time,cast(percent_complete as int) as progress,dateadd(second,estimated_completion_time/1000, getdate()) as estimated_completion_time, cast(estimated_completion_time/1000/60 as int) as minutes_left FROM sys.dm_exec_requests r WHERE r.command='BACKUP DATABASE'"
echo.
echo Refreshing every %timeout% seconds.
timeout %timeout% > nul
goto loop
关于sql-server - 如何使用 sqlcmd 在批处理文件中显示进度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31265434/
我希望将 SQL 查询 Select count(*) from Table 的输出用作批处理脚本中的变量。我正在使用 sqlcmd 来执行此查询,但还没有想出如何正确执行此操作。 如有任何帮助或示例
我正在使用 powershell 并使用 Invoke-SqlCmd .我能够将变量传递给 SQL: $variables = @( "MyVariable='hello'" ) Invoke-Sql
我在调用 Invoke-SqlCmd 时遇到问题,因为它包含第二个 Invoke-SqlCmd 调用: function Get-Foo { $query=` @" WITH data AS (
我正在使用 sqlpackage.exe 部署 dacpac,需要为 dacpac 中的部署后脚本传递 SqlCMD 变量。我发现了一个相关问题here和 here . 但是我收到以下错误:以下 Sq
我正在使用 sqlpackage.exe 部署 dacpac,需要为 dacpac 中的部署后脚本传递 SqlCMD 变量。我发现了一个相关问题here和 here . 但是我收到以下错误:以下 Sq
我可以找到的所有文档和帮助线程都包含带有 Authentication=ActiveDirectoryIntegrated 的引用连接字符串,以便通过 AAD 集成命中 SQL。如果我使用的是 SSM
我有一个运行多个 *.sql 文件的批处理文件。目前,所有变量都已硬编码在 sql 文件中。我想知道如何从 SQLCMD 批处理文件中传递变量值。 变量名示例: DECLARE @TW_FROM DA
我正在使用 SQLCMD 运行一个 270 MB 的 .sql 文件。脚本文件 (.sql) 是使用 Red Gate SQL 数据比较同步向导生成的。由于内存不足,我无法从 SSMS 运行它。我登录
我以这种方式使用 sqlcmd 执行一些命令行批处理 (.bat): sqlcmd -i Scripts\STEP01.sql -o PROCESS.log -S MYSERVER -E -d MYD
在我的部署后脚本中,我想使用这样的通配符将所有脚本文件包含在一个文件夹中: :r .\$(ReleaseName)\*.sql 有没有办法做到这一点?我找不到任何.. 最佳答案 我让它工作: ':r
所以这是我想要运行的查询 sqlcmd -E -S localhost\MSSQLSERVER_2016 -i C:\Tables.sql 在这个实例中我有多个数据库,当上面的命令运行时,我不知道它针
我正在尝试在运行 SQL Server 2005 的 Windows 计算机上使用 sqlcmd 将查询写入 csv 文件。我们通常使用的命令行选项是: -l 60 -t 300 -r 1 -b -W
我正在尝试使用 sqlcmd 来执行一些 SQL 脚本。 使用带有简单查询的测试命令,例如: sqlcmd -S HOSTNAME -d MYDATABASE -Q 'SELECT Names FRO
我正在使用以下代码在远程机器上执行查询。 Invoke-Sqlcmd -ServerInstance $serverInstance -Database $dbName -InputFile $fil
我已经调用了许多.sql文件的fetchDb.bat文件 将数据库升级到最新版本 这是用于执行.sql文件内容的命令 sqlcmd %Sqlinstance% -d DataBase -i "file
我在一个文件夹的多个文本文件中有TSQL插入语句。我需要在Powershell中使用foreach循环在sql服务器上运行。它应该转到文件夹中的每个文件,读取执行查询并再次终止连接,再读取下一个文件,
我们在使用 Powershell 和 SQLCMD 时遇到问题,当 -v 参数变量中有空间时,powershell 将无法运行命令。 例如 sqlcmd ... -v VAR="Some space"
我有一个简单的 SQLCMD 脚本,其中包含如下几行: /* Load data into Exampletable */ BULK INSERT dbo.Example /* NOTE: I
如何根据系统日期将输出文本文件命名为 YYYYMMDD? sqlcmd -S DataBBB -i c:\scripts\followup.sql -o %DATE:~4,2%_%DATE:~
我刚刚通过Chocolatey重新安装了SQL Server Express 2014。该服务当前正在运行。 当我在CMD或Powershell中运行此命令时: > sqlcmd -e -S .\SQ
我是一名优秀的程序员,十分优秀!