sqlmaint 实用工具

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

重要说明重要提示

下一版本的 Microsoft 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]

参数

参数与其值之间必须用一个空格分隔。例如,在 -S 和 server_name 之间必须有一个空格。

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

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

  • -Ulogin_ID
    指定连接服务器时使用的登录 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\AdventureWorks_maint.rpt
    

    则生成的文件名为:

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

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

  • -To operator_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\AdventureWorks_maint.htm,则 -DelHtmlRpt 将导致 sqlmaint 删除任何名称与 C:\Program Files\Microsoft SQL Server\Mssql\Backup\AdventureWorks_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 的数据库有 100MB 数据,指定 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 参数。

  • -SupportComputedColumn
    对计算列使用 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 指定备份的目录。如果还要指定 -UseDefDir,则不需要指定 backup_path。如果同时指定两者,则只采用 -UseDefDir。备份的存放地址可以是目录或磁带设备地址(例如,\\.\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 参数。

  • -UseDefDir
    对于磁盘备份,指定在默认的备份目录中创建备份文件。如果同时指定 UseDefDir 和 backup_path,则前者将取代后者。在默认 MicrosoftSQL Server 安装中,默认备份目录为 C:\Program Files\Microsoft SQL Server\MSSQL10.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-PlanName,则 sqlmaint 仅从指定的维护计划中检索计划中数据库的列表。在其余的 sqlmaint 参数中指定的所有操作都可应用于从计划获取的列表中的每个数据库。sqlmaint 实用工具不会应用在计划本身中定义的任何维护活动。

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

  • 任何维护操作失败。

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

  • 发生常规错误。

权限

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

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

示例

A. 对 AdventureWorks 数据库执行 DBCC 检查

sqlmaint -S MyServer -D AdventureWorks -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\MSSQL10.MSSQLSERVER\MSSQL\Backup 目录下的各自子目录中。同时,删除所有超过两个星期的备份

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

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

sqlmaint -S MyServer -BkUpDB -BkUpMedia DISK -UseDefDir