sqlmaint 实用工具

适用于:SQL Server

如果成功运行,则sqlmaint 实用工具可以对一个或多个数据库执行一组指定的维护操作。 使用 sqlmaint 可以运行 DBCC 检查、备份数据库及其事务日志、更新统计信息以及重新生成索引。 所有数据库维护活动都会生成报表,可以将此报表发送到指定的文本文件、HTML 文件或电子邮件帐户。 sqlmaint 可以执行使用早期版本的 SQL Server 创建的数据库维护计划。 若要从命令提示符运行 SQL Server 维护计划,请使用 dtexec 实用工具

重要

在 SQL Server的未来版本中将删除此功能。 请避免在新的开发工作中使用该功能,并着手修改当前还在使用该功能的应用程序。 请改用 SQL Server 维护计划功能。 有关维护计划的详细信息,请参阅 维护计划

语法

  
sqlmaint   
[-?] |  
[  
     [-S server_name[\instance_name]]  
     [-U login_ID [-P password]]  
     {  
          [-D database_name | -PlanName name | -PlanID guid ]  
          [-Rpt text_file]  
          [-To operator_name]  
          [-HtmlRpt html_file [-DelHtmlRpt <time_period>] ]  
          [-RmUnusedSpace threshold_percentfree_percent]  
          [-CkDB | -CkDBNoIdx]  
          [-CkAl | -CkAlNoIdx]  
          [-CkCat]  
          [-UpdOptiStats sample_percent]  
          [-RebldIdx free_space]  
          [-SupportComputedColumn]  
          [-WriteHistory]  
          [  
               {-BkUpDB [backup_path] | -BkUpLog [backup_path] }  
               {-BkUpMedia  
                    {DISK [  
                           [-DelBkUps <time_period>]   
                           [-CrBkSubDir ]   
                           [-UseDefDir ]   
                          ]  
                     | TAPE   
                    }  
               }  
               [-BkUpOnlyIfClean]  
               [-VrfyBackup]  
          ]  
     }  
]  
<time_period> ::=  
number[minutes | hours | days | weeks | months]  

参数

参数与其值之间必须用一个空格分隔。 例如,在 -Sserver_name之间必须留一个空格。

-?
指定返回 sqlmaint 的语法关系图。 此参数必须单独使用。

-Sserver_name[ \instance_name]
指定 Microsoft SQL Server 的目标实例。 指定要连接到该服务器上 SQL Server 数据库引擎默认实例的 server_name。 指定要连接到该服务器上数据库引擎命名实例的 server_name\instance_name。 如果未指定服务器,sqlmaint 将连接到本地计算机上的数据库引擎默认实例。

