===== Oracle Services in eine Single Instance Datenbank ===== **Min. ab Oracle 8** Wird eine Oracle Datenbank mit der RAC Option oder mit Oracle ASM aufgesetzt, werden die Services im Cluster Stack bzw. ASM Home mit srvctl definiert und laufen dann auch eigenständig im Cluster Stack. ====Wie werden aber Services in einer Single Instance Umgebung definiert?=== In einer Single Instance Umgebung steht das DBMS Package [[https://docs.oracle.com/database/121/ARPLS/d_serv.htm|DBMS_SERVICE]] zur Verfügung um Services anzulegen und zu bearbeiten. Beim Anlegen wird der Service Name in der Datenbank und der Service Name für das SQL*Net Protokoll definiert. Den Service Name für das SQL*Net Protokoll registriert dann die Datenbank in dem Oracle Listener, der mit dem DB Parameter LOCAL_LISTENER hinterlegt ist (oder falls leer am Default, vermutlich localhost:1521). Nach dem Anlegen des Service muss der Service noch gestartet werden, der Service Name wird zwar automatisch in den DB SERVICE_NAME Parameter übernommen aber nur im MEMORY!. Soll beim nächsten Start der DB der Service gleich gestartet werden muss der Service Name auch in den DB Parameter zuvor aufgenommen werden. Beispiel inkl. setzen der Eigenschaften des Services: -- Create the Service EXEC DBMS_SERVICE.CREATE_SERVICE(service_name=> 'PROD_COGNOS', network_name => 'PROD_COGNOS'); DECLARE params dbms_service.svc_parameter_array; BEGIN -- params('FAILOVER_TYPE') :='TRANSACTION'; params('REPLAY_INITIATION_TIMEOUT'):=1800; params('RETENTION_TIMEOUT') :=86400; params('FAILOVER_DELAY') :=10; params('FAILOVER_RETRIES') :=30; DBMS_SERVICE.MODIFY_SERVICE(service_name=> 'PROD_COGNOS', parameter_array => params); END; / -- Service starten EXEC DBMS_SERVICE.START_SERVICE(service_name=> 'PROD_COGNOS') -- um lange Listen von Service anzulegen mit , trennen! alter system set service_names='GPI,GPI2,PROD','PROD_COGNOS' scope=both sid='*'; show parameter service Bzgl der Parameter siehe https://docs.oracle.com/database/121/ARPLS/d_serv.htm#ARPLS68020 Bzgl. TAF siehe auch [[dba:taf_sql_connection|Transparent Application Failover konfigurieren]] Um eine Service wieder zu entfernen: begin DBMS_SERVICE.STOP_SERVICE(service_name=> 'PROD_COGNOS'); DBMS_SERVICE.DELETE_SERVICE(service_name=> 'PROD_COGNOS'); end; / === Mit dem Services arbeiten === Die Service der Oracle Datenbank dienen dazu die angemeldeten User an der Datenbank auch logisch zu unterscheiden. Es können zum Beispiel alle Sessions die über einen benannten Service sich angemeldet haben auf einmal auch wieder abgemeldet werden: Überwachen: -- Welche Services wurden definiert und laufen auch: select s.name,s.network_name , decode((select count(*) from gv$active_services gs where gs.name=s.name),0,'Not Running','Active') as active from dba_services s order by s.name / -- Was ist aktiv: select inst_id,NAME,NETWORK_NAME from gv$active_services; -- Wer ist wo angemeldet: select count (*) , inst_id , service_name , username from gv$session where service_name not like 'SYS%' group by service_name, inst_id, username order by 4 / siehe auch ausführliches Script: https://orapowershell.codeplex.com/SourceControl/latest#sql/tns.sql Alle User von einem dedizierten Service abmelden: -- Wenn die letze Transaction abgeschlossen ist: begin DBMS_SERVICE.DISCONNECT_SESSION( service_name => 'PROD_COGNOS' , disconnect_option => DBMS_SERVICE.POST_TRANSACTION); end; / -- sofort = IMMEDIATE , mit NOREPLAY wird auch application continuity wie TAF abgebrochen und es wiederholt -- sich nicht die letzte Anmeldung begin DBMS_SERVICE.DISCONNECT_SESSION( service_name => 'PROD_COGNOS' , disconnect_option => DBMS_SERVICE.NOREPLAY); end; / Bzgl. TAF siehe auch [[dba:taf_sql_connection|Transparent Application Failover konfigurieren]]