
我来为你详细解释 Oracle 19C 数据库中的 V$SYSTEM_PARAMETER2 动态性能视图。这个视图对于精确查看和管理系统级初始化参数非常有用,特别是那些包含多个值的参数。
📊 1. 视图概述与核心作用
V$SYSTEM_PARAMETER2 视图用于显示当前数据库实例级别生效的初始化参数信息。它与 V$SYSTEM_PARAMETER 的关键区别在于:对于包含多个值的参数(如 control_files),V$SYSTEM_PARAMETER2 会将每个值拆分为单独的行显示,而不是像 V$SYSTEM_PARAMETER 那样将所有值合并为一个用逗号分隔的字符串。这种呈现方式使得获取和管理多值参数变得更加清晰和方便。
其主要作用包括:
- 清晰查看多值参数:避免逗号分隔带来的混淆,直接查看参数的每个独立值。
- 系统参数管理:提供系统级别参数的详细信息,包括是否可修改、当前值、默认值等属性。
- 继承参考:新会话(Session)会从该视图显示的实例级参数值继承其初始参数值。
🏗️ 2. 底层原理与数据流转
V$SYSTEM_PARAMETER2 视图的数据来源于 Oracle 实例的内存结构,其底层架构和数据处理流程如下图所示:
关键点解析:
- 数据来源与基表:
V$SYSTEM_PARAMETER2的数据来源于 SGA 中的内部内存结构,其底层基表主要是X$KSPPI(存储参数信息)和X$KSPPCV2(存储参数的当前值,特别是多值参数)。这些X$表是 Oracle 内部使用的虚拟内存表,其结构对用户不透明,通常不建议直接查询。 - 多值参数处理:
X$KSPPCV2基表的设计专门用于处理多值参数,每个值及其位置(ORDINAL)都会被单独记录,这是V$SYSTEM_PARAMETER2能够将多值参数分行显示的根本原因。 - 数据持久化:对参数的修改(如使用
ALTER SYSTEM SET ... SCOPE=SPFILE)会持久化到服务器参数文件(SPFILE),确保实例重启后修改依然有效。V$SYSTEM_PARAMETER2主要反映当前内存中的参数值。
📋 3. 字段详解
V$SYSTEM_PARAMETER2 包含的字段及其含义、数据类型如下表所示:
| 字段名称 (Field Name) | 数据类型 | 描述 |
|---|---|---|
| NUM | NUMBER | 参数的内部编号。 |
| NAME | VARCHAR2(80) | 参数的名称(例如 control_files, db_domain)。 |
| TYPE | NUMBER | 参数的数据类型: 1: Boolean 2: String 3: Integer 4: Parameter file 5: Reserved 6: Big integer |
| VALUE | VARCHAR2(4000) | 参数的当前值。对于多值参数,此字段仅包含单个值。 |
| DISPLAY_VALUE | VARCHAR2(4000) | 格式化后的参数显示值,更易读。 |
| ISDEFAULT | VARCHAR2(9) | 指示当前值是否为默认值(TRUE / FALSE)。 |
| ISSES_MODIFIABLE | VARCHAR2(5) | 指示参数是否可在会话级别修改(ALTER SESSION)。 TRUE: 可以修改 FALSE: 不可修改 |
| ISSYS_MODIFIABLE | VARCHAR2(9) | 指示参数是否可在系统级别修改(ALTER SYSTEM),以及修改何时生效: IMMEDIATE: 立即生效 DEFERRED: 延迟生效(仅对新会话有效) FALSE: 不可动态修改,需重启实例 |
| ISINSTANCE_MODIFIABLE | VARCHAR2(5) | 在RAC环境中,指示参数是否可在不同实例间设置不同值(TRUE / FALSE)。 |
| ISMODIFIED | VARCHAR2(10) | 指示参数自实例启动后是否已被修改: MODIFIED: 被 ALTER SESSION 修改 SYSTEM_MOD: 被 ALTER SYSTEM 修改 FALSE: 未修改 |
| ISADJUSTED | VARCHAR2(5) | 指示参数值是否已被Oracle自动调整(TRUE / FALSE)。 |
| ISDEPRECATED | VARCHAR2(5) | 指示该参数是否已被Oracle弃用(TRUE / FALSE)。弃用的参数应避免使用。 |
| DESCRIPTION | VARCHAR2(255) | 参数的简要描述文本。 |
| UPDATE_COMMENT | VARCHAR2(255) | 参数最近一次修改的注释。 |
| ORDINAL | NUMBER | 多值参数中每个值的序号位置。这是区分 V$SYSTEM_PARAMETER 的关键字段,对于单值参数,此值通常为1。 |
| CON_ID | NUMBER | 容器ID。在多租户环境(CDB)中,标识该参数属于哪个容器(PDB)。值为 0 表示属于 CDB$ROOT(根容器)。 |
关键字段解读:
ORDINAL:这是V$SYSTEM_PARAMETER2与V$SYSTEM_PARAMETER最直接的区别。它明确指示了多值参数中每个值的顺序,例如控制文件列表中的第一个、第二个文件。ISSYS_MODIFIABLE:这是动态性能调优的关键字段。它告诉你一个参数能否在线修改以及修改的生效范围。ISDEFAULT和ISMODIFIED:用于参数审计。可以快速识别出哪些参数脱离了默认设置,以及是否在实例运行后被修改过。VALUE:注意这里存储的是单个值。对于多值参数,需要结合NAME和ORDINAL字段来理解完整的参数设置。
🔗 4. 相关视图
| 视图名称 | 描述 |
|---|---|
V$SYSTEM_PARAMETER | 显示系统级参数信息,但多值参数会以逗号分隔的字符串形式显示在单行中。 |
V$PARAMETER | 显示当前会话的参数值。新会话从系统参数继承初始值,但可用 ALTER SESSION 修改。 |
V$PARAMETER2 | 类似于 V$PARAMETER,但将会话级别的多值参数分多行显示。 |
V$SPPARAMETER | 显示服务器参数文件(SPFILE) 中存储的参数值。如果未使用 SPFILE,则 ISSPECIFIED 列为 FALSE。 |
⚙️ 5. 主要使用场景
- 精确管理多值参数:当需要精确查看、添加或删除像
control_files、diagnostic_dest这类多值参数中的某一个特定值时,V$SYSTEM_PARAMETER2的分行显示比逗号分隔的字符串更方便、更不易出错。 - 系统参数审计与诊断:检查当前系统参数的设置,确认哪些参数已被修改(
ISMODIFIED)、哪些参数非默认值(ISDEFAULT),以及参数是否已被弃用(ISDEPRECATED),这对于数据库健康检查和合规性审计非常有用。 - 性能调优准备:在动态修改系统参数(
ALTER SYSTEM)前,先通过该视图确认参数的修改属性(ISSYS_MODIFIABLE),判断是立即生效、延迟生效还是需要重启生效。 - 生成参数报告:在生成数据库配置报告时,使用此视图可以确保多值参数以清晰、可读的格式呈现。
📊 6. 常用SQL查询示例
查询 1:查看特定的多值参数(如控制文件)
SELECT name, value, ordinal
FROM v$system_parameter2
WHERE name = 'control_files'
ORDER BY ordinal;
结果示例:
| NAME | VALUE | ORDINAL |
|---|---|---|
| control_files | /u01/app/oracle/oradata/ORCL/control01.ctl | 1 |
| control_files | /u01/app/oracle/fast_recovery_area/ORCL/control02.ctl | 2 |
查询 2:检查所有已被修改的非默认参数
SELECT name, value, isdefault, ismodified, description
FROM v$system_parameter2
WHERE isdefault = 'FALSE' OR ismodified != 'FALSE'
ORDER BY name;
查询 3:查找所有可在系统级别立即修改的参数
SELECT name, value, description
FROM v$system_parameter2
WHERE issys_modifiable = 'IMMEDIATE'
ORDER BY name;
查询 4:查询某一类参数(如所有与内存相关的参数)
SELECT name, value, ordinal, description
FROM v$system_parameter2
WHERE name LIKE '%sga%'
OR name LIKE '%pga%'
OR name LIKE '%memory%'
ORDER BY name, ordinal;
查询 5:比较系统级别和会话级别的参数值
-- 例如,检查当前会话是否修改了某些参数
SELECT sys.name,
sys.value AS system_value,
ses.value AS session_value,
sys.isses_modifiable
FROM v$system_parameter2 sys
JOIN v$parameter2 ses ON sys.name = ses.name AND sys.ordinal = ses.ordinal
WHERE sys.value != ses.value;
💎 7. 重要知识点总结
- 与
V$SYSTEM_PARAMETER的区别:核心区别在于多值参数的显示方式。V$SYSTEM_PARAMETER2为多值参数的每个值提供单独的行,并包含ORDINAL字段指示顺序,而V$SYSTEM_PARAMETER将所有值合并为一个逗号分隔的字符串。 - 数据时效性:
V$SYSTEM_PARAMETER2显示的是当前实例内存中的系统参数值。要查看参数文件中设置的值,应查询V$SPPARAMETER。 - 修改参数:修改系统参数应使用
ALTER SYSTEM命令,并注意SCOPE子句的选择:SCOPE=MEMORY:仅内存生效,重启后失效。SCOPE=SPFILE:仅修改参数文件,重启实例后生效。SCOPE=BOTH:内存和参数文件同时修改,立即且持久化。
是否支持动态修改取决于ISSYS_MODIFIABLE的值。
- 多租户环境:在 CDB 中,
V$SYSTEM_PARAMETER2默认显示根容器(CDB$ROOT)的参数。要查询特定 PDB 的参数,需要切换到该 PDB 中再查询,或使用CON_ID字段进行过滤。
V$SYSTEM_PARAMETER2 视图是管理和诊断 Oracle 数据库系统参数的重要工具,特别在处理多值参数时,提供了比 V$SYSTEM_PARAMETER 更清晰、更精确的视角。
欢迎关注我的公众号《IT小Chen》
745

被折叠的 条评论
为什么被折叠?



