Example database resource manager setup
| 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
- Example create resource plan multi resource plan 9i — plan multi-niveaux (racine + sous-plans), pour une hiérarchie plus fine
- Example create profile resource parameters — limites de ressources au niveau session/utilisateur (profils), mécanisme distinct du DRM