Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Resource manager ограничение параллельных серверов / 3 сообщений из 3, страница 1 из 1
22.08.2016, 08:20:28
    #39295273
led_yurik
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Resource manager ограничение параллельных серверов
Задача.
БД 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
22.08.2016, 12:47:03
    #39295446
SeaGate
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Resource manager ограничение параллельных серверов
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
22.08.2016, 14:00:16
    #39295539
led_yurik
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Resource manager ограничение параллельных серверов
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
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Resource manager ограничение параллельных серверов / 3 сообщений из 3, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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