-Ulogin_ID
指定连接服务器时使用的登录 ID。 如果未提供,sqlmaint 将尝试使用 Microsoft Windows 身份验证。 如果 login_ID 包含特殊字符,则必须用双引号 (") 引起来;否则,双引号为可选。

重要

请尽可能使用 Windows 身份验证。

-Ppassword
指定登录 ID 的密码。 仅在同时提供 -U 参数时有效。 如果 password 包含特殊字符,则必须用双引号引起来;否则,双引号为可选。

重要

密码不屏蔽。 请尽可能使用 Windows 身份验证。

-Ddatabase_name
指定要在其中执行维护操作的数据库的名称。 如果 database_name 包含特殊字符,则必须用双引号引起来;否则,双引号为可选。

-PlanNamename
指定使用数据库维护计划向导定义的数据库维护计划的名称。 sqlmaint 仅使用该计划中的数据库列表信息。 在其他 sqlmaint 参数中指定的任何维护活动都会应用到此数据库列表。

-PlanIDguid
指定使用数据库维护计划向导定义的数据库维护计划的全局唯一标识符 (GUID)。 sqlmaint 仅使用该计划中的数据库列表信息。 在其他 sqlmaint 参数中指定的任何维护活动都会应用到此数据库列表。 这必须与 msdb.dbo.sysdbmaintplans 中的 plan_id 值匹配。

-Rpttext_file
指定包含要生成的报表的文件的完整路径和名称。 报表也可在屏幕上生成。 报表通过在文件名中添加日期来维护版本信息。 日期是按以下格式生成的:在文件名末尾句点之前使用 _yyyyMMddhhmm格式。 yyyy = 年, MM = 月, dd = 日, hh = 小时, mm = 分钟。

如果在 1996 年 12 月 1 日 10:23 A.M. 运行该实用工具,并且 text_file 的值为:

c:\Program Files\Microsoft SQL Server\Mssql\Backup\AdventureWorks2022_maint.rpt  

则生成的文件名为:

c:\Program Files\Microsoft SQL Server\Mssql\Backup\AdventureWorks2022_maint_199612011023.rpt  

sqlmaint 访问远程服务器时, text_file 需要完整的通用命名约定 (UNC) 文件名。

-Tooperator_name
指定通过 SQL 邮件接收生成的报表的操作员。

-HtmlRpthtml_file
指定 HTML 报表将生成到其中的文件的完整路径和名称。 sqlmaint 生成文件名的方式是在文件名中追加格式为 _yyyyMMddhhmm 的字符串,这与针对 -Rpt 参数的文件命名方式相同。

sqlmaint 访问远程服务器时, html_file 需要完整的 UNC 文件名。

-DelHtmlRpt<time_period>
指定报表文件创建后的时间间隔超出 <time_period> 时,删除报表目录中的所有 HTML 报表。 -DelHtmlRpt 将查找名称符合由 html_file 参数生成的模式的文件。 如果“html_file”为 c:\Program Files\Microsoft SQL Server\Mssql\Backup\AdventureWorks2022_maint.htm,则“-DelHtmlRpt”将导致“sqlmaint”删除任何名称与模式 C:\Program Files\Microsoft SQL Server\Mssql\Backup\AdventureWorks2022_maint*.htm 匹配的文件,以及早于指定“<time_period>”的文件。

-RmUnusedSpacethreshold_percent free_percent
指定从 -D. 指定的数据库中删除未使用的空间。 该选项仅适用于定义为自动增长的数据库。 Threshold_percent 指定在 sqlmaint 可以尝试删除未使用数据空间之前数据库必须达到的大小 (MB)。 如果数据库小于 threshold_percent,则不采取任何操作。 Free_percent 指定数据库中必须保留的未使用空间的大小,以数据库最终大小的百分比表示。 例如,如果一个 200 MB 的数据库包含 100 MB 数据,则将 free_percent 指定为 10 将使数据库最终大小变为 110 MB。 请注意,如果数据库小于 free_percent 加上数据库中数据量的大小,则数据库不会扩展。 例如,如果 108 MB 的数据库有 100 MB 数据,则将 free_percent 指定为 10 不会将数据库扩展为 110 MB,而是仍保持为 108 MB。

-CkDB | -CkDBNoIdx
指定在 -D指定的数据库中运行 DBCC CHECKDB 语句或带 NOINDEX 选项的 DBCC CHECKDB 语句。 有关详细信息,请参阅 DBCC CHECKDB。

如果 sqlmaint 运行时数据库正在使用,则将在 text_file 中写入一个警告。

-CkAl | -CkAlNoIdx
指定在 -D指定的数据库中运行带 NOINDEX 选项的 DBCC CHECKALLOC 语句。 有关详细信息,请参阅 DBCC CHECKALLOC (Transact-SQL)

-CkCat
指定在 -D 指定的数据库中运行 DBCC CHECKCATALOG (Transact-SQL) 语句。 有关详细信息,请参阅 DBCC CHECKCATALOG (Transact-SQL)

-UpdOptiStatssample_percent
指定对数据库中的每个表运行下列语句:

UPDATE STATISTICS table WITH SAMPLE sample_percent PERCENT;  

如果表包含计算列,则在使用 -UpdOptiStats 时,还必须指定 -SupportedComputedColumn参数。

有关详细信息,请参阅 UPDATE STATISTICS (Transact-SQL)

-RebldIdxfree_space
指定应使用 free_space 百分比值作为填充因子的反数,重新生成目标数据库的表索引。 例如,如果 free_space 百分比是 30,则使用的填充因子为 70。 如果指定 free_space 百分比值为 100,则使用原始填充因子值重新生成索引。

如果索引位于计算列,则在使用 -RebldIdx 时,还必须指定 -SupportComputedColumn参数。

-RebldIdx
对计算列使用 sqlmaint 运行 DBCC 维护命令时,必须指定此参数。

-WriteHistory
指定在 msdb.dbo.sysdbmaintplan_history 中为 sqlmaint所执行的每个维护操作建立一个条目。 如果指定 -PlanName-PlanID ,则 sysdbmaintplan_history 中的条目使用指定计划的 ID。 如果指定 -D ,则通过给计划 ID 赋予零值来生成 sysdbmaintplan_history 中的条目。

-BkUpDB [ backup_path] | -BkUpLog [ backup_path ]
指定备份操作。 -BkUpDb 备份整个数据库。 -BkUpLog 只备份事务日志。

backup_path 指定备份的目录。 如果还指定了backup_path ,则不需要 backup_path 。如果同时指定了二者,则 backup_path 会覆盖后者。 备份的存放地址可以是目录或磁带设备地址(例如,\\.\TAPE0)。 数据库备份的文件名按如下格式自动生成:

dbname_db_yyyyMMddhhmm.BAK  
  

其中

  • dbname 是被备份的数据库的名称。

  • yyyyMMddhhmm 为备份操作的时间,其中 yyyy = 年, MM = 月, dd = 日, hh = 小时, mm = 分钟。

事务备份的文件名自动使用类似的格式生成:

dbname_log_yyyymmddhhmm.BAK  
  

如果使用 -BkUpDB 参数,则必须同时使用 -BkUpMedia 参数指定介质。

-BkUpMedia
指定备份的介质类型,DISK 或 TAPE。

DISK
指定备份介质为磁盘。

-DelBkUps<time_period>
对于磁盘备份,指定如果创建备份后的时间间隔超出了 <time_period>,则删除备份目录中的所有备份文件。

-CrBkSubDir
对于磁盘备份,指定在 [backup_path] 目录中创建子目录。如果同时指定了 -UseDefDir ,则在默认备份目录中创建子目录。 子目录的名称根据 -D中指定的数据库名称生成。 -CrBkSubDir 提供一种简单的方法将不同数据库的所有备份放置到单独的子目录中,而无需更改 backup_path 参数。

backup_path
对于磁盘备份,指定在默认的备份目录中创建备份文件。 如果同时指定两者,则UseDefDir 将覆盖 backup_path 。 在默认 Microsoft SQL Server 安装中,默认备份目录为 C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\Backup。

TAPE
指定备份介质为磁带。

-BkUpOnlyIfClean
指定仅当指定的 -Ck 检查未发现数据问题时才进行备份。 维护操作的运行顺序与其在命令提示中出现的顺序相同。 如果还要指定 -BkUpOnlyIfClean 或指定无论检查报告问题与否都进行备份,则需在 -BkUpDB/-BkUpLog 参数之前指定 -CkDB-CkDBNoIdx-CkAl-CkAlNoIdx-CkTxtAl-CkCat 参数。

-VrfyBackup
指定备份完成时,对备份运行 RESTORE VERIFYONLY。

number[minutes| hours| day| weeks| months]
指定时间间隔,用于确定报表或备份文件是否旧到需要将其删除。 number 是一个整数,后跟时间单位(没有空格)。 有效示例:

  • 12weeks

  • 3months

  • 15days

如果仅指定 number ,则默认日期部分为 weeks

备注

sqlmaint 实用工具可对一个或多个数据库执行维护操作。 如果指定 -D ,则在剩余的命令开关中指定的操作仅对指定数据库执行。 如果指定 -PlanName-PlanID ,则 sqlmaint 只从指定的维护计划中检索数据库列表信息。 在其余的 sqlmaint 参数中指定的所有操作都会应用于从计划获取的列表中的每个数据库。 sqlmaint 实用工具不会应用在计划本身中定义的任何维护活动。

如果成功运行,则 sqlmaint 实用工具将返回 0,如果失败则返回 1。 在下列情况下将报告失败:

  • 任何维护操作失败。

  • -CkDB-CkDBNoIdx-CkAl-CkAlNoIdx-CkTxtAl-CkCat 检查发现数据问题。

  • 发生常规错误。

权限

具有 读取和执行 权限的任何 Windows 用户都可以执行 sqlmaint sqlmaint.exe实用工具,默认情况下,该工具存储在 x:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER1\MSSQL\Binn 文件夹中。 此外,使用 -login_ID 指定的 SQL Server 登录名必须具有执行指定的操作所需的 SQL Server 权限。 如果使用 Windows 身份验证连接到 SQL Server,则映射到经过身份验证的 Windows 用户的 SQL Server 登录名必须具有执行指定操作所需的 SQL Server 权限。

例如,使用 -BkUpDB 需要执行 BACKUP 语句的权限。 使用 -UpdOptiStats 参数需要执行 UPDATE STATISTICS 语句的权限。 有关详细信息,请参阅联机丛书中相应主题的“权限”部分。

示例

A. 对数据库执行 DBCC 检查

sqlmaint -S MyServer -D AdventureWorks2022 -CkDB -CkAl -CkCat -Rpt C:\MyReports\AdvWks_chk.rpt  

B. 使用计划中所有数据库的 15% 样本更新统计信息。 同时,压缩任何已达到 110 MB 的数据库,以便仅使用 10% 可用空间

sqlmaint -S MyServer -PlanName MyUserDBPlan -UpdOptiStats 15 -RmUnusedSpace 110 10  

C. 将计划中的所有数据库备份到默认 x:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\Backup 目录下各自的子目录中。 同时,删除所有超过两个星期的备份

sqlmaint -S MyServer -PlanName MyUserDBPlan -BkUpDB -BkUpMedia DISK -UseDefDir -CrBkSubDir -DelBkUps 2weeks  

D. 将数据库备份到默认 x:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\Backup 目录中。

sqlmaint -S MyServer -BkUpDB -BkUpMedia DISK -UseDefDir  

另请参阅

BACKUP (Transact-SQL)
UPDATE STATISTICS (Transact-SQL)