成为MySQL DBA后,再看ORACLE数据库(三、参数管理)
一、参数文件
在ORACLE 11g及以后的版本中,ORACLE使用spfile作为数据库的参数文件,这是一个二进制文件,不能通过手工修改。SPFILE的引入使得对于参数的修改都可以在命令行完成,不需要手工修改,这也是为了减少了人为错误的发生。而在MySQL中,需要去手工维护my.cnf参数文件,主要原因是在MySQL中参数配置个性化较强,很多参数需要根据实际场景个性化配置,而把这些参数统一放在my.cnf中管理,虽然可能导致参数文件中的参数和实际数据库中不一致,但对MySQL而言统一了参数的管理,是更适合MySQL的方式。ORACLE的参数文件位于$ORACLE_HOME/dbs目录下,除了spfile文件,还有一个pfile文件init.ora,这个也是ORACLE的初始化参数文件,除了第一次启动数据库需要pfile(然后可以根据pfile创建 spfile),数据库可以不再需要pfile。
二、参数的查询
在sqlplus命令行中,可以通过show parameter命令查询参数当前会话的参数值,这条命令实际上在ORACLE后台查询的是v$parameter视图。
此外,通过show spparameter命令查询的是在spfile文件中包含的参数,同样也对应有v$spparameter视图。
v$system_parameter视图记录当前实例生效的初始化参数设置,注意这里是实例生效而不是会话生效。因此如果在会话级别修改了参数设置,v$parameter中显示的参数值就可能和v$system_parameter显示的有所不同。这在MySQL中就是参数的global值和session值的区别。
三、参数的修改
说起参数的修改,就不得不提一下参数的分类,按照修改方式分类,ORACLE把参数分为了静态参数和动态参数,静态参数只能在参数文件中修改,在重新启动后方能生效;动态参数可以动态调整,调整后可以立即生效。ORACLE修改参数的语句如下:
alter system set <parameter_name> =<value> scope = memory|spfile|both [sid=<sid_name>]
该语句的scope参数有三个可选值:memory、spfile、both。当scope = memory,修改参数立即生效,但只改变当前实例运行,重新启动数据库后失效;当scope = spfile,只改变spfile的设置,不改变当前实例运行,需要重新启动数据库后生效;当scope = both,同时改变实例运行和SPFILE,当前更改立即生效,重新启动数据库后仍然有效,如果不带scope选项,则默认为both。针对RAC环境,ALTER SYSTEM还可以指定SID参数,对不同实例进行不同设置。因此对于静态参数,只能通过scope = spfile修改后重启数据库生效,不指定scope = spfile则会报错,比如processes参数。
那么,如何区分一个参数是动态参数还是静态参数呢?除了查阅官方文档,还可以通过查询v$parameter视图的ISSYS_MODIFIABLE列,该列为IMMEDIATE是动态参数,为FALSE的是静态参数。