Oracle 23c new features: expressies in de spfile

Oracle 23c new features: expressies in de spfile.
Nu Oracle steeds meer informatie vrijgeeft over de nieuwe 23c release van de database, is het goed eens te kijken wat er op ons afkomt. Oracle heeft documentatie vrijgegeven op docs.oracle.com.   Na de introductie van Oracle 19c als Long term Support Release zijn er twee innovatie release beschikbaar (geweest): 20c en 21c. Sommige van de features daaruit zijn gebackport naar Oracle 19c (zoals de max_idle_blockers_time).  Andere features komen voor de ‘gewone’  Oracle gebruikers pas in 23c beschikbaar.

In de documentatie staat dat in de init.ora of de spfile expressies ook als waarde voor een initialisatie parameter gegeven kunnen worden. We weten al dat een parameter als sessions een afgeleide waarde heeft als default. Het wordt nu ook mogelijk dit voor andere parameters te doen.  Zo is het mogelijk het maximaal aantal job_queue_processes afhankelijk te maken van de capaciteit van de machine en zo  het risico op starvation te reduceren:

Door parameters op basis van een expressie te maken is het mogelijk settings afhankelijk te maken van  van elkaar of de omgeving.  Enkele logische voorbeelden zijn:

alter system set job_queue_processes=’max(processes/20,5)’ scope =spfile;
startup force;
show parameter process
job_queue_processes                  integer     15
processes                            integer     300

of

SQL> show parameter pga
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
pga_aggregate_limit                  big integer 2G
pga_aggregate_target                 big integer 512M

alter system set pga_aggregate_limit='(10*pga_aggregate_target)'  scope=both;

show parameter pga
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
pga_aggregate_limit                  big integer 5G
pga_aggregate_target                 big integer 512M

De vraag die zich nu opwerpt is: hoe dynamisch is dit?  Als we proberen:

show parameter SGA_TARGET

NAME                                 TYPE        VALUE

———————————— ———– ——————————

sga_target                           big integer 1536M

alter system set pga_aggregate_target='(0.25*sga_target)’ scope=both;

Verandert dan de PGA_TARGET_LIMIT mee?

show parameter pga
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
pga_aggregate_limit                  big integer 5G
pga_aggregate_target                 big integer 384M
alter system set pga_aggregate_limit='(10*pga_aggregate_target)'  scope=both;

show parameter pga
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
pga_aggregate_limit                  big integer 3840M
pga_aggregate_target                 big integer 384M
connect testuser2/testuser2@PDB

exec system.do_truncate();
ORA-28194: Can perform read operations only

Nee, dus de expressie zorgt niet voor expliciete herberekening van de waarden als er ergens anders iets verandert.
De vraag is wat er nu waar wordt opgeslagen;  v$parameter, v$parameter2 en v$spparameter geven allemaal alleen de actuele waarden.  Als we de spfile dumpen met

create pfile from spfile;

*.job_queue_processes=MAX((processes / 20) , 5)
*.pga_aggregate_limit=(10*pga_aggregate_target)
*.pga_aggregate_target=(0.25 * sga_target)

zien we de echte parameter expressies staan. Die worden tijdens de startup geëvalueerd.  Daarmee is het mogelijk een veel ‘dynamischer’ manier  te maken om parameters in te stellen.. Dit kan heel nuttig zijn in een virtuele – of cloud omgeving, waarbij resources relatief eenvoudig gewijzigd kunnen worden. Iets wat daarbij handig lijkt is een statement als :

alter system set job_queue_processes='(4*cpu_count)' scope =spfile;

of

 alter system set job_queue_processes='cpu_count' scope=spfile;

helaas geeft de laatste

ORA-02017: integer value required
LRM-00104: 'cpu_count' is not a legal integer for 'job_queue_processes'

En als je de eerste doet wordt als gevolg daarvan de expressie wel verwerkt, maar levert bij een herstart problemen op.  Kennelijk is de parameter cpu_count  toch minder een integer dan de documentatie doet vermoeden.

Toch zijn er nog steeds mogelijkheden de configuratie van de database sterk dynamisch te maken.  Het is namelijk ook mogelijk environment variabelen te gebruiken in je expressie

Dus als in het login script staat:

export CPU_CNT=`getconf _NPROCESSORS_ONLN`

dan kan ik doen:

alter system set job_queue_processes='($CPU_CNT*4)' scope=spfile;
 
show parameter job_q
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
job_queue_processes                  integer     8

Ook is het mogelijk paden afhankelijk te maken van je omgeving:

$ echo $ORACLE_BASE
/opt/oracle
 
SQL> show parameter diag

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
diagnostic_dest                      string      /opt/oracle

SQL> alter system set diagnostic_dest='$ORACLE_BASE'  scope=spfile;

Of dit uit te voeren voor je db_create_file_dest.  En net als met de expressies kan je dat terughalen via je pfile:

*.diagnostic_dest='$ORACLE_BASE'
*.job_queue_processes=(${CPU_CNT} * 4)

Aan het gebruik van environment settings zit wel een risico.  Als ik nu een andere sessie (bijvoorbeeld van een andere gebruiker) gebruik waarbij de environment parameter niet gezet is, kan ik vervelend gedrag krijgen

$ env | grep CPU
- geen return waarde

levert dat bij startup:

ORA-01078: failure in processing system parameters

Dit kan een issue zijn bij startup via systemd. Ook geldt dat de gebruikte environment setting al bekend moet zijn in de omgeving van je sessie waarin je de wijziging doorvoert.

alter system set job_queue_processes='($CPU_NR)*5' scope=spfile;
ORA-12798: Mathematical expression for parameter ($CPU_NR)*5 has an invalid
value.
LRM-00119: unable to obtain a valid value for '${CPU_NR}'

Het zetten van initialisation parameters op basis van expressies en environment variabelen is een zeer krachtige techniek die in gescripte deployments, cloud en virualisatie omgevingen erg veel mogelijk maken.  Er zit echter wel een downside aan. Zeker als het beheer niet sterk gestandardiseerd is kan het ook een bron van verwarring worden.

We hopen dat we je met dit artikel, “Oracle 23c new features: expressies in de spfile”, op weg bent geholpen. Mocht je hulp nodig hebben of je hebt vragen n.a.v. dit artikel, laat het ons dan weten. Wil je een cursus of training volgen over Oracle 23c new features? Laat het ons weten, we helpen je graag.

Scroll to Top