Oracle数据库的初始化参数决定了实例的内存分配、进程行为、归档方式等核心运行特性。修改参数是DBA日常运维中最高频的操作之一,但很多初学者会遇到困惑:为什么有的参数改完立刻生效,有的参数改完必须重启?为什么明明执行了alter system set语句,重启后参数却恢复成了旧值?这些问题的根源在于没有搞清楚动态参数与静态参数的区别,以及alter system语句中scope子句的用法。本文将系统梳理这两类参数的修改方法。

一、动态参数与静态参数的本质区别
动态参数是指可以在实例运行期间修改并立即生效的参数,比如sga_max_size、sessions、processes之外的许多内存类参数,典型的如db_cache_size、shared_pool_size、undo_retention等。这类参数之所以能在线调整,是因为Oracle在实例内部为它们保留了可动态调整的内存结构,修改时只需要通知相关组件重新分配或调整阈值,不需要重新构建实例。
静态参数则相反,它们在实例启动时被读取并固化到内存结构中,运行期间无法被在线修改,例如processes、sessions、db_block_size、compatible、control_files、log_archive_start(旧版本)等。以db_block_size为例,数据文件的最小I/O单位在建库时就确定了,如果运行中改动,整个数据文件的组织方式都会失效,因此Oracle根本不允许在线修改这类参数。
判断一个参数是动态还是静态,可以查询v$parameter视图的ISSYS_MODIFIABLE列:
-- 查看参数是否支持在线修改
SELECT name, value, issys_modifiable
FROM v$parameter
WHERE name IN ('db_cache_size','processes','sga_target','db_block_size');
-- ISSYS_MODIFIABLE 取值含义:
-- IMMEDIATE : 动态参数,alter system 后立即生效
-- DEFERRED : 动态参数,只对新建立的会话生效
-- FALSE : 静态参数,必须写入spfile并重启实例返回IMMEDIATE说明是动态参数,DEFERRED表示修改只影响后续新会话,返回FALSE就是静态参数。养成修改前先查询这个视图的习惯,可以避免执行语句后直接报ORA-02096错误。
二、alter system set 语句与scope子句详解
无论是动态还是静态参数,修改语句都是alter system set,关键差异体现在scope子句上。scope有三种取值:memory、spfile和both,它们分别表示只修改当前内存中的值、只修改spfile中的值、同时修改内存和spfile。
先看动态参数的典型修改。假设要把undo_retention调整为3600秒,可以使用scope等于both(这也是省略scope时的默认值,前提是实例使用spfile启动):
-- 修改undo_retention,内存和spfile同时更新,立即生效 ALTER SYSTEM SET undo_retention = 3600 SCOPE = BOTH; -- 只改内存,重启后失效(常用于临时测试) ALTER SYSTEM SET undo_retention = 3600 SCOPE = MEMORY; -- 验证修改结果 SELECT value FROM v$parameter WHERE name = 'undo_retention';
scope等于memory的场景多用于临时性调整,比如白天临时增大某个缓存,晚上重启后自动恢复原值。要注意的是,如果实例是用pfile(文本参数文件)启动的,执行scope等于memory会报错,因为pfile不支持在线写入,这种情况下只能手工编辑pfile文件后重启。
再看静态参数。静态参数只能使用scope等于spfile,语句执行后当前运行实例不受任何影响,新值要等下次重启时才从spfile读取生效:
-- 修改processes参数,必须指定SCOPE=SPFILE ALTER SYSTEM SET processes = 500 SCOPE = SPFILE; -- 如果对静态参数执行 SCOPE=MEMORY 或 BOTH,会报错: -- ORA-02096: specified initialization parameter is not modifiable with this option -- 修改后重启实例生效 SHUTDOWN IMMEDIATE; STARTUP;
一个常见的坑是:对静态参数执行不带scope的alter system语句。Oracle在解析时会尝试scope等于both,而both包含memory部分,静态参数不允许修改内存值,于是直接报ORA-02096。所以修改静态参数时一定要显式写上SCOPE=SPFILE,这既是语法要求,也是一种自我提醒——提醒你这个参数改完是要重启才生效的。
三种scope取值的适用场景总结如下:动态参数需要立即生效且重启后保留,用both(或省略);动态参数临时调整用memory;静态参数或需要延迟生效的调整用spfile。另外,如果参数文件是pfile而非spfile,memory和spfile两个取值都不可用,只能手工编辑pfile文本文件。
三、参数文件pfile与spfile的关系及注意事项
scope子句之所以依赖spfile,是因为spfile(server parameter file)是二进制格式的参数文件,Oracle可以通过alter system语句直接写入;而pfile是普通的文本文件,必须由DBA手工编辑。查看当前实例使用哪种参数文件启动:
-- 查看spfile路径,如果VALUE为空说明是用pfile启动的 SELECT value FROM v$parameter WHERE name = 'spfile'; -- 查看当前生效的所有参数值 SHOW PARAMETER spfile; -- 从spfile生成pfile,用于备份或手工编辑 CREATE PFILE = '/u01/backup/initbak.ora' FROM SPFILE; -- 反向操作:从pfile创建spfile CREATE SPFILE FROM PFILE = '/u01/backup/initbak.ora';
强烈建议在批量修改参数前先执行一次create pfile from spfile做备份。spfile是二进制文件,如果被误改坏(比如有人用文本编辑器直接编辑了spfile),实例可能无法启动,此时可以用备份的pfile重新生成spfile来恢复。这也是处理参数改动导致实例启动失败的应急手段:先用startup pfile='/u01/backup/initbak.ora'指定pfile启动实例,再用它重建spfile。
还有一点值得注意:spfile不要手工编辑。有人图方便用vi打开spfile修改,保存后二进制结构被破坏,重启时实例直接报错无法启动,这类故障在现实中非常常见。所有对spfile的修改都应该通过alter system语句完成。
对于RAC环境,alter system还支持sid子句。默认情况下sid等于*表示所有实例生效,如果只想修改某个节点,可以指定具体的实例名,例如ALTER SYSTEM SET processes=500 SCOPE=SPFILE SID='orcl1',这在各节点硬件配置不一致的场景下很实用。
四、参数修改的验证与回退实践
修改参数后要养成验证的习惯。当前会话可以用show parameter查看,也可以查询v$parameter和v$spparameter分别确认内存值和spfile值:
-- 对比内存中的值与spfile中的值
SELECT a.name, a.value AS memory_value, b.value AS spfile_value
FROM v$parameter a
JOIN v$spparameter b ON a.name = b.name
WHERE a.name IN ('undo_retention','processes','sga_target');
-- 如果发现改错了,回退spfile中的值
ALTER SYSTEM SET undo_retention = 900 SCOPE = SPFILE;
-- 使用reset清除spfile中该参数的自定义值,恢复默认行为
ALTER SYSTEM RESET undo_retention SCOPE = SPFILE SID = '*';v$parameter反映的是当前实例内存中实际生效的值,v$spparameter反映的是spfile中记录的值。当两者不一致时,说明有过scope等于memory的修改尚未同步到spfile,或者spfile中的修改尚未重启生效。通过对比这两个视图,可以快速判断任何一个参数当前处于什么状态。
回退操作有两个选择:一是用alter system set把值改回原值;二是用alter system reset直接删除spfile中该参数的条目,让Oracle回到默认行为。reset语句同样要求指定scope和sid,写法上比set稍微繁琐一点,但对于不确定原始默认值的参数,reset是更干净的做法。
总的来说,Oracle参数修改的核心逻辑就一句话:动态参数看ISSYS_MODIFIABLE,能用both就用both;静态参数老老实实scope等于spfile加重启;改前备份spfile,改后对比v$parameter与v$spparameter验证。掌握这套流程后,参数调整就不再是碰运气的操作,而是可控、可验证、可回退的规范动作。
Oracle参数修改动态参数静态参数alter systemscope子句修改时间:2026-09-10 19:30:52