powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Resource manager ограничение параллельных серверов
3 сообщений из 3, страница 1 из 1
Resource manager ограничение параллельных серверов
    #39295273
led_yurik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Задача.
БД Oracle 11.2.0.4 EE
Необходимо запретить определенным учетным записям запускать больше 20 параллельных серверов на всех.
Как я понимаю, Oracle Resource Manager с этим должен справиться.
Для этих целей должна подойти директива - PARALLEL_TARGET_PERCENTAGE.
Эта директива выставляет лимит в процентах от параметра PARALLEL_SERVERS_TARGET.

Тестовая среда:
На сервере parallel_servers_target=120
Чтобы получить нужный лимит, выставляю значение директивы PARALLEL_TARGET_PERCENTAGE=16

Создаю две учетные записи.
usert1 - владелец объектов (таблицы)
usert2 - учетка которую нужно ограничить в ресурсах
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
SQL> show parameter PARALLEL_SERVERS_TARGET

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
parallel_servers_target              integer     120
SQL> show parameter PARALLEL_DEGREE_POLICY

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
parallel_degree_policy               string      AUTO
SQL>

SQL> CREATE USER USERT1 IDENTIFIED BY usert1;

User created.

SQL> GRANT CREATE SESSION TO USERT1;

Grant succeeded.

SQL>
SQL> CREATE USER USERT2 IDENTIFIED BY usert2;

User created.

SQL> ALTER USER USERT2 QUOTA UNLIMITED ON USERS;

User altered.

SQL> GRANT CREATE SESSION TO USERT2;

Grant succeeded.

SQL>



Создаю тестовую таблицу в схеме usert1, наполняю данными и даю грант пользователю usert2.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
SQL> CREATE TABLE USERT1.T1 AS SELECT * FROM DBA_OBJECTS;

Table created.

SQL>
SQL> begin
  2      For IDS in 1..10
  3      loop
  4          insert into USERT1.T1
  5          select *
  6            from USERT1.T1;
  7      end loop;
  8      commit;
  9  end;
 10  /

PL/SQL procedure successfully completed.

SQL>
SQL> grant select on USERT1.T1 to USERT2;

Grant succeeded.

SQL>


А теперь создаю ресурсный план, группу, директивы.
Активирую ресурсный план.
Добавляю пользователя USERT2 в нужную ресурсную группу.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
SQL> begin
  2    DBMS_RESOURCE_MANAGER.CLEAR_PENDING_AREA();
  3    DBMS_RESOURCE_MANAGER.CREATE_PENDING_AREA();
  4    DBMS_RESOURCE_MANAGER.CREATE_PLAN (
  5        plan                         => 'TEST_LIMIT_PLAN'
  6       ,comment                      => '');
  7    DBMS_RESOURCE_MANAGER.CREATE_CONSUMER_GROUP (
  8        consumer_group               => 'TEST_LIMIT_GROUP'
  9       ,comment                      => '');
 10    DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE (
 11        plan                         => 'TEST_LIMIT_PLAN'
 12       ,group_or_subplan             => 'OTHER_GROUPS'
 13       ,comment                      => ''  );
 14    DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE (
 15        plan                         => 'TEST_LIMIT_PLAN'
 16       ,group_or_subplan             => 'TEST_LIMIT_GROUP'
 17       ,parallel_target_percentage   => 16
 18       ,comment                      => ''  );
 19    DBMS_RESOURCE_MANAGER.VALIDATE_PENDING_AREA();
 20    DBMS_RESOURCE_MANAGER.SUBMIT_PENDING_AREA();
 21  end;
 22  /

PL/SQL procedure successfully completed.

SQL>
SQL> ALTER SYSTEM SET RESOURCE_MANAGER_PLAN = TEST_LIMIT_PLAN;

System altered.

SQL>
SQL> BEGIN
  2    DBMS_RESOURCE_MANAGER.create_pending_area();
  3    DBMS_RESOURCE_MANAGER_PRIVS.GRANT_SWITCH_CONSUMER_GROUP('USERT2','TEST_LIMIT_GROUP',FALSE);
  4    DBMS_RESOURCE_MANAGER.SET_INITIAL_CONSUMER_GROUP('USERT2','TEST_LIMIT_GROUP');
  5    DBMS_RESOURCE_MANAGER.submit_pending_area();
  6  END;
  7  /

PL/SQL procedure successfully completed.

SQL>


