【資料庫管理】資料庫自動維護任務介紹
- 2020 年 3 月 26 日
- 筆記
概述
本文介紹資料庫自動維護任務(Automated Maintenance Tasks)相關的基礎知識和總體介紹。
Oracle資料庫通過預定義的維護窗口中,定期自動地運行一些維護任務,用於實現如統計資訊收集、SQL調優顧問等工作,以減少DBA的工作量,使資料庫最優。
自動維護任務的演變
Oracle在10g的版本上最初推出自動維護作業,並在11g版本開始改為自動維護任務, 並在以後的版本上不斷功能加強和追加新的功能。 以下是自動維護任務在各個版本中主要變化:
10g
預定義的維護窗口(Maintenance Windows)
在10g版本上,Oracle主要有2個預定義的維護窗口(Maintenance Windows):
WEEKNIGHT_WINDOW : 周一到周五 每天22:00開始 ~ 次日06:00結束。 WEEKEND_WINDOW :周六和周日的全天
通過這兩個維護窗口, 組成MAINTENANCEWINDOWGROUP 用於管理維護作業(maintenance jobs)。
預定義的自動系統任務(Predefined Automatic System Tasks)
在10g版本上,主要有以下2個自動系統任務在維護窗口(Maintenance Windows)中運行。
自動統計資訊收集作業(Automatic Statistics Collection Job): 收集資料庫中所有無統計資訊或統計資訊過時的對象的統計資訊,以便提高 SQL 執行的性能。自動段指導作業(Automatic Segment Advisor Job) : 識別是否有可用回收空間的段,並提出如何消除這些段中的碎片的建議。
關於10g的維護作業的其他詳細內容可以參考以下的在線文檔。
Database Administrator's Guide
>23 Managing Automatic System Tasks Using the Maintenance Window
11g
預定義的維護窗口(Maintenance Windows)
在11g版本上,Oracle預定義了9個維護窗口(Maintenance Windows)。
新追加的,每天的維護窗口: (周一到周五 每天22:00 ~ 次日02:00;周六和周日 06:00 ~ 次日02:00)
MONDAY_WINDOW : 周一 22:00 ~ 周二 02:00 TUESDAY_WINDOW : 周二 22:00 ~ 周三 02:00 WEDNESDAY_WINDOW : 周三 22:00 ~ 周四 02:00 THURSDAY_WINDOW : 周四 22:00 ~ 周五 02:00 FRIDAY_WINDOW : 周五 22:00 ~ 周六 02:00 SATURDAY_WINDOW : 周六 06:00 ~ 周日 02:00 SUNDAY_WINDOW : 周日 06:00 ~ 周一02:00
為了兼容以前的版本而留下的維護窗口:(默認不使用)
WEEKNIGHT_WINDOW : 周一到周五 每天22:00開始 ~ 次日06:00結束。 WEEKEND_WINDOW : 周六和周日的全天
通過這九個維護窗口, 組成MAINTENANCEWINDOWGROUP 用於管理維護任務(maintenance tasks)。
預定義自動維護任務(Automated Maintenance Tasks)
在11g版本上,主要有以下3個自動管理維護任務在每天的維護窗口(Maintenance Windows)中運行。
自動優化器統計資訊收集(Automatic Optimizer Statistics Collection): 收集資料庫中所有無統計資訊或統計資訊過時的對象的統計資訊,以便提高 SQL 執行的性能。自動段指導(Automatic Segment Advisor): 識別是否有可用回收空間的段,並提出如何消除這些段中的碎片的建議。自動 SQL 優化指導(Automatic SQL Tuning Advisor): 檢查高負載 SQL 語句的性能,並提出如何優化這些語句的建議。
關於11g的維護任務的其他詳細內容可以參考以下的在線文檔。
Database Administrator's Guide
>26 Managing Automated Database Maintenance Tasks
12c
預定義的維護窗口(Maintenance Windows)
在12c版本上,和11g一樣,Oracle預定義了9個維護窗口(Maintenance Windows)。
包括,每天的維護窗口: (周一到周五 每天22:00 ~ 次日02:00;周六和周日 06:00 ~ 次日02:00)
MONDAY_WINDOW : 周一 22:00 ~ 周二 02:00 TUESDAY_WINDOW : 周二 22:00 ~ 周三 02:00 WEDNESDAY_WINDOW : 周三 22:00 ~ 周四 02:00 THURSDAY_WINDOW : 周四 22:00 ~ 周五 02:00 FRIDAY_WINDOW : 周五 22:00 ~ 周六 02:00 SATURDAY_WINDOW : 周六 06:00 ~ 周日 02:00 SUNDAY_WINDOW : 周日 06:00 ~ 周一02:00
為了兼容以前的版本而留下的維護窗口:(默認不使用)
WEEKNIGHT_WINDOW : 周一到周五 每天22:00開始 ~ 次日06:00結束。 WEEKEND_WINDOW : 周六和周日的全天
通過這九個維護窗口, 組成MAINTENANCEWINDOWGROUP 用於管理維護任務(maintenance tasks)。
預定義自動維護任務(Automated Maintenance Tasks)
在12c版本上,新追加了一個SQL計劃管理(SPM)進化指導(SPM Evolve Advisor)任務,用於SQL計劃管理計劃(SPM)的進化;所以,主要有以下4個自動管理維護任務在每天的維護窗口(Maintenance Windows)中運行。
自動優化器統計資訊收集(Automatic Optimizer Statistics Collection): 收集資料庫中所有無統計資訊或統計資訊過時的對象的統計資訊,以便提高 SQL 執行的性能。自動段指導(Automatic Segment Advisor): 識別是否有可用回收空間的段,並提出如何消除這些段中的碎片的建議。自動 SQL 優化指導(Automatic SQL Tuning Advisor): 檢查高負載 SQL 語句的性能,並提出如何優化這些語句的建議。SQL計劃管理(SPM)進化指導(SPM Evolve Advisor): 針對新追加的SQL計劃管理計划進行進化。
關於12c的維護任務的其他詳細內容可以參考以下的在線文檔。
Database Administrator's Guide
>26 Managing Automated Database Maintenance Tasks
各版本的主要變化
自動維護任務各版本的主要變化可以參考下表:

自動維護任務的控制(啟用、禁用、更改)
可以通過如下的方法對自動維護任務進行控制。
10g
1.針對特定維護作業的操作
啟用方法:
EXECUTE DBMS_SCHEDULER.ENABLE('GATHER_STATS_JOB'); EXECUTE DBMS_SCHEDULER.ENABLE('AUTO_SPACE_ADVISOR_JOB');
禁用方法:
EXECUTE DBMS_SCHEDULER.DISABLE('GATHER_STATS_JOB'); EXECUTE DBMS_SCHEDULER.DISABLE('AUTO_SPACE_ADVISOR_JOB');
2.確認各個維護作業的狀態:
select job_name,enabled from dba_scheduler_jobs where job_name in ( 'GATHER_STATS_JOB', 'AUTO_SPACE_ADVISOR_JOB');
- 維護窗口設定更改:
可以通過DBMSSCHEDULER.SETATTRIBUTE程式包對維護窗口進行如運行時間、頻度等設定的修改。如:
--修改周一到周五的維護窗口(WEEKNIGHT_WINDOW)為每天0點開始。 EXECUTE DBMS_SCHEDULER.SET_ATTRIBUTE( 'WEEKNIGHT_WINDOW', 'repeat_interval', 'freq=daily;byday=MON, TUE, WED, THU, FRI;byhour=0;byminute=0;bysecond=0');
參考: Database PL/SQL Packages and Types Reference >93 DBMS_SCHEDULER
11g& 12c
1.針對特定維護任務的操作
禁用方法:
--禁用sql tuning advisor BEGIN dbms_auto_task_admin.disable( client_name => 'sql tuning advisor', operation => NULL, window_name => NULL); END; /
啟用方法:
--啟用sql tuning advisor BEGIN dbms_auto_task_admin.enable( client_name => 'sql tuning advisor', operation => NULL, window_name => NULL); END; /
其中,clientname可以為DBAAUTOTASKCLIENT表中的任意一個任務名(clientname):
SQL> select client_name from DBA_AUTOTASK_CLIENT;CLIENT_NAME ---------------------------------------------------------------- auto optimizer stats collection auto space advisor sql tuning advisor
另外,需要注意的是在12c的環境中,CLIENT_NAME:sql tuning advisor同時控制著自動 SQL 優化指導(Automatic SQL Tuning Advisor)和SQL計劃管理(SPM)進化指導(SPM Evolve Advisor)。
2.啟用和禁用所有的維護任務:
--禁用 EXECUTE DBMS_AUTO_TASK_ADMIN.DISABLE; --啟用 EXECUTE DBMS_AUTO_TASK_ADMIN.ENABLE;
3.確認各個維護任務的狀態
--例:自動 SQL 優化指導(Automatic SQL Tuning Advisor) COL CLIENT_NAME FORMAT a20 SELECT CLIENT_NAME, STATUS FROM DBA_AUTOTASK_CLIENT WHERE CLIENT_NAME = 'sql tuning advisor';
4.維護窗口設定更改:
可以通過DBMSSCHEDULER.SETATTRIBUTE程式包對維護窗口進行如運行時間、頻度等設定的修改。如:
--修改SATURDAY_WINDOW窗口的持續時間 BEGIN dbms_scheduler.disable( name => 'SATURDAY_WINDOW'); dbms_scheduler.set_attribute( name => 'SATURDAY_WINDOW', attribute => 'DURATION', value => numtodsinterval(4, 'hour')); dbms_scheduler.enable( name => 'SATURDAY_WINDOW'); END; /
監視視圖
對於維護任務(作業)調查,相關的一些監視視圖。
10g
DBA_SCHEDULER_JOBS:資料庫內所有作業的相關詳細內容。DBA_SCHEDULER_JOB_LOG:作業的執行日誌 DBA_SCHEDULER_JOB_RUN_DETAILS:作業的執行詳細DBA_SCHEDULER_WINGROUP_MEMBERS:維護窗口的詳細 DBA_SCHEDULER_WINDOWS:資料庫內所有窗口的相關內容。DBA_SCHEDULER_JOB_CLASSES:Resource Plan相關資訊。
11g& 12c
DBA_AUTOTASK_CLIENT:查看各個維護任務客戶端的相關內容。 DBA_AUTOTASK_TASK:查看各個維護任務的相關內容。DBA_AUTOTASK_JOB_HISTORY:維護任務作業的執行歷史 DBA_AUTOTASK_SCHEDULE:今後32天內的各個Client的執行計劃 DBA_AUTOTASK_OPERATION:各個Client的執行操作 DBA_AUTOTASK_WINDOW_HISTORY:各個維護窗口的執行歷史DBA_AUTOTASK_WINDOW_CLIENTS:屬於各個維護窗口客戶端的維護任務的狀態。 DBA_SCHEDULER_WINDOWS:資料庫內所有窗口的相關內容。 DBA_SCHEDULER_WINDOW_GROUPS:資料庫內所有窗口組的相關內容。DBA_RSRC_PLANS:資料庫中所有的資源計劃(Resource Plan)資訊 DBA_RSRC_PLAN_DIRECTIVES:資源計劃指令資訊
重建資料庫自動維護任務
在某些情況下,如發現資料庫自動維護任務有問題或者想恢復成默認的設定時,你可以通過以下的方法重建資料庫維護窗口和自動維護任務。
conn /as sysdba-- 這個腳本會刪除維護窗口,但是可能會報一些可以忽略的錯誤。 @?/rdbms/admin/catnomwn.sql-- 也可以通過手動刪除維護窗口代替catnomwn.sql。 execute dbms_scheduler.drop_window('MONDAY_WINDOW'); execute dbms_scheduler.drop_window('TUESDAY_WINDOW'); execute dbms_scheduler.drop_window('WEDNESDAY_WINDOW'); execute dbms_scheduler.drop_window('THURSDAY_WINDOW'); execute dbms_scheduler.drop_window('FRIDAY_WINDOW'); execute dbms_scheduler.drop_window('SATURDAY_WINDOW'); execute dbms_scheduler.drop_window('SUNDAY_WINDOW');-- 重建維護窗口和維護作業(任務) @?/rdbms/admin/catmwin.sql

