问题: 为什么不能用文本编辑器来编辑或者修改spfile中的键值对?
回答: 因为spfile是二进制文件,必须使用alter system 命令,
语法如下:
alter system set parameter=value <comment='text'> <deferred>
<scope=memory|spfile|both> <sid='sid|*'>
<container=current|all>
- parameter=value表示更改的参数名以及参数的新值。
- comment='text'是一个与此参数相关的可选注释。若设置这个注释后,将会放入v$parameterde视图中的UPDATE_COMMENT字段中。
SQL> r
1* select name,UPDATE_COMMENT from v$parameter where name like 'sga%'
NAME UPDATE_COMMENT
-------------------------------------------------------------------------------- ------------------------------
sga_max_size internally adjusted
sga_target
- deferred 指定系统修改是否对以后的会话生效,即:对当前会话无效,新建会话生效。我们可以查看数据库必须要使用deferred的参数。
SQL> select name from v$parameter where ISSYS_MODIFIABLE='DEFERRED';
NAME
--------------------------------------------------------------------------------
backup_tape_io_slaves
recyclebin
audit_file_dest
object_cache_optimal_size
object_cache_max_size_percent
sort_area_size
sort_area_retained_size
olap_page_pool_size
8 rows selected. (此返回结果因版本各异)
因此,当我们需要修改spfile中的以上参数时,必须使用DEFERRED,且不是立即生效,如recyclebin
alter system set recyclebin=off DEFERRED;
- scope=memory|spfile|both 指示了这个参数设置的"作用域",
- scope=memory只在实例中修改,数据库重启后失效。
- scope=spfile只修改spfile中的值,数据库重启后参数生效,如process
- scope=both指在内存和spfile中都会完成参数的修改。
- sid='sid|*'主要用于集群,默认为sid='*'
例如:
alter system set local_listener='(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=135.149.97.xxx)(PORT=1621))))' sid='db1';
container=current|all适用于多租户架构的数据库,12C及以上,默认为container=current,另外对于PDB()来说,需要注意的是它的参数存储于其自身的数据字典当中,而非spfile,因此,当我们移动到另外一个容器时,其自身的参数设置也会随之一并转移。
问题二:如何取消spfile中的设置,换句话说如何还原系统默认值?
回答:使用reset子句
语法如下:
alter system reset parameter <scope=memory|spfile|both> sid='sid|*'