Example database resource manager setup

De wiki.nexiat.fr
Aller à la navigation Aller à la recherche
Fiche express
Type Exemple DDL Oracle
Contexte Database Resource Manager — plan simple + bascule jour/nuit
Voir aussi Example create resource plan multi resource plan 9i · Example create profile resource parameters

Configuration complète du Database Resource Manager (DRM) à un seul niveau : deux plans (journée / nuit-weekend) répartissant le CPU entre un groupe transactionnel (« oltp ») et un groupe de traitements par lots (« batch »), plus le rattachement d'un utilisateur à un groupe et le mécanisme permettant à cet utilisateur de basculer lui-même entre ses groupes autorisés. Complémentaire de Example create resource plan multi resource plan 9i, qui présente un plan à plusieurs niveaux (racine + sous-plans).

Principe des deux plans

Plan oltp_group batch_group Usage
daytime_plan 90 % (niveau 1) 10 % (niveau 1) Heures ouvrées : priorité au transactionnel
night_weekend_plan 10 % (niveau 1) 90 % (niveau 1) Nuits/weekends : priorité aux traitements batch

Le paramètre parallel_degree_limit_p1 => 0 désactive l'exécution parallèle pour les sessions du groupe à ce niveau de directive.

Attribution des utilisateurs aux groupes

Un utilisateur ne peut basculer lui-même entre groupes de consommateurs que s'il en a reçu le droit explicite (GRANT_SWITCH_CONSUMER_GROUP). Le troisième paramètre (FALSE) indique que ce droit n'est pas accordé avec possibilité de le retransmettre (GRANT OPTION). SET_INITIAL_CONSUMER_GROUP définit le groupe attribué à la connexion ; SWITCH_CONSUMER_GROUP_FOR_USER bascule immédiatement une session déjà connectée.

Script

CONNECT / AS SYSDBA

SET SERVEROUTPUT ON

/* --------------------------------------------------------
 * Nettoyage préalable (idempotence du script) : retire les
 * directives, plans et groupes s'ils existent déjà d'une
 * exécution précédente.
 * -------------------------------------------------------- */

ALTER SYSTEM SET resource_manager_plan = '';

EXEC DBMS_RESOURCE_MANAGER.CREATE_PENDING_AREA;
EXEC DBMS_RESOURCE_MANAGER.DELETE_PLAN_DIRECTIVE('daytime_plan', 'oltp_group');
EXEC DBMS_RESOURCE_MANAGER.DELETE_PLAN_DIRECTIVE('daytime_plan', 'batch_group');
EXEC DBMS_RESOURCE_MANAGER.DELETE_PLAN_DIRECTIVE('daytime_plan', 'other_groups');
EXEC DBMS_RESOURCE_MANAGER.DELETE_PLAN_DIRECTIVE('night_weekend_plan', 'oltp_group');
EXEC DBMS_RESOURCE_MANAGER.DELETE_PLAN_DIRECTIVE('night_weekend_plan', 'batch_group');
EXEC DBMS_RESOURCE_MANAGER.DELETE_PLAN_DIRECTIVE('night_weekend_plan', 'other_groups');
EXEC DBMS_RESOURCE_MANAGER.DELETE_PLAN('daytime_plan');
EXEC DBMS_RESOURCE_MANAGER.DELETE_PLAN('night_weekend_plan');
EXEC DBMS_RESOURCE_MANAGER.DELETE_CONSUMER_GROUP('oltp_group');
EXEC DBMS_RESOURCE_MANAGER.DELETE_CONSUMER_GROUP('batch_group');
EXEC DBMS_RESOURCE_MANAGER.VALIDATE_PENDING_AREA;
EXEC DBMS_RESOURCE_MANAGER.SUBMIT_PENDING_AREA;

/* --------------------------------------------------------
 * Création des plans et groupes
 * -------------------------------------------------------- */

EXEC DBMS_RESOURCE_MANAGER.CREATE_PENDING_AREA;

EXEC DBMS_RESOURCE_MANAGER.CREATE_PLAN('daytime_plan', 'Plan for daytime processing');
EXEC DBMS_RESOURCE_MANAGER.CREATE_PLAN('night_weekend_plan', 'Plan for nights and weekends');

EXEC DBMS_RESOURCE_MANAGER.CREATE_CONSUMER_GROUP('oltp_group', 'data entry specialist');
EXEC DBMS_RESOURCE_MANAGER.CREATE_CONSUMER_GROUP('batch_group', 'nightly batch jobs');

-- Journée : priorité au groupe oltp (90 %)
EXEC DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE('daytime_plan', 'oltp_group', 'Daytime rule for oltp_group users', cpu_p1 => 90, parallel_degree_limit_p1 => 0);
EXEC DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE('daytime_plan', 'batch_group', 'Daytime rule for batch_group users', cpu_p1 => 10, parallel_degree_limit_p1 => 0);
EXEC DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE('daytime_plan', 'other_groups', 'Daytime rules for all other users/groups', cpu_p2 => 100, parallel_degree_limit_p1 => 0);

-- Nuit/weekend : priorité au groupe batch (90 %)
EXEC DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE('night_weekend_plan', 'oltp_group', 'Night/Weekend rule for oltp_group users', cpu_p1 => 10, parallel_degree_limit_p1 => 0);
EXEC DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE('night_weekend_plan', 'batch_group', 'Night/Weekend rule for batch_group users', cpu_p1 => 90, parallel_degree_limit_p1 => 0);
EXEC DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE('night_weekend_plan', 'other_groups', 'Night/Weekend rules for all other users/groups', cpu_p2 => 100, parallel_degree_limit_p1 => 0);

EXEC DBMS_RESOURCE_MANAGER.VALIDATE_PENDING_AREA;
EXEC DBMS_RESOURCE_MANAGER.SUBMIT_PENDING_AREA;

/* --------------------------------------------------------
 * Autoriser un utilisateur applicatif à basculer entre les
 * deux groupes, puis l'y rattacher
 * -------------------------------------------------------- */

EXEC DBMS_RESOURCE_MANAGER_PRIVS.GRANT_SWITCH_CONSUMER_GROUP('app_user', 'oltp_group', FALSE);
EXEC DBMS_RESOURCE_MANAGER_PRIVS.GRANT_SWITCH_CONSUMER_GROUP('app_user', 'batch_group', FALSE);

-- Groupe attribué par défaut à la connexion
EXEC DBMS_RESOURCE_MANAGER.SET_INITIAL_CONSUMER_GROUP('app_user', 'oltp_group');

-- Bascule immédiate d'une session déjà connectée
EXEC DBMS_RESOURCE_MANAGER.SWITCH_CONSUMER_GROUP_FOR_USER('app_user', 'oltp_group');

/* --------------------------------------------------------
 * Activation du plan journée
 * -------------------------------------------------------- */

ALTER SYSTEM SET resource_manager_plan = daytime_plan;

Le script d'origine se connectait avec le compte system et son mot de passe par défaut historique (manager) — un identifiant/mot de passe par défaut bien connu et à changer systématiquement en production ; remplacé ici par une connexion générique SYSDBA. Le compte applicatif d'exemple (scott dans le script d'origine) a été renommé en app_user pour éviter de laisser croire que le compte de démonstration Oracle doit être utilisé en production. La bascule automatique jour/nuit (via DBMS_SCHEDULER ou un job externe qui change le plan actif à heure fixe) n'est pas couverte par ce script — seule l'activation manuelle du plan journée l'est.

Voir aussi