对 Oracle CONTROL_FILES 初始化参数感到困惑

Jus*_*ner 1 oracle

这是Oracle对这个参数的解释。这是说明中的说明。从文档中我们知道这个参数是不可修改的(Modifiable: No)。但实际上我可以修改它:

sys@ORCL>alter system set control_files = '/u01/app/oracle/oradata/orcl/control01.ctl,/u01/app/oracle/flash_recovery_area/orcl/control02.ctl';
alter system set control_files = '/u01/app/oracle/oradata/orcl/control01.ctl,/u01/app/oracle/flash_recovery_area/orcl/control02.ctl'
                 *
ERROR at line 1:
ORA-02095: specified initialization parameter cannot be modified


sys@ORCL>alter system set control_files = '/u01/app/oracle/oradata/orcl/control01.ctl,/u01/app/oracle/flash_recovery_area/orcl/control02.ctl' scope = spfile;

System altered.

sys@ORCL>
Run Code Online (Sandbox Code Playgroud)

那么,文档中的Modifiable: No是什么意思?

顺便说一句,这是我的 Oracle 版本:

sys@ORCL>select * from v$version;

BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
PL/SQL Release 11.2.0.1.0 - Production
CORE    11.2.0.1.0  Production
TNS for Linux: Version 11.2.0.1.0 - Production
NLSRTL Version 11.2.0.1.0 - Production

sys@ORCL>
Run Code Online (Sandbox Code Playgroud)

谢谢,

Lei*_*fel 6

当您看到可修改时,您应该阅读 MEMORY 可修改。对于 ALTER SYSTEM 那么这意味着可以在系统的内存中修改参数。您站点的数据库参考文档包括以下信息的一部分:

Modifiable指定是可以为当前会话(通过 ALTER SESSION 语句)还是为当前实例中的所有会话(通过 ALTER SYSTEM 语句)更改参数:

ALTER SYSTEM 可用于更改任何初始化参数的服务器参数文件 (SPFILE) 中的值。此类更改仅在后续实例中生效。参数说明仅表示当前实例可以修改的参数。

要了解整个过程中会发生什么,您必须了解 SCOPE 参数以及未指定 SCOPE 时会发生什么。从SQL Language Reference我们可以看到 ALTER SYSTEM 语句可以有三个不同的 SCOPE 说明符或根本没有。

SCOPE SCOPE 子句允许您指定更改何时生效。范围取决于您是使用传统的纯文本参数文件 (pfile) 还是服务器参数文件 (spfile) 启动数据库。

MEMORY 表示更改在内存中进行,立即生效,并持续到数据库关闭。如果您使用参数文件 (pfile) 启动数据库,那么这是您可以指定的唯一范围。

SPFILE 表示在服务器参数文件中进行了更改。新设置在数据库下次关闭并再次启动时生效。在更改 Oracle 数据库参考中描述为不可修改的静态参数的值时,您必须指定 SPFILE。

BOTH 表示在内存和服务器参数文件中进行了更改。新设置立即生效,并在数据库关闭并再次启动后仍然存在。

如果使用服务器参数文件来启动数据库,则 BOTH 是默认值。如果使用参数文件来启动数据库,则 MEMORY 是默认值,也是您可以指定的唯一范围。

因此,由于您能够指定 SPFILE 的范围,我们可以推断您正在使用 SPFILE,因此当您未指定范围时,第一个 ALTER SYSTEM 的默认值是 BOTH,这将失败,因为该参数不可修改 MEMORY . 您可以通过重复您的第一个 ALTER SYSTEM 并添加 SCOPE=BOTH 或 SCOPE=MEMORY 来证明这一点,这两者都会失败。