Если я все правильно понимаю, этого должно быть достаточно, чтобы ресурсный менеджер работал.
Параллельно я подключаюсь под учеткой usert2 и запускаю запрос с количеством параллельных серверов превышающего выставленный лимит:
Код: plsql
1.
SQL> select /*+ PARALLEL(25) */ owner, object_name, count(*) from USERT1.T1 group by owner, object_name;


И пока этот запрос работает в первой сессии смотрю количество параллельных серверов от этой учетки
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SQL> select s.username, s.module, count(*)
  2    from v$session s, v$px_session p
  3  where s.sid = p.sid and username = 'USERT2'
  4  group by  s.username, s.module;

USERNAME                       MODULE                                                             COUNT(*)
------------------------------ ---------------------------------------------------------------- ----------
USERT2                         SQL*Plus                                                              51

SQL>


Ограничение ресурсного менеджера не сработало.
Можете подсказать, что я неправильно делаю?
...
Рейтинг: 0 / 0
Resource manager ограничение параллельных серверов
    #39295446
Фотография SeaGate
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
led_yurik,

http://docs.oracle.com/cd/E11882_01/server.112/e25494/dbrm.htm#ADMIN13466
Managing Resources with Oracle Database Resource Manager Parallel Target PercentageIf a consumer group does not have any parallel statements running within an Oracle RAC database, then the first parallel statement is allowed to exceed the limit specified by PARALLEL_TARGET_PERCENTAGE.
Хоть речь тут про RAC, это применимо и к не-RAC. Как обычно, сделали через известное место и прикрылись документацией.
Соответственно, одной сессии мало. Ограничение начнет работать со второй сессии.
Чтобы ограничить сверху в таком сценарии, с учетом замечания из документации о превышении порога для первого statement, нужно еще parallel_degree_limit_p1 задать.
...
Рейтинг: 0 / 0
Resource manager ограничение параллельных серверов
    #39295539
led_yurik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SeaGateled_yurik,

http://docs.oracle.com/cd/E11882_01/server.112/e25494/dbrm.htm#ADMIN13466
Managing Resources with Oracle Database Resource Manager Parallel Target PercentageIf a consumer group does not have any parallel statements running within an Oracle RAC database, then the first parallel statement is allowed to exceed the limit specified by PARALLEL_TARGET_PERCENTAGE.
Хоть речь тут про RAC, это применимо и к не-RAC. Как обычно, сделали через известное место и прикрылись документацией.
Соответственно, одной сессии мало. Ограничение начнет работать со второй сессии.
Чтобы ограничить сверху в таком сценарии, с учетом замечания из документации о превышении порога для первого statement, нужно еще parallel_degree_limit_p1 задать.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SQL> begin
  2    DBMS_RESOURCE_MANAGER.CREATE_PENDING_AREA();
  3    DBMS_RESOURCE_MANAGER.UPDATE_PLAN_DIRECTIVE (
  4        plan                         => 'TEST_LIMIT_PLAN'
  5       ,group_or_subplan             => 'TEST_LIMIT_GROUP'
  6       ,new_parallel_degree_limit_p1 => 10);
  7    DBMS_RESOURCE_MANAGER.VALIDATE_PENDING_AREA();
  8    DBMS_RESOURCE_MANAGER.SUBMIT_PENDING_AREA();
  9  end;
 10  /
PL/SQL procedure successfully completed.


После этого запускаю несколько параллельных сессий запрос из под учетки usert2.
И смотрю количество параллельных серверов
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SQL> select s.username, s.module, count(*)
  2    from v$session s, v$px_session p
  3  where s.sid = p.sid and username = 'USERT2'
  4  group by  s.username, s.module;

USERNAME                       MODULE                                                             COUNT(*)
------------------------------ ---------------------------------------------------------------- ----------
USERT2                         SQL*Plus                                                              21

SQL>


Все работает! но похоже на чудо))

Я читал этот кусочек и до этого момента я был уверен , что на тестовой БД с реальными пользователями и реальными данными я несколько раз выставлял различные комбинации директив ресурсного менеджера parallel_degree_limit_p1 и PARALLEL_TARGET_PERCENTAGE, но такого результата я не получал, а вот когда делал тестовое окружение, решил ограничиться только PARALLEL_TARGET_PERCENTAGE...

Буду внимательней проверять на реальных данных!

Спасибо большое, а то я уже начал отчаиваться.
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Resource manager ограничение параллельных серверов
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]