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 的目標執行個體。 指定 server_name,即可連線至該伺服器上 SQL Server 資料庫引擎的預設執行個體。 指定 server_name\instance_name 連線到該伺服器上的資料庫引擎具名執行個體。 如果未指定伺服器,sqlmaint 會連接到本機電腦中資料庫引擎的預設執行個體。

-Ulogin_ID
指定連接伺服器時所用的登入識別碼。 如果未提供,sqlmaint 會嘗試使用 Microsoft Windows 驗證。 如果 login_ID 包含特殊字元,則必須以雙引號 (") 括住;否則可省略雙引號。

重要

盡可能使用 Windows 驗證。

-Ppassword
指定登入識別碼的密碼。 只有在同時提供 -U 參數時,這才有效。 如果 password 包含特殊字元,則必須將此引數括在雙引號內,否則可省略雙引號。

重要

密碼不會有遮罩。 盡可能使用 Windows 驗證。

-Ddatabase_name
指定要執行維護作業的資料庫名稱。 如果 database_name 包含特殊字元,則必須以雙引號括住;否則可省略雙引號。

-PlanNamename
指定利用資料庫維護計畫精靈定義的資料庫維護計畫名稱。 sqlmaint 所用的計畫資訊,只有計畫中的資料庫清單。 您在其他 sqlmaint 參數中指定的任何維護活動,都會套用到此資料庫清單。

-PlanIDguid
指定利用資料庫維護計畫精靈定義之資料庫維護計畫的全域唯一識別碼 (GUID)。 sqlmaint 所用的計畫資訊,只有計畫中的資料庫清單。 您在其他 sqlmaint 參數中指定的任何維護活動,都會套用到此資料庫清單。 這必須符合 msdb.dbo.sysdbmaintplans 中的 plan_id 值。

-Rpttext_file
指定要產生報表之檔案的完整路徑和名稱。 報表也會出現在畫面中。 這份報表會在檔案名稱中附加日期來維護版本資訊。 日期的產生方式如下:在檔案名稱的尾端、英文句點的前面,格式如下:_yyyyMMddhhmmyyyy = 年、 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 Mail 所產生之報表的操作員。

-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 會以 MB 為單位來指定大小,一旦資料庫到達此大小之後, sqlmaint 便會嘗試移除未使用的資料空間。 在資料庫大小小於 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 所指定的資料庫中,執行設定了 NOINDEX 選項的 DBCC CHECKDB 陳述式或 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 中的項目便會使用指定計畫的識別碼。 如果指定了 -D ,就會用幾個零做為計畫識別碼來建立 sysdbmaintplan_history 中的項目。

-BkUpDB [ backup_path] | -BkUpLog [ backup_path ]
指定備份動作。 -BkUpDb 會備份整個資料庫。 -BkUpLog 只會備份交易記錄。

backup_path 會指定備份目錄。 如果也指定了 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
對於磁碟備份,指定如果也指定了 -UseDefDir,便會在 [ backup_path ] 目錄或預設備份目錄中建立一個子目錄。 子目錄的名稱是從 -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-PlanIDsqlmaint 從指定的維護計畫中擷取的唯一資訊就是計畫中的資料庫清單。 從計畫中取得的清單所列出的每個資料庫,都會套用其餘 sqlmaint 參數所指定的所有作業。 sqlmaint 公用程式不會套用計畫本身所定義的任何維護活動。

如果 sqlmaint 公用程式順利執行,就會傳回 0,如果失敗,則傳回 1。 在下列情況下,會發出失敗報告:

  • 如果任何維護動作失敗。

  • 如果 -CkDB-CkDBNoIdx-CkAl-CkAlNoIdx-CkTxtAl-CkCat 檢查發現資料發生問題。

  • 如果發生一般失敗。

權限

sqlmaint 公用程式可以由任何對於 具有 讀取和執行 sqlmaint.exe權限的 Windows 使用者執行,依預設,其會儲存於 x:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER1\MSSQL\Binn 資料夾內。 另外,以 -login_ID 指定的 SQL Server 登入必須擁有執行指定動作的必要 SQL Server 權限。 如果 SQL Server 的連接是使用 Windows 驗證,則對應到已驗證之 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 目錄中,將計畫中的所有資料庫備份到它們的個別子目錄中。 另外,如果備份比 2 星期還要舊,便予以刪除

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)