Oracle 20c 新特性:表达式参数值 Expressions Parameter Values
墨天轮原文链接:https://www.modb.pro/db/24416#comment
在 Oracle 20c 中,可以指定一个表达式作为初始化参数的值。
初始化参数的最佳值可能取决于环境特性,如系统配置、运行时的决定以及其他参数的值。
在以前的版本中,您在设置初始化参数时需要指定一个绝对值,这意味着维持其最佳值需要手动监督和调整。
从Oracle数据库20c开始,您可以指定一个表达式作为某些初始化参数的值,这使得数据库能够根据环境变化自动调整参数值。这在 Oracle Autonomous 数据库环境中特别有用。
在 Oracle Real Application Cluster (Oracle RAC) 环境中,为参数值指定表达式也很有用。
您可以在所有 Oracle RAC 实例中为参数值指定相同的表达式,但该表达式将在每个实例的基础上利用当前实例的环境特征进行评估。这允许数据库对每个 Oracle RAC 实例的参数值进行微调。
可以只为初始化参数类型为 integer 或 big integer 的参数指定表达式。
如下是一个测试范例:
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)
可以看到参数文件中,记录了表达式,这使得数据库的设置更加灵活,智能。