- Renaming a RAC cluster - 27/09/2018
- Stop/Start all RAC databases at once - 26/09/2018
- RMAN Backup script - 08/11/2017
The default maintenance window is not a good fit for every database, by default the maintenance window start at 10 PM and run for 4 hours during the week and start at 6 AM and last for 20 hours during the week-end. A different window exists for each day of the week and all the windows are grouped inside the MAINTENANCE_WINDOW_GROUP. It is possible to alter each window independently or to create a single window for all days of the week.
The following maintenance tasks are performed during the maintenance window:
- Optimizer statistics (OPTIMIZER_STATS)
- Segment advisor (SEGMENT_ADVISOR)
- SQL Tuning (SQL_TUNE_ADVISOR)
- Health Monitor (HEALTH_MONITOR)
And the default window group named MAINTENANCE_WINDOW_GROUP is associated with a DEFAULT_MAINTENANCE_PLAN which has the following configuration:
Consumer Group/subplan | Level 1 | Maximum Utilization Limit |
---|---|---|
ORA$AUTOTASK |
5% | 90 |
OTHER_GROUPS |
20% | – |
SYS_GROUP |
75% | – |
In this plan 75% of the resources are affected to sessions created by SYS or SYSTEM user. If these resources are not used by the SYS_GROUP then they are transfered to the other groups. As you can see there is also a restriction for the automatic maintenance tasks, they cannot use more that 90% of the resources.
here is what you is configured by default, independently of the management pack configured and the edition you use. This configuration is from a standard edition database with control_management_pack_access set to NONE.
SQL> select * from DBA_AUTOTASK_WINDOW_CLIENTS; WINDOW_NAME WINDOW_NEXT_TIME WINDO AUTOTASK OPTIMIZE SEGMENT_ SQL_TUNE HEALTH_M -------------------- -------------------------------------------------- ----- -------- -------- -------- -------- -------- SUNDAY_WINDOW 27-MAR-16 06.00.00.000000 AM EST5EDT FALSE ENABLED ENABLED ENABLED ENABLED DISABLED SATURDAY_WINDOW 26-MAR-16 06.00.00.000000 AM EST5EDT FALSE ENABLED ENABLED ENABLED ENABLED DISABLED FRIDAY_WINDOW 25-MAR-16 10.00.00.000000 PM EST5EDT FALSE ENABLED ENABLED ENABLED ENABLED DISABLED THURSDAY_WINDOW 24-MAR-16 10.00.00.000000 PM EST5EDT FALSE ENABLED ENABLED ENABLED ENABLED DISABLED WEDNESDAY_WINDOW 23-MAR-16 10.00.00.000000 PM EST5EDT FALSE ENABLED ENABLED ENABLED ENABLED DISABLED TUESDAY_WINDOW 29-MAR-16 10.00.00.000000 PM EST5EDT FALSE ENABLED ENABLED ENABLED ENABLED DISABLED MONDAY_WINDOW 28-MAR-16 10.00.00.000000 PM EST5EDT FALSE ENABLED ENABLED ENABLED ENABLED DISABLED
Maintenance example
In my case the database i’m working on is a 24/7 database which has less activity between 10 AM and 12 AM every day. I will create a new maintenance window named MORNING_WINDOW:
-- Create a 2 hours maintenance window every day beginning at 10:00 AM BEGIN dbms_scheduler.create_window( window_name=>'MORNING_WINDOW', resource_plan=>'DEFAULT_MAINTENANCE_PLAN', repeat_interval=>'freq=daily;byhour=10;byminute=0;bysecond=0', duration=>interval '2' hour, comments=>'Maintenance window'); END; /
Then we need to add the maintenance window to the MAINTENANCE_WINDOW_GROUP:
-- Add the newly created window to the MAINTENANCE_WINDOW_GROUP BEGIN dbms_scheduler.add_window_group_member('MAINTENANCE_WINDOW_GROUP', 'MORNING_WINDOW'); END; /
Let’s remove the default windows from MAINTENANCE_WINDOW_GROUP, we don’t need them anymore.
-- remove default maintenance windows from the MAINTENANCE_WINDOW_GROUP BEGIN dbms_scheduler.remove_window_group_member('MAINTENANCE_WINDOW_GROUP', 'MONDAY_WINDOW'); dbms_scheduler.remove_window_group_member('MAINTENANCE_WINDOW_GROUP', 'TUESDAY_WINDOW'); dbms_scheduler.remove_window_group_member('MAINTENANCE_WINDOW_GROUP', 'WEDNESDAY_WINDOW'); dbms_scheduler.remove_window_group_member('MAINTENANCE_WINDOW_GROUP', 'THURSDAY_WINDOW'); dbms_scheduler.remove_window_group_member('MAINTENANCE_WINDOW_GROUP', 'FRIDAY_WINDOW'); dbms_scheduler.remove_window_group_member('MAINTENANCE_WINDOW_GROUP', 'SATURDAY_WINDOW'); dbms_scheduler.remove_window_group_member('MAINTENANCE_WINDOW_GROUP', 'SUNDAY_WINDOW'); END; /
Here is the new configuration:
SQL> select * from DBA_AUTOTASK_WINDOW_CLIENTS; WINDOW_NAME WINDOW_NEXT_TIME WINDO AUTOTASK OPTIMIZE SEGMENT_ SQL_TUNE HEALTH_M -------------------- -------------------------------------------------- ----- -------- -------- -------- -------- -------- MORNING_WINDOW 24-MAR-16 10.00.00.000000 AM EST5EDT FALSE ENABLED ENABLED ENABLED ENABLED DISABLED
Deactivating some maintenance tasks
If you, like me and are in Standard Edition you have not use of the SQL Tuning advisor for example, you have no right to use it, but it runs in your maintenance window for nothing, let’s disable it:
-- disable sql tuning advisor BEGIN dbms_auto_task_admin.disable( client_name => 'sql tuning advisor', operation => NULL, window_name => NULL); END; /
If you want to deactivate the task only for a specific window you can use :
-- disable sql tuning advisor on monday BEGIN dbms_auto_task_admin.disable( client_name => 'sql tuning advisor', operation => NULL, window_name => 'MONDAY_WINDOW'); END; /
If you want to deactivate all the tasks, use the following command:
-- disable all maintenance tasks BEGIN dbms_auto_task_admin.disable; END; /
Altering the default maintenance windows
If you choose to keep the default maintenance windows and just change one of them to adapt it to you needs you can use the DBMS_SCHEDULER.SET_ATTRIBUTE prodcedure.
Change the interval :
-- set the MONDAY_WINDOW to run on monday a 10 AM EXECUTE DBMS_SCHEDULER.SET_ATTRIBUTE('MONDAY_WINDOW','repeat_interval','freq=weekly;byday=MON;byhour=10;byminute=0;bysecond=0');
Change the duration of the Window:
-- change duration to 4 hours EXECUTE DBMS_SCHEDULER.SET_ATTRIBUTE('MONDAY_WINDOW','duration',numtodsinterval(2, 'hour'));
If you need more information you can have a look at the oracle documentation:
Managing Automated Database Maintenance Tasks
Good maintenance 🙂
Thanks Cyrille for nice article.
The docs you pointed too are 12c, I believe your article is true too for 11g, the version at which the framework ‘autotask’ appeared for maintenace tasks
dba_autotask_client , DBA_AUTOTASK_TASK , DBA_AUTOTASK_WINDOW_CLIENTS
..
Foued
Hi Foued,
Thanks for your support and your feedback, you are absolutely right, these views appeared in 11g even if some of these task were also available in 10g.
Cyrille
Thank you Cyrille. With this article you transform boring tasks into interesting ones.
Merci Vincent
I want to create an Oracle DBMS Job that runs every week day (not on weekends) from 09:00 to 20:00 every 10 min.
FREQ=MINUTELY;INTERVAL=10;BYDAY=MON,TUE,WED,THU,FRI;BYHOUR=9,10,11,12,13,14,15,16,17,18,19,20
This should work