Oracle 数据库的初始化参数通常存储在文本初始化参数文件中。为了更好的可管理性,您可以选择在二进制服务器参数文件中维护初始化参数,该文件在数据库启动和关闭时都是持久的。
什么是服务器参数文件?
服务器参数文件可以看作是在运行 Oracle 数据库服务器的系统上维护的初始化参数的存储库。按照设计,它是一个服务器端初始化参数文件。
存储在服务器参数文件中的初始化参数是持久的,因为在实例运行时对参数所做的任何更改都可以在实例关闭和启动期间持久存在。这种安排消除了手动更新初始化参数以使 ALTER SYSTEM
语句影响的任何更改保持不变的需要。它还为 Oracle 数据库服务器的自调优提供了基础。
服务器参数文件最初是使用 CREATE SPFILE
语句从文本初始化参数文件构建的(它也可以直接由数据库配置助手创建)。服务器参数文件是一个二进制文件,不能使用文本编辑器编辑。Oracle 数据库提供了查看和修改服务器参数文件中的参数设置的其他接口。
当你发出不带 PFILE
子句的 STARTUP
命令时,Oracle 实例会在操作系统特定的默认位置搜索服务器参数文件,从中读取初始化参数设置。如果没有找到服务器参数文件,则实例搜索文本初始化参数文件。如果服务器参数文件存在,但您想用文本初始化参数文件中的设置覆盖它,则必须在发出 STARTUP
命令时指定 PFILE
子句。
迁移到服务器参数文件
如果您目前正在使用文本初始化参数文件,那么您可以迁移到服务器参数文件。
迁移到服务器参数文件:
-
如果初始化参数文件位于客户端系统上,则将文件(例如FTP)从客户端系统传输到服务器系统。
-
使用
CREATE SPFILE FROM PFILE
语句在默认位置创建服务器参数文件。该语句读取文本初始化参数文件以创建服务器参数文件。不需要启动数据库就可以发出
CREATE SPFILE
语句。 -
启动或重新启动实例。
实例在默认位置找到新的 SPFILE 并使用它启动。
服务器参数文件默认名称和位置
Oracle 建议您允许数据库为 SPFILE 提供默认名称,并将其存储在默认位置。这简化了数据库的管理。例如,STARTUP
命令假定这个默认位置来读取 SPFILE。
下表显示了在 UNIX、Linux 和 Windows 平台上,无论是否存在 Oracle Automatic Storage Management (Oracle ASM),文本初始化参数文件(PFILE)和服务器参数文件(SPFILE)的默认名称和位置。该表假设 SPFILE 是一个文件。
平台 | PFILE 默认名字 | SPFILE 默认名字 | PFILE 默认路径 | SPFILE 默认路径 |
---|---|---|---|---|
UNIX 和 Linux | init |
spfile |
Oracle_Home/dbs 或与数据文件相同的位置 |
没有 Oracle ASM 时: Oracle_Home/dbs 或与数据文件相同的位置 Oracle ASM 存在时: 在与数据文件相同的磁盘组中(假设数据库是用 DBCA 创建的) |
Windows | init |
spfile |
Oracle_Home\database |
没有 Oracle ASM 时: OH\database Oracle ASM 存在时: 在与数据文件相同的磁盘组中(假设数据库是用 DBCA 创建的) |
如果两个 SPFILE 都没有找到,实例搜索文本初始化参数文件 init<ORACLE_SID>.ora
。
如果在默认位置以外的位置创建 SPFILE,则必须在默认 PFILE 位置创建指向服务器参数文件的“存根” PFILE。
当 Oracle ASM 存在时,使用 DBCA 创建数据库时,DBCA 将 SPFILE 放到 Oracle ASM 磁盘组中,并创建这个存根 PFILE。
创建服务器参数文件
使用 CREATE SPFILE
语句创建服务器参数文件。必须具有 SYSDBA
、SYSOPER
或 SYSBACKUP
管理权限才能执行此语句。
创建服务器参数文件:
- 运行
CREATE FILE
语句。
CREATE SPFILE
语句可以在实例启动之前或之后执行。但是,如果实例是使用服务器参数文件启动的,如果试图重新创建实例当前使用的相同服务器参数文件,则会引发错误。
您可以从现有文本初始化参数文件或内存中创建服务器参数文件(SPFILE)。从内存中创建 SPFILE 意味着将运行实例中的初始化参数的当前值复制到 SPFILE。
下面的示例从文本初始化参数文件 /u01/oracle/dbs/init.ora
创建一个服务器参数文件。在本例中,没有指定 SPFILE 名称,因此使用特定于平台的默认名称和位置创建该文件。
CREATE SPFILE FROM PFILE='/u01/oracle/dbs/init.ora';
复制
下一个示例演示如何创建服务器参数文件并提供名称和位置。
CREATE SPFILE='/u01/oracle/dbs/test_spfile.ora'
FROM PFILE='/u01/oracle/dbs/test_init.ora';
复制
下一个示例演示了从内存中初始化参数的当前值在默认位置创建服务器参数文件。
CREATE SPFILE FROM MEMORY;
复制
无论您是使用默认的 SPFILE 名称和默认位置,还是指定一个 SPFILE 名称和位置,如果相同名称的 SPFILE 已经存在于该位置中,则会在没有警告消息的情况下覆盖它。
当您从文本初始化参数文件创建 SPFILE 时,在与初始化参数文件中的参数设置相同的行上指定的注释将在 SPFILE 中维护。所有其他注释都被忽略。
SPFILE 初始化参数
SPFILE
初始化参数包含当前服务器参数文件的名称。
当数据库使用默认服务器参数文件时——也就是说,您发出 STARTUP
命令而不指定 PFILE
参数——SPFILE
的值是由服务器内部设置的。SQL*Plus 命令 SHOW PARAMETERS SPFILE
(或任何其他查询参数值的方法)显示当前正在使用的服务器参数文件的名称。
修改初始化参数值
您可以更改初始化参数值来影响数据库实例的操作。
关于修改初始化参数值
ALTER SYSTEM
语句允许您设置、更改或恢复初始化参数的默认值。如果使用的是文本初始化参数文件,ALTER SYSTEM
语句只更改当前实例的参数值,因为没有在磁盘上自动更新文本初始化参数的机制。必须手动更新它们才能传递给未来的实例。使用服务器参数文件可以克服这个限制。
有两种初始化参数:
-
当前 Oracle 数据库实例的动态初始化参数可以修改。这些变化立即生效。
-
静态初始化参数不能为当前实例更改。必须在文本初始化文件或服务器参数文件中更改这些参数,然后重新启动数据库才能生效。
设置或修改初始化参数值
对于服务器参数文件,使用 ALTER SYSTEM
语句的 SET
子句来设置或更改初始化参数值。
- 运行
ALTER SYSTEM SET
语句。
例如:下面的语句更改了在删除连接之前失败的登录尝试的最大次数。它包含一条注释,并显式地声明仅在服务器参数文件中进行更改。
ALTER SYSTEM SET SEC_MAX_FAILED_LOGIN_ATTEMPTS=3
COMMENT='Reduce from 10 for tighter security.'
SCOPE=SPFILE;
复制
下一个示例设置一个接受属性列表的复杂初始化参数。具体来说,正在设置的参数值是 LOG_ARCHIVE_DEST_n
初始化参数。此语句可以更改此参数的现有设置或创建新的归档目标。
ALTER SYSTEM
SET LOG_ARCHIVE_DEST_4='LOCATION=/u02/oracle/rbdb1/',MANDATORY,'REOPEN=2'
COMMENT='Add new destination on Nov 29'
SCOPE=SPFILE;
复制
当值由参数列表组成时,不能按位置或序号编辑单个属性。每次更新参数时,必须指定完整的值列表,并且新列表将完全替换旧列表。
ALTER SYSTEM SET 语句中的 SCOPE子句
在 ALTER SYSTEM SET
语句中可选的 SCOPE
子句指定了初始化参数更改的范围。
SCOPE 子句 | 描述 |
---|---|
SCOPE = SPFILE |
更改仅应用于服务器参数文件。效果如下:
这是唯一允许静态参数的 SCOPE 规范。 |
SCOPE = MEMORY |
更改仅在内存中应用。效果如下:
对于静态参数,这个规格是不允许的。 |
SCOPE = BOTH |
更改同时应用于服务器参数文件和内存中。效果如下:
对于静态参数,这个规格是不允许的。 |
如果实例没有使用服务器参数文件启动,则指定 SCOPE=SPFILE
或 SCOPE=BOTH
是错误的。如果使用服务器参数文件启动实例,默认为 SCOPE=BOTH
;如果使用文本初始化参数文件启动实例,默认为 MEMORY
。
对于动态参数,您还可以指定 DEFERRED
关键字。当指定时,更改仅对未来的会话有效。
当您指定 SCOPE
为 SPFILE
或 BOTH
时,一个可选的 COMMENT
子句允许您将文本字符串与参数更新关联起来。注释被写入服务器参数文件。
清除初始化参数值
可以使用 ALTER SYSTEM RESET
语句清除初始化参数值。当您这样做时,初始化参数值将更改为其默认值或启动值。
ALTER SYSTEM RESET
语句包含一个 SCOPE
子句。当在非 CDB 或多租户容器数据库(CDB)根中执行时,ALTER SYSTEM RESET
语句和 SCOPE
子句的行为与在可插入数据库(PDB)、应用程序根或应用程序 PDB 中执行时不同。
参数的启动值是实例启动或 PDB 打开完成后在内存中的参数值。这个值可以在启动后立即在 V$SYSTEM_PARAMETER
视图的 VALUE
和 DISPLAY_VALUE
列中看到。启动值可以与 spfile 中的值不同,也可以与缺省值不同(如果未在 spfile 中设置该参数),因为该参数的值可以在启动时内部调整。
ALTER SYSTEM RESET
语句的 SCOPE
值在非 CDB 和 CDB 的 CDB$ROOT
中行为如下:
-
SCOPE=SPFILE
:如果一个实例正在使用 SPFILE,则从 SPFILE 中删除该参数;默认值在下次实例启动时生效。 -
SCOPE=MEMORY
:启动值立即生效。但是,更改不会存储在实例的 spfile 中,并且会在实例重新启动时丢失。 -
SCOPE=BOTH
:如果一个实例正在使用 spfile,则从 spfile 中删除该参数;默认值立即生效,并且更改在实例重启期间可用。
ALTER SYSTEM RESET
语句的 SCOPE
值在 PDB、应用程序根目录或应用程序 PDB 中行为如下:
-
SCOPE=SPFILE
:从容器的 SPFILE 中移除参数;容器将在下一个 PDB 打开时从其根继承参数值。 -
SCOPE=MEMORY
:有两种情况:- 打开容器时,该参数在容器的 spfile 中存在。将参数值更新为该参数的启动值。此更改不会存储在容器的 spfile 中,并将在下一次打开容器时丢失。
- 打开容器时,该参数在容器的 spfile 中不存在。容器开始从它的根继承参数值。
-
SCOPE=BOTH
:从容器的 spfile 中移除参数;容器将从它的根继承参数值。
导出服务器参数文件
您可以使用 CREATE PFILE
语句将服务器参数文件(SPFILE)导出到文本初始化参数文件。
- 运行
CREATE PFILE
语句
可能需要导出服务器参数文件,原因如下:
- 出于诊断目的,列出实例当前使用的所有参数值。这类似于 SQL*Plus
SHOW PARAMETERS
命令或从V$PARAMETER
或V$PARAMETER2
视图中进行选择。 - 要修改服务器参数文件,首先导出它,编辑结果文本文件,然后使用 CREATE SPFILE 语句重新创建它。
导出的文件还可以用于使用 PFILE
子句启动实例。
必须具有 SYSDBA
、SYSOPER
或 SYSBACKUP
管理权限才能执行 CREATE PFILE
语句。导出的文件是在数据库服务器系统上创建的。它包含与参数相关的任何注释,与参数设置位于同一行。
下面的示例从 SPFILE 创建一个文本初始化参数文件:
CREATE PFILE FROM SPFILE;
复制
因为没有为文件指定名称,所以数据库使用特定于平台的名称创建一个初始化参数文件,它是从特定于平台的默认服务器参数文件创建的。
下面的例子从一个服务器参数文件创建一个文本初始化参数文件,但是在这个例子中指定了文件的名称:
CREATE PFILE='/u01/oracle/dbs/test_init.ora' FROM SPFILE='/u01/oracle/dbs/test_spfile.ora';
复制
备份服务器参数文件
您可以通过导出服务器参数文件(SPFILE)来创建备份。如果数据库的备份和恢复策略是使用 Recovery Manager (RMAN)实现的,那么可以使用 RMAN 创建 SPFILE 的备份。当您备份数据库时,RMAN 会自动备份 SPFILE,但是 RMAN 还允许您专门创建当前活动的 SPFILE 的备份。
- 通过导出或使用 RMAN 备份服务器参数文件。
恢复丢失或损坏的服务器参数文件
您可以恢复服务器参数文件(SPFILE)。如果服务器参数文件(SPFILE)丢失或损坏,那么当前实例可能会失败,或者下一次启动数据库实例的尝试可能会失败。
有几种恢复 SPFILE 的方法:
-
如果实例正在运行,执行如下命令,根据当前内存中初始化参数的值重新创建 SPFILE。
CREATE SPFILE FROM MEMORY;
复制该命令在默认位置使用默认名称创建 SPFILE。还可以使用新名称或在指定位置创建 SPFILE。
-
如果你有一个有效的文本初始化参数文件(PFILE),用下面的语句从 PFILE 重新创建 SPFILE:
CREATE SPFILE FROM PFILE;
复制该命令假设 PFILE 位于默认位置并具有默认名称。
-
从备份中恢复SPFILE。
-
如果以上方法都不适用,请执行以下步骤:
- 根据警报日志中的参数值清单创建文本初始化参数文件(PFILE)。
当实例启动时,用于启动的初始化参数被写入告警日志。您可以将此部分从告警日志的文本版本(没有 XML 标记)复制并粘贴到新的 PFILE 中。 - 从 PFILE 创建 SPFILE。
- 根据警报日志中的参数值清单创建文本初始化参数文件(PFILE)。
参数更新时读/写错误
如果在参数更新期间读取或写入服务器参数文件时发生错误,则在告警日志中报告错误,并且忽略服务器参数文件的所有后续参数更新。此时,您可以采取以下操作之一:
-
关闭实例,恢复本节前面描述的服务器参数文件,然后重新启动实例。
-
如果不关心后续参数更新是否持久,则继续运行数据库。
查看参数设置的方法
您可以使用几种不同的方法查看参数设置。
方法 | 描述 |
---|---|
SHOW PARAMETERS |
这个 SQL*Plus 命令显示当前会话的有效初始化参数值。 |
SHOW SPPARAMETERS |
这个 SQL*Plus 命令显示服务器参数文件(SPFILE)中的初始化参数值。 |
CREATE PFILE |
此 SQL 语句从 SPFILE 或当前内存设置创建文本初始化参数文件(PFILE)。然后,您可以使用任何文本编辑器查看 PFILE。 |
V$PARAMETER |
此视图显示当前会话的有效初始化参数值。 |
V$PARAMETER2 |
此视图显示当前会话的有效初始化参数值。在这个视图中,更容易区分列表参数值,因为每个列表参数值都出现在单独的行中。 |
V$SYSTEM_PARAMETER |
此视图显示实例的有效初始化参数值。新会话从实例范围的值继承参数值。 |
V$SYSTEM_PARAMETER2 |
此视图显示实例的有效初始化参数值。新会话从实例范围的值继承参数值。在这个视图中,更容易区分列表参数值,因为每个列表参数值都出现在单独的行中。 |
V$SPPARAMETER |
此视图显示 SPFILE 的当前内容。如果实例没有使用 SPFILE,则视图返回 ISSPECIFIED 列中的FALSE值。 |