<< 返回文章列表

Oracle 20c 新特性:表达式参数值 Expressions Parameter Values

2020年4月24日
盖国强
155

墨天轮原文链接:https://www.modb.pro/db/24416#comment


在 Oracle 20c 中,可以指定一个表达式作为初始化参数的值。

  1. 初始化参数的最佳值可能取决于环境特性,如系统配置、运行时的决定以及其他参数的值。

  2. 在以前的版本中,您在设置初始化参数时需要指定一个绝对值,这意味着维持其最佳值需要手动监督和调整。

  3. 从Oracle数据库20c开始,您可以指定一个表达式作为某些初始化参数的值,这使得数据库能够根据环境变化自动调整参数值。这在 Oracle Autonomous 数据库环境中特别有用。

  4. 在 Oracle Real Application Cluster (Oracle RAC) 环境中,为参数值指定表达式也很有用。

  5. 您可以在所有 Oracle RAC 实例中为参数值指定相同的表达式,但该表达式将在每个实例的基础上利用当前实例的环境特征进行评估。这允许数据库对每个 Oracle RAC 实例的参数值进行微调。

可以只为初始化参数类型为 integer 或 big integer 的参数指定表达式。


11.jpg


如下是一个测试范例:

SQL> show parameter aq

NAME				     TYPE	 VALUE
------------------------------------ ----------- ------------------------------
aq_tm_processes 		     integer	 1
SQL> ALTER SYSTEM SET AQ_TM_PROCESSES = 'MIN(40, PROCESSES * .1)';

System altered.

SQL> show parameter aq

NAME				     TYPE	 VALUE
------------------------------------ ----------- ------------------------------
aq_tm_processes 		     integer	 30
SQL> show parameter spfile

NAME				     TYPE	 VALUE
------------------------------------ ----------- ------------------------------
spfile				     string	 /scratch/app/user/dbs/spfileenmotech.ora

检查一下参数文件中的记录信息:

[oracle@enmotech dbs]$ strings spfileenmotech.ora |grep aq
*.aq_tm_processes=MIN(40, PROCESSES * .1)

按照文档描述,针对CPU数量,可以通过 CPU_COUNT 参数进行动态参数值设置。
例如:

CPU_COUNT = $SYSTEM_CPU/5

我们测试一下这个设置,注意当未设置 SYSTEM_CPU 环境变量时,系统提示 LRM-00119 错误,意思是无法活动系统参数。

SQL> alter system set cpu_count = '$SYSTEM_CPU *2';
alter system set cpu_count = '$SYSTEM_CPU *2'
*
ERROR at line 1:
ORA-13398: invalid expression parameter: $SYSTEM_CPU *2
LRM-00119: unable to obtain a valid value for '${SYSTEM_CPU}'

接下来设置 OS 环境变量参数:

[oracle@enmotech ~]$ export SYSTEM_CPU=10
[oracle@enmotech ~]$ echo $SYSTEM_CPU
10
[oracle@enmotech ~]$ sqlplus / as sysdba

SQL*Plus: Release 20.0.0.0.0 - Production on Tue Apr 21 05:10:04 2020
Version 20.2.0.0.0

Copyright (c) 1982, 2020, Oracle.  All rights reserved.

Connected to:
Oracle Database 20c Enterprise Edition Release 20.0.0.0.0 - Production
Version 20.2.0.0.0

SQL> alter system set cpu_count = '$SYSTEM_CPU *2';
alter system set cpu_count = '$SYSTEM_CPU *2'
*
ERROR at line 1:
ORA-02097: parameter cannot be modified because specified value is invalid
ORA-02097: parameter cannot be modified because specified value is invalid

SQL>

注意,此时提示是参数值 INVALID ,无效,检查告警日志文件,其中提示设置的 CPU 数量和操作系统获取值不同:

2020-04-21T05:10:11.221117+00:00
ORA-2097: CPU_COUNT cannot be set to 20 because it exceeds 1, the number of CPUs reported by the OS

设置参数文件,重启数据库检查变化,可以发现 cpu_count 设置未生效,这意味着 os 的真实值影响优先级更高:

SQL> alter system set cpu_count = '$SYSTEM_CPU *2' scope=spfile;

System altered.

SQL> startup force;
ORACLE instance started.

Total System Global Area  788529032 bytes
Fixed Size		    9572232 bytes
Variable Size		  662700032 bytes
Database Buffers	  113246208 bytes
Redo Buffers		    3010560 bytes
Database mounted.
Database opened.
SQL> show parameter cpu 

NAME				     TYPE	 VALUE
------------------------------------ ----------- ------------------------------
cpu_count			     integer	 1
cpu_min_count			     string	 1
parallel_threads_per_cpu	     integer	 1
resource_manager_cpu_allocation      integer	 1

但是可以看到参数设置已经生效(注意,设置参数后,需要在环境变量中添加变量,否则启动时将无法识别 SYSTEM_CPU 而出错):

[oracle@enmotech trace]$ cd /scratch/app/user/dbs/
[oracle@enmotech dbs]$ strings spfileenmotech.ora |grep cpu_count
*.cpu_count=(${SYSTEM_CPU} * 2)

可以看到参数文件中,记录了表达式,这使得数据库的设置更加灵活,智能。

参考:Parameter Files