Итак, создал я план SUPERMAG_DAY
что-то вроде
Код:
BEGIN
dbms_resource_manager.clear_pending_area();
dbms_resource_manager.create_pending_area();
DBMS_RESOURCE_MANAGER.CREATE_PLAN('SUPERMAG_DAY','The plan for normal daily operations');
dbms_resource_manager.create_consumer_group('LOW_GROUP','low','ROUND-ROBIN');
dbms_resource_manager.create_consumer_group('SYS_GROUP','system','ROUND-ROBIN');
dbms_resource_manager.create_consumer_group('ANAL','bored','ROUND-ROBIN');
dbms_resource_manager.submit_pending_area();
END;
/
В нем решил распределить несколько групп:
Код:
BEGIN
dbms_resource_manager.clear_pending_area();
dbms_resource_manager.create_pending_area();
dbms_resource_manager.update_plan_directive(
plan => 'SUPERMAG_DAY',
group_or_subplan => 'OTHER_GROUPS',
new_comment => 'other',
new_cpu_p1 => 0, new_cpu_p2 => 0, new_cpu_p3 => 0, new_cpu_p4 => 0,
new_cpu_p5 => 0, new_cpu_p6 => 0, new_cpu_p7 => 0, new_cpu_p8 => 1,
new_parallel_degree_limit_p1 => 1,
new_active_sess_pool_p1 => 2,
new_queueing_p1 => NULL,
new_switch_group => 'KILL_SESSION',
new_switch_time => 600,
new_switch_estimate => false,
new_max_est_exec_time => 600,
new_undo_pool => NULL,
new_max_idle_time => 3600,
new_max_idle_blocker_time => 10,
new_switch_time_in_call => NULL
);
dbms_resource_manager.submit_pending_area();
END;
/
BEGIN
dbms_resource_manager.clear_pending_area();
dbms_resource_manager.create_pending_area();
dbms_resource_manager.update_plan_directive(
plan => 'SUPERMAG_DAY',
group_or_subplan => 'SYS_GROUP',
new_comment => 'sys',
new_cpu_p1 => 10, new_cpu_p2 => 10, new_cpu_p3 => 10, new_cpu_p4 => 10,
new_cpu_p5 => 10, new_cpu_p6 => 10, new_cpu_p7 => 10, new_cpu_p8 => 10,
new_parallel_degree_limit_p1 => 4,
new_active_sess_pool_p1 => NULL,
new_queueing_p1 => NULL,
new_switch_group => 'KILL_SESSION',
new_switch_time => 36600,
new_switch_estimate => false,
new_max_est_exec_time => NULL,
new_undo_pool => NULL,
new_max_idle_time => 36600,
new_max_idle_blocker_time => 600,
new_switch_time_in_call => NULL
);
dbms_resource_manager.submit_pending_area();
END;
/
BEGIN
dbms_resource_manager.clear_pending_area();
dbms_resource_manager.create_pending_area();
dbms_resource_manager.update_plan_directive(
plan => 'SUPERMAG_DAY',
group_or_subplan => 'DEFAULT_CONSUMER_GROUP',
new_comment => 'default',
new_cpu_p1 => 90, new_cpu_p2 => 90, new_cpu_p3 => 90, new_cpu_p4 => 90,
new_cpu_p5 => 90, new_cpu_p6 => 90, new_cpu_p7 => 90, new_cpu_p8 => 86,
new_parallel_degree_limit_p1 => 4,
new_active_sess_pool_p1 => 50,
new_queueing_p1 => NULL,
new_switch_group => 'KILL_SESSION',
new_switch_time => 7200,
new_switch_estimate => false,
new_max_est_exec_time => NULL,
new_undo_pool => NULL,
new_max_idle_time => 10000,
new_max_idle_blocker_time => 30,
new_switch_time_in_call => NULL
);
dbms_resource_manager.submit_pending_area();
END;
/
BEGIN
dbms_resource_manager.clear_pending_area();
dbms_resource_manager.create_pending_area();
dbms_resource_manager.update_plan_directive(
plan => 'SUPERMAG_DAY',
group_or_subplan => 'ANAL',
new_comment => 'lowest',
new_cpu_p1 => 0, new_cpu_p2 => 0, new_cpu_p3 => 0, new_cpu_p4 => 0,
new_cpu_p5 => 0, new_cpu_p6 => 0, new_cpu_p7 => 0, new_cpu_p8 => 1,
new_parallel_degree_limit_p1 => 1,
new_active_sess_pool_p1 => 3,
new_queueing_p1 => NULL,
new_switch_group => 'KILL_SESSION',
new_switch_time => 600,
new_switch_estimate => false,
new_max_est_exec_time => NULL,
new_undo_pool => NULL,
new_max_idle_time => 7200,
new_max_idle_blocker_time => 15,
new_switch_time_in_call => NULL
);
dbms_resource_manager.submit_pending_area();
END;
/
BEGIN
dbms_resource_manager.clear_pending_area();
dbms_resource_manager.create_pending_area();
dbms_resource_manager.update_plan_directive(
plan => 'SUPERMAG_DAY',
group_or_subplan => 'LOW_GROUP',
new_comment => 'lower',
new_cpu_p1 => 0, new_cpu_p2 => 0, new_cpu_p3 => 0, new_cpu_p4 => 0,
new_cpu_p5 => 0, new_cpu_p6 => 0, new_cpu_p7 => 0, new_cpu_p8 => 1,
new_parallel_degree_limit_p1 => 1,
new_active_sess_pool_p1 => 10,
new_queueing_p1 => NULL,
new_switch_group => 'KILL_SESSION',
new_switch_time => 1200,
new_switch_estimate => false,
new_max_est_exec_time => NULL,
new_undo_pool => NULL,
new_max_idle_time => 7200,
new_max_idle_blocker_time => 15,
new_switch_time_in_call => NULL
);
dbms_resource_manager.submit_pending_area();
END;
/
В принципе все просто до банального. Возьмем последнюю, LOW_GROUP. При распределении процессорного времени, этой группе достается 1% на восьмом уровне (каждый уровень = 100%, больше выделить не удастся). Уровень параллелизма зажат в 1, т.е. как бы не пытался распараллелить запрос неумеха, он это сделать не сможет (не надо есть мои процессоры кривыми запросами). Более 10 сессий он одновременно не запустит. Если он надумает запустить запрос более чем на 1200 секунд, то сессия будет прибита (для пацифистов есть вариант CANCEL SQL). Ну и соответственно, через 7200 секунд простоя или через 15, если что-то заблокирует, он так же выбивается.
Определяем привязку пользователей к группам (приоритет выбора):
Код:
dbms_resource_manager.set_consumer_group_mapping_pri(
explicit IN NUMBER,
oracle_user IN NUMBER,
service_name IN NUMBER,
client_os_user IN NUMBER,
client_program IN NUMBER,
client_machine IN NUMBER,
module_name IN NUMBER,
module_name_action IN NUMBER,
service_module IN NUMBER,
service_module_action IN NUMBER);
Я выбрал, чтобы сначала работали правила привязки к машинам (поскольку любители экспериментов у меня сидят за одними и теми же), затем к имени модуля (чтобы выделить почтовик), ну и далее, в соответствии с описанным выше.
Код:
BEGIN
dbms_resource_manager.clear_pending_area();
dbms_resource_manager.create_pending_area();
dbms_resource_manager.set_consumer_group_mapping_pri(10,3,4,5,6,1,2,7,8,9);
dbms_resource_manager.submit_pending_area();
END;
/
Посмотреть приоритет можно запросом:
Код:
select * FROM dba_rsrc_mapping_priority;
Маленький финт ушами. Все пользователи супермага автоматом идут в LOW_GROUP, но с одной машины, где работает сервер супермага и считается товародвижение - в SYS_GROUP
Код:
BEGIN
dbms_resource_manager.clear_pending_area();
dbms_resource_manager.create_pending_area();
dbms_resource_manager.set_initial_consumer_group(user=> 'SUPERMAG', consumer_group=>'LOW_GROUP');
dbms_resource_manager.submit_pending_area();
END;
/
Код:
BEGIN
dbms_resource_manager.clear_pending_area();
dbms_resource_manager.create_pending_area();
DBMS_RESOURCE_MANAGER.SET_CONSUMER_GROUP_MAPPING(DBMS_RESOURCE_MANAGER.CLIENT_MACHINE, 'WORKGROUP\EX','SYS_GROUP');
dbms_resource_manager.submit_pending_area();
END;
/
На всякий случай приведу список возможных привязок
Цитата: * EXPLICIT – switch groups via command to switch either code or Resource Plan
* SERVICE_MODULE_ACTION – switch groups depending on service name used to connect, module and action of the code that is being executed. The programmers must embed these names within the code.
* SERVICE_MODULE – switch groups depending on service name used to connect and program module
* MODULE_NAME_ACTION – switch groups depending on program module and action being executed
* MODULE_NAME – switch groups depending on program module
o For all module or action methods, programmers must embed calls to DBMS_APPLICATION_INFO
* SERVICE_NAME – switch groups depending on service name used to connect
* ORACLE_USER – activate group at login depending on Oracle User ID
* CLIENT_PROGRAM – switch groups depending on user process used to connect
* CLIENT_OS_USER – switch groups depending on OS username
* CLIENT_MACHINE – switch groups depending on name of client machine
Можно изначально определить пользователя в одну из групп:
Код:
BEGIN
dbms_resource_manager.clear_pending_area();
dbms_resource_manager.create_pending_area();
dbms_resource_manager.set_initial_consumer_group(user=> 'MARKET', consumer_group=>'LOW_GROUP');
dbms_resource_manager.submit_pending_area();
END;
/
В итоге можно посмотреть, кто в какой группе работает:
Код:
select distinct username,machine,resource_consumer_group from v$session;