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 的语法关系图。 单独使用此参数。

-S server_name[\instance_name]

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

-U login_ID

指定连接到服务器时要使用的帐户。 如果未提供此参数, sqlmaint 会尝试使用 Windows 身份验证。 如果 login_ID 包含特殊字符,请将其括在双引号中(");否则,双引号是可选的。

重要

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

-P 密码

指定 login_ID的密码。 仅当您同时提供 -U 参数时,此参数才有效。 如果 密码 包含特殊字符,请用双引号将其括起来;否则,双引号是可选的。

重要

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

-D database_name

指定要在其中执行维护操作的数据库的名称。 如果 database_name 包含特殊字符,请将它括在双引号中;否则,双引号是可选的。

-PlanName 名称

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

-PlanID guid

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

-Rpt text_file

指定生成的报表的完整路径和文件名。 报表也可在屏幕上生成。 报表通过在文件名中添加日期来维护版本信息。 日期按如下所示生成,位于文件名的末尾,但在句号之前,格式为 _<yyyyMMddhhmm><yyyy> = year, <MM> = month, <dd> = day, <hh> = hour, <mm> = minute。

如果在 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) 文件名。

-To operator_name

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

-HtmlRpt html_file

指定生成 HTML 报表的文件的完整路径和名称。 sqlmaint 通过将格式为 _<yyyyMMddhhmm> 的字符串追加到文件名上来生成文件名,这与处理参数 -Rpt 的方式相同。

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

-DelHtmlRpt <time_period>

如果创建报表文件后的时间间隔超过 time_period,则删除报表目录中的任何 HTML 报表。 -DelHtmlRpt 查找名称符合 从html_file 参数生成的模式的文件。 如果html_fileC:\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的任何文件。

-RmUnusedSpace threshold_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

指定 DBCC CHECKDB 语句或使用 NOINDEX 选项的 DBCC CHECKDB 语句运行在 -D 所指定的数据库中。

如果数据库在运行时正在使用,sqlmaint 会向text_file写入警告。

-CkAl |-CkAlNoIdx

指定使用 NOINDEX 选项的 DBCC CHECKALLOC 语句在 -D 指定的数据库中运行。

-CkCat

指定 DBCC CHECKCATALOG 语句在指定的 -D数据库中运行。

-UpdOptiStats sample_percent

指定以下语句在数据库中的每个表上运行:

UPDATE STATISTICS table WITH SAMPLE sample_percent PERCENT;

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

有关详细信息,请参阅更新统计信息

-RebldIdx free_space

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

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

-支持计算列

必须指定以在计算列上使用 DBCC 运行维护命令。

-WriteHistory

指定对 sqlmaint 执行的每个维护操作在 msdb.dbo.sysdbmaintplan_history 中创建一个条目。 如果指定了 -PlanName-PlanID,那么 sysdbmaintplan_history 中的条目将使用指定计划的 ID。 如果指定了 -D,则 sysdbmaintplan_history 中的条目将使用零作为计划 ID。

-BkUpDB [ backup_path ] |-BkUpLog [ backup_path ]

指定备份操作。 -BkUpDb 备份整个数据库。 -BkUpLog 仅备份事务日志。

backup_path 指定备份的目录。 如果同时指定-UseDefDir,则不需要backup_path;如果同时指定这两者,则-UseDefDir将覆盖backup_path。 备份可以放在目录或磁带设备地址(例如) \\.\TAPE0中。 数据库备份的文件名按如下格式自动生成:

dbname_db_yyyyMMddhhmm.BAK

Where:

  • <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 参数。

-使用默认目录

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

磁带

指定备份介质为磁带。

-仅在干净时备份

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

-VrfyBackup

指定 RESTORE VERIFYONLY 在备份完成后在备份上运行。

number [ 分钟| 小时| 天| 周| 月 ]

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

  • 12weeks
  • 3months
  • 15days

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

备注

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

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

  • 任何维护操作都失败。

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

  • 遇到一般性故障。

权限

任何具有 读取和执行 权限 sqlmaint.exe 的 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 语句。 有关详细信息,请参阅权限(数据库引擎)。

示例

答: 对数据库执行 DBCC 检查

此示例针对数据库运行 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\MSSQLl13.MSSQLSERVER\MSSQL\Backup 目录将计划中的所有数据库备份到其单个子目录中。 它还会删除两周以前的任何备份。

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

D. 备份数据库

此示例将单个数据库备份到默认 <X>:\Program Files\Microsoft SQL Server\MSSQLl13.MSSQLSERVER\MSSQL\Backup 目录。

sqlmaint -S MyServer -BkUpDB -BkUpMedia DISK -UseDefDir