RAC 环境下参数文件(spfile)管理

    RAC环境下,初始化参数文件与但实例下参数文件有些异同,主要表现在初始化参数可以为多个实例公用,也可以单独设置各个实例的初始化参数。对于那些非共用的初始化参数则必须要单独设置,而共用的则可以单独设置,但一般不建议这么用。本文描述RAC 环境下参数文件(spfile)的相关管理工作。

        有关RAC环境下的重要参数描述,请参考:RAC 环境下重要参数

1、参数文件的位置

  SQL> show parameter instance_name
  
  NAME                                 TYPE        VALUE
  ------------------------------------ ----------- ------------------------------
  instance_name                        string      ora10g1
  SQL> show parameter spfile;
  
  NAME                                 TYPE        VALUE
  ------------------------------------ ----------- ------------------------------
  spfile                               string      +DG1/ora10g/spfileora10g.ora
  
  SQL> show parameter instance_name
  
  NAME                                 TYPE        VALUE
  ------------------------------------ ----------- ------------------------------
  instance_name                        string      ora10g2
  SQL> show parameter spfile 
  
  NAME                                 TYPE        VALUE
  ------------------------------------ ----------- ------------------------------
  spfile                               string      +DG1/ora10g/spfileora10g.ora
  
  SQL> show parameter cluster
  
  NAME                                 TYPE        VALUE
  ------------------------------------ ----------- ------------------------------
  cluster_database                     boolean     TRUE
  cluster_database_instances           integer     2
  
  
  oracle@bo2dbp:~> cd /u01/oracle/admin/ora10g
  oracle@bo2dbp:/u01/oracle/admin/ora10g> ls
  adump  bdump  cdump  dpdump  hdump  pfile  udump
  oracle@bo2dbp:/u01/oracle/admin/ora10g> cd pfile
  oracle@bo2dbp:/u01/oracle/admin/ora10g/pfile> ls -hltr
  total 4.0K
  -rw-r----- 1 oracle oinstall 2.7K 2012-09-27 12:12 init.ora.8272012121245
  oracle@bo2dbp:/u01/oracle/admin/ora10g/pfile> cd $ORACLE_HOME/dbs
  oracle@bo2dbp:/u01/oracle/db/dbs> ls *.ora
  init+ASM1.ora  initdw.ora  initGOBO1A_tmp.ora  initGOBO4A.ora  init.ora  initora10g1.ora
  oracle@bo2dbp:/u01/oracle/db/dbs> more initora10g1.ora
  SPFILE='+DG1/ora10g/spfileora10g.ora'
  oracle@bo2dbs:/u01/oracle/db/dbs> more initora10g2.ora
  SPFILE='+DG1/ora10g/spfileora10g.ora'
  
  #由上面的查询可知RAC环境下的参数文件通常都存放在RAW或者ASM中,缺省路径为$ORACLE_HOME/dbs/init{ORACLE_SID}.ora
  #各个实例只是存放pfile文件,pfile文件的内容是指向spfile文件的位置,即告诉,兄弟,你去xx去找那个spfile吧,哈哈,,,
  #注,Oracle数据库启动时会先找spfile${ORACLE_SID.ora},如果对应的spfile不存在则找spfile.ora
  #如果spfile.ora找不到,则找相应的pfile(init{ORACLE_SID}.ora)
  #那,要是都找不到呢,那就是用缺省的init.ora尝试启动实例

2、参数文件的备份
  参数文件备份的方式有很多种,一般情况下当启用了RMAN自动备份控制文件时,会自动备份参数文件。
  其次是手工备份参数文件,这种方式通常是将spfile内容转换为pfile,说简单点,转为文本文件保存,文件名任意。
  建议在修改参数文件之前先手工备份参数文件,使用命令: create pfile=['<dir>'] from spfile;
  注,单实例情形下,如果使用spfile文件启动实例,可以通过上面的方式直接备份,RAC环境下这么干,那就把pfile文件给覆盖了
  因此,RAC环境下建议为pfile文件指定不同的文件名。如当前为initora10g1.ora,则可以指定为initora10g1.ora.bak
  SQL> create pfile='/u01/oracle/db/dbs/initora10g1.ora.bak' from spfile;

  File created.

  SQL> ho ls /u01/oracle/db/dbs/*ora10g*
  /u01/oracle/db/dbs/hc_ora10g1.dat   /u01/oracle/db/dbs/initora10g1.ora.bak
  /u01/oracle/db/dbs/initora10g1.ora  /u01/oracle/db/dbs/orapwora10g1
  
  SQL> ho more /u01/oracle/db/dbs/initora10g1.ora.bak
  ora10g2.__db_cache_size=142606336
  ora10g1.__db_cache_size=163577856
  ora10g1.__java_pool_size=4194304
  ora10g2.__java_pool_size=4194304
  ora10g1.__large_pool_size=4194304
  ora10g2.__large_pool_size=4194304
  ora10g2.__shared_pool_size=180355072
  ora10g1.__shared_pool_size=159383552
  ora10g1.__streams_pool_size=0
  ora10g2.__streams_pool_size=0
  *.audit_file_dest='/u01/oracle/admin/ora10g/adump'
  *.background_dump_dest='/u01/oracle/admin/ora10g/bdump'
  *.cluster_database_instances=2
  *.cluster_database=true
  *.compatible='10.2.0.3.0'
  *.control_files='+DG2/ora10g/controlfile/current.286.795096347',
    '+REV/ora10g/controlfile/current.295.795096347'
  *.core_dump_dest='/u01/oracle/admin/ora10g/cdump'
  *.db_block_size=8192
  *.db_create_file_dest='+DG2'
  *.db_domain=''
  *.db_file_multiblock_read_count=16
  *.db_name='ora10g'
  *.db_recovery_file_dest='+REV'
  *.db_recovery_file_dest_size=2147483648
  *.dispatchers='(PROTOCOL=TCP) (SERVICE=ora10gXDB)'
  ora10g2.instance_number=2
  ora10g1.instance_number=1
  *.job_queue_processes=10
  ora10g1.local_listener='local_lsnr_ora10g1'
  ora10g2.local_listener='local_lsnr_ora10g2'
  *.open_cursors=300
  *.pga_aggregate_target=112197632
  *.processes=150
  *.remote_listener='REMOTE_LSNR_ORA10G'
  *.remote_login_passwordfile='exclusive'
  *.sga_target=337641472
  ora10g2.thread=2
  ora10g1.thread=1
  *.undo_management='AUTO'
  ora10g2.undo_tablespace='UNDOTBS2'
  ora10g1.undo_tablespace='UNDOTBS1'
  *.user_dump_dest='/u01/oracle/admin/ora10g/udump'
  
  对于上面的参数文件里列出的信息,如果参数前面带有星号,则表明当前的参数为共用参数,前面有实例名的则为实例参数
  
3、参数文件的修改
  参数文件中参数修改方式如下:
  alter system|session set parametername = values scope = memory | spfile |both sid = 'sid' | ‘*’;

    scope 
       memory : 只对当前有效,下次启动则失效
       spfile : 只对spfile 修改,必须经过下一次启动才生效,当前的实例没有修改
       both :内存与参数文件都将修改,当不指定scope时,缺省为both.
  system | session
       system : system级别有效,影响整个系统及所有使用者
    session : 仅当前session有效,一旦退出之后将实效
  'sid' | ‘*’  
    这个在RAC环境下使用的较为频繁,指定sid_name则当前指定的实例生效,如果指定 '*',则所有实例生效
    注,缺省情况下为sid='*',因此修改是不要忘了,如果没有指定sid,则RAC上的所有实例都会被修改

  下面是修改示例    
  SQL> show parameter instance_name
  
  NAME                                 TYPE        VALUE
  ------------------------------------ ----------- -------------------
  instance_name                        string      ora10g1
  
  SQL> show parameter pga
  
  NAME                                 TYPE        VALUE
  ------------------------------------ ----------- -------------------
  pga_aggregate_target                 big integer 107M
  
  SQL> alter system set pga_aggregate_target=100m scope=both sid='ora10g1';  -->将ora10g1的pga改为100m
  
  System altered.
  
  SQL> alter system set pga_aggregate_target=90m sid='ora10g2';   -->将ora10g2的pga改为90m
  
  System altered.
  
  SQL> show parameter pga      -->当前的pga已经被改为100m
  
  NAME                                 TYPE        VALUE
  ------------------------------------ ----------- ------------------------------
  pga_aggregate_target                 big integer 100M
  
  SQL> conn system/oracle@ora10g2  -->连接到实例 ora10g2
  Connected.
  SQL> show parameter instance_name
  
  NAME                                 TYPE        VALUE
  ------------------------------------ ----------- ------------------------------
  instance_name                        string      ora10g2
  SQL> show parameter pga     -->此时pga的值显示为90m
  
  NAME                                 TYPE        VALUE
  ------------------------------------ ----------- ------------------------------
  pga_aggregate_target                 big integer 90M
  
  SQL> create pfile='/u01/oracle/db/dbs/initora10g1.ora.emp' from spfile;
  create pfile='/u01/oracle/db/dbs/initora10g1.ora.emp' from spfile
  *
  ERROR at line 1:
  ORA-01031: insufficient privileges    -->缺乏权限,因为当前连接的是instance ora10g2
  
  SQL> conn system/oracle@ora10g1
  Connected.
  
  SQL> create pfile='/u01/oracle/db/dbs/initora10g1.ora.tmp' from spfile;                      
  
  File created.
  
  SQL> ho cat /u01/oracle/db/dbs/initora10g1.ora.tmp |grep pga  
  *.pga_aggregate_target=112197632         #新的pfile文件中同时存在pga的值
  ora10g1.pga_aggregate_target=104857600   #有两个指定了实例名,此时谁生效呢?我们前面已经查询出了结果
  ora10g2.pga_aggregate_target=94371840    #同一参数,有实例名的值将优先有带*的参数值
  
  SQL> alter system reset pga_aggregate_target sid='ora10g1';-->使用reset方式重置pga,或恢复缺省值
                                                 -->如果需要保留两个新改的参数,建议reset之前的共用参数以避免混淆 
  System altered.                                -->在reset原来的参数时,不指定sid或sid='*'   
  SQL> show parameter pga
  
  NAME                                 TYPE        VALUE
  ------------------------------------ ----------- ------------------------------
  pga_aggregate_target                 big integer 100M
  
  SQL> conn system/oracle@ora10g2
  Connected.
  SQL> alter system reset pga_aggregate_target sid='ora10g2';
  
  System altered.
  
  #Author : Robinson
  #Blog   : http://blog.csdn.net/robinson_0612
  
  SQL> show parameter pga
  
  NAME                                 TYPE        VALUE
  ------------------------------------ ----------- ------------------------------
  pga_aggregate_target                 big integer 90M

  oracle@bo2dbp:~> srvctl stop instance -d ora10g -i ora10g1
  oracle@bo2dbp:~> srvctl start instance -d ora10g -i ora10g1  
  SQL> show parameter instance_name
  
  NAME                                 TYPE        VALUE
  ------------------------------------ ----------- -------------------
  instance_name                        string      ora10g1
  
  SQL> show parameter pga
  
  NAME                                 TYPE        VALUE
  ------------------------------------ ----------- -------------------
  pga_aggregate_target                 big integer 107M

4、spfile文件位置的修改 
  SQL> show parameter spfile;
  
  NAME                                 TYPE        VALUE
  ------------------------------------ ----------- ------------------------------
  spfile                               string      +DG1/ora10g/spfileora10g.ora
   
  SQL> create spfile='+REV/ORA10G/spfileora10g.ora'
    2  from pfile='/u01/oracle/db/dbs/initora10g1.ora.bak';
  
  File created.
  
  SQL> ho echo "spfile='+REV/ORA10G/spfileora10g.ora'" >/u01/oracle/db/dbs/initora10g1.ora
  
  SQL> ho more /u01/oracle/db/dbs/initora10g1.ora
  spfile='+REV/ORA10G/spfileora10g.ora'
  
  SQL> startup force;
  SQL> show parameter spfile;
  
  NAME                                 TYPE        VALUE
  ------------------------------------ ----------- ------------------------------
  spfile                               string      +REV/ora10g/spfileora10g.ora
  SQL> shutdown immediate;
  SQL> exit
  oracle@bo2dbp:~> ssh bo2dbs
  Last login: Fri Sep 28 15:42:59 2012 from 192.168.1.108
  oracle@bo2dbs:~> echo "spfile='+REV/ORA10G/spfileora10g.ora'" >/u01/oracle/db/dbs/initora10g2.ora
  oracle@bo2dbs:~> srvctl stop database -d ora10g
  oracle@bo2dbs:~> srvctl start database -d ora10g
  oracle@bo2dbs:~> export ORACLE_SID=ora10g2
  oracle@bo2dbs:~> sqlplus / as sysdba
  SQL> show parameter pfile;   -->查看时还是使用之前的spfile文件
  
  NAME                                 TYPE        VALUE
  ------------------------------------ ----------- ------------------------------
  spfile                               string      +DG1/ora10g/spfileora10g.ora
  
  oracle@bo2dbs:~> srvctl config database -d ora10g -a
  bo2dbp ora10g1 /u01/oracle/db
  bo2dbs ora10g2 /u01/oracle/db
  DB_NAME: ora10g
  ORACLE_HOME: /u01/oracle/db
  SPFILE: +DG1/ora10g/spfileora10g.ora
  DOMAIN: null
  DB_ROLE: null
  START_OPTIONS: null
  POLICY:  AUTOMATIC
  ENABLE FLAG: DB ENABLED
  #下面将参数文件路径更新到ocr,此时数据库并未shutdown,生产环境建议先停止数据库然后再修改
  oracle@bo2dbs:~> srvctl modify database -d ora10g -p '+REV/ORA10G/spfileora10g.ora' 
  oracle@bo2dbs:~> srvctl stop database -d ora10g
  oracle@bo2dbs:~> srvctl config database -d ora10g -a
  bo2dbp ora10g1 /u01/oracle/db
  bo2dbs ora10g2 /u01/oracle/db
  DB_NAME: ora10g
  ORACLE_HOME: /u01/oracle/db
  SPFILE: +REV/ORA10G/spfileora10g.ora
  DOMAIN: null
  DB_ROLE: null
  START_OPTIONS: null
  POLICY:  AUTOMATIC
  ENABLE FLAG: DB ENABLED
  oracle@bo2dbs:~> srvctl start database -d ora10g
  oracle@bo2dbs:~> sqlplus / as sysdba
  SQL> show parameter spfile;
  
  NAME                                 TYPE        VALUE
  ------------------------------------ ----------- ------------------------------
  spfile                               string      +REV/ora10g/spfileora10g.ora

  #使用srvctl start启动时,不会依赖类似于单实例环境或rac环境下的sqlplus启动数据库时按顺序寻找spfile文件,
  #而是直接根据ocr中spfile文件位置启动数据库。

更多参考

有关Oracle RAC请参考
     使用crs_setperm修改RAC资源的所有者及权限
     使用crs_profile管理RAC资源配置文件
     RAC 数据库的启动与关闭
     再说 Oracle RAC services
     Services in Oracle Database 10g
     Migrate datbase from single instance to Oracle RAC
     Oracle RAC 连接到指定实例
     Oracle RAC 负载均衡测试(结合服务器端与客户端)
     Oracle RAC 服务器端连接负载均衡(Load Balance)
     Oracle RAC 客户端连接负载均衡(Load Balance)
     ORACLE RAC 下非缺省端口监听配置(listener.ora tnsnames.ora)
     ORACLE RAC 监听配置 (listener.ora tnsnames.ora)
     配置 RAC 负载均衡与故障转移
     CRS-1006 , CRS-0215 故障一例 
     基于Linux (RHEL 5.5) 安装Oracle 10g RAC
     使用 runcluvfy 校验Oracle RAC安装环境

有关Oracle 网络配置相关基础以及概念性的问题请参考:
     配置非默认端口的动态服务注册
     配置sqlnet.ora限制IP访问Oracle
     Oracle 监听器日志配置与管理
     设置 Oracle 监听器密码(LISTENER)
     配置ORACLE 客户端连接到数据库

有关基于用户管理的备份和备份恢复的概念请参考
     Oracle 冷备份
     Oracle 热备份
     Oracle 备份恢复概念
     Oracle 实例恢复
     Oracle 基于用户管理恢复的处理
     SYSTEM 表空间管理及备份恢复
     SYSAUX表空间管理及恢复
     Oracle 基于备份控制文件的恢复(unsing backup controlfile)

有关RMAN的备份恢复与管理请参考
     RMAN 概述及其体系结构
     RMAN 配置、监控与管理
     RMAN 备份详解
     RMAN 还原与恢复
     RMAN catalog 的创建和使用
     基于catalog 创建RMAN存储脚本
     基于catalog 的RMAN 备份与恢复
     RMAN 备份路径困惑
     使用RMAN实现异机备份恢复(WIN平台)
     使用RMAN迁移文件系统数据库到ASM
     linux 下RMAN备份shell脚本
     使用RMAN迁移数据库到异机

有关ORACLE体系结构请参考
     Oracle 表空间与数据文件
     Oracle 密码文件
     Oracle 参数文件
     Oracle 联机重做日志文件(ONLINE LOG FILE)
     Oracle 控制文件(CONTROLFILE)
     Oracle 归档日志
     Oracle 回滚(ROLLBACK)和撤销(UNDO)
     Oracle 数据库实例启动关闭过程
     Oracle 10g SGA 的自动化管理
     Oracle 实例和Oracle数据库(Oracle体系结构) 

上一篇:网游运营基本概念及专业术语


下一篇:HarmonyOS-Codelabs系列挑战之构建你的数据应用