天天看點

AG閱讀總結10.4.2——參數檔案管理

參數檔案(10g中的參數檔案)

    主要用來記錄資料庫的配置檔案,在資料庫啟動時,Oracle讀取參數檔案,并根據參數檔案中的參數設定來配置資料庫。

    如記憶體池的配置設定,允許打開的程序數和會話數等。

兩類參數檔案:

    pfile:文本檔案的參數檔案,可以使用vi,vim等編輯器修改,檔案名通常為init<sid>.ora

    spfile:二進制的參數檔案,不能直接修改,隻能存放在Oracle伺服器端,可以使用EM或指令來修改

    (alter system|session set parameter_name = values <>),

    檔案名通常為spfile<sid>.ora,支援RMAN備份。

優先級别:

    Oracle 啟動讀取參數檔案的順序,如果個檔案都不存在,則Oracle會報錯

    spfile<sid>.ora --> spfile.ora -->init<sid>.ora

參數檔案的路徑:

     spfle:$ORACLE_HOME/dbs/spfile$ORACLE_SID.ora

     pfile(9i):$ORALCE_HOME/dbs/init$ORALCE_SID.ora  /*10g以後一般不用init<sid>.ora*/

     pfile(10g):$ORALCE_BASE/admin/$ORACLE_SID/pfile /*僅當資料庫初始化時使用*/

     pfile:$ORACLE_HOME/dbs/init.ora  /*預設*/

參數檔案之間的轉化

     spfile 轉化為pfile

     pfile 轉換為spfile

     從spfile來生成pfile

     create pfile from spfile ,執行完畢後,pfile 将儲存為$ORACLE_HOME/dbs/init$ORACLE_SID.ora

     也可以指定pfile 的路徑:create pfile = '<dir>' from spfile;

     由pfile 生成spfile

     create spfile from pfile

     create spfile from pfile = '<dir>'

     create spfile = '<dir>' from pfile

     11g中的新指令,從memeory中生成

     create spfile = '<dir>' from memeory */

示範:

 spfile --> pfile

     SQL> create pfile from spfile;

     File created.

    SQL> ho ls -al /u01/app/oracle/10g/dbs/

    total 56

    drwxr-x---  2 oracle oinstall  4096 Apr  8 13:49 .

    drwxr-x--- 55 oracle oinstall  4096 Apr  7 09:48 ..

    -rw-r-----  1 oracle oinstall  1544 Apr  6 12:06 hc_orcl.dat

    -rw-r-----  1 oracle oinstall  8385 Sep 11  1998 init.ora

    -rw-r-----  1 oracle oinstall 12920 May  3  2001 initdw.ora

    -rw-------  1 oracle oinstall  1155 Apr  8 13:49 initorcl.ora

    -rw-r-----  1 oracle oinstall    24 Apr  6 12:06 lkORCL

    -rw-r-----  1 oracle oinstall  1536 Apr  7 15:50 orapworcl

    -rw-r-----  1 oracle oinstall  3584 Apr  8 11:15 spfileorcl.ora

    SQL> ho cat /u01/app/oracle/10g/dbs/initorcl.ora

    orcl.__db_cache_size=251658240

    orcl.__java_pool_size=4194304

    orcl.__large_pool_size=4194304

    orcl.__shared_pool_size=142606336

    orcl.__streams_pool_size=0

    *.audit_file_dest='/u01/app/oracle/admin/orcl/adump'

    *.background_dump_dest='/u01/app/oracle/admin/orcl/bdump'

    *.compatible='10.2.0.1.0'

    *.control_files='/u01/app/oracle/oradata/orcl/control01.ctl','/u01/app/oracle/oradata/orcl/control02.ctl',                  '/u01/app/oracle/oradata/orcl/control03.ctl'

    *.core_dump_dest='/u01/app/oracle/admin/orcl/cdump'

    *.db_block_size=8192

    *.db_create_file_dest='/u01/app/oracle/oradata/orcl'

    *.db_create_online_log_dest_1='/u01/app/oracle/disk1'

    *.db_create_online_log_dest_2='/u01/app/oracle/disk2'

    *.db_domain=''

    *.db_file_multiblock_read_count=16

    *.db_name='orcl'

    *.db_recovery_file_dest='/u01/app/oracle/flash_recovery_area'

    *.db_recovery_file_dest_size=2147483648

    *.dispatchers='(PROTOCOL=TCP) (SERVICE=orclXDB)'

    *.job_queue_processes=10

    *.open_cursors=300

    *.pga_aggregate_target=135266304

    *.processes=150

    *.remote_login_passwordfile='EXCLUSIVE'

    *.sga_target=406847488

    *.undo_management='AUTO'

    *.undo_tablespace='UNDOTBS1'

    *.user_dump_dest='/u01/app/oracle/admin/orcl/udump'

pfile --> spfile

    SQL> create spfile from pfile;  /*使用該指令的時候不能轉換,如下報錯,因為目前的spfile正在使用*/

    create spfile from pfile

    *

    ERROR at line 1:

    ORA-32002: cannot create SPFILE already being used by the instance

    SQL> create spfile = '/u01/app/oracle/spfileorcl.ora' from pfile;

    File created.

    SQL> ho cat /u01/app/oracle/spfileorcl.ora;

    a*orcl.__db_cache_size=251658240

   *.control_files='/u01/app/oracle/oradata/orcl/control01.ctl','/u01/app/oracle/oradata/orcl/control02.ctl','/u01/app/oracle/oradata/orcl/control03.ctl'

轉換後的使用:

    假定修改了initorcl.ora中的參數,但Oracle啟動是先讀取spfile ,故可以在啟動的時候指定用initorcl.ora來

    初始化參數,啟動完畢後,可以建立spfile,則下一次啟動就可以使用新的spfile.

    假定我們對initorcl.ora作如下修改:

    open_cursors=600

    processes=250

    則關閉資料庫後指定以initorcl.ora參數來啟動資料庫*/

    SQL> startup pfile = '/u01/app/oracle/10g/dbs/initorcl.ora';

    ORACLE instance started.

    Total System Global Area  406847488 bytes

    Fixed Size                  1219688 bytes

    Variable Size             150995864 bytes

    Database Buffers          251658240 bytes

    Redo Buffers                2973696 bytes

    Database mounted.

    Database opened.

    SQL> create spfile from pfile;          /*修改的内容将會更新到spfile*/

--檢視參數檔案的名字

    SQL> show parameter service_name

    NAME                                 TYPE        VALUE

    ------------------------------------ ----------- ------------------------------

    service_names                        string      orcl

--檢視目前使用的哪個參數檔案啟動的

    SQL> select distinct   isspecified   from v$spparameter;

    ISSPEC

    ------

    FALSE

    如果第一個值是FALSE還是TRUE,如果是FALSE,則是pfile,否則則是spfile.

    也可以嘗試修改spfile ,如果報錯則可以判斷是從pfile啟動,當然所修改的參數必須是可以修改的*/

    SQL> alter system set sga_target = 200m scope = spfile;

    alter system set sga_target = 200m scope = spfile

    ORA-32001: write to SPFILE requested but no SPFILE specified at startup

    --強制啟動Oracle後再檢視是使用的哪個參數啟動的。

    SQL> startup force

    SQL> select distinct isspecified from v$spparameter;

    TRUE

    第一行為TRUE可知,是從spfile啟動的,有兩行,其中第二行為FALSE,表示有兩個參數檔案,一個是spfile,一個是pfile

    再次嘗試看看能否修改spfile:  

    SQL> alter system set sga_target = 380m scope = spfile;

         /*修改成功*/

    System altered.

參數檔案的修改:

    如果是pfile ,直接使用vi,vim來修改即可

    如果是spfile ,則使用 

    alter system|session set parametername = values scope = memory | spfile |both

sid = 'sid' | ‘*’;

    scope

       memory : 隻對目前執行個體有效,下次啟動則失效

       spfile : 隻對spfile 修改,必須經過下一次啟動才生效,目前的執行個體沒有修改

       both :記憶體與參數檔案都将修改,當不指定scope時,預設為both.

    system | session

       system :

--  查詢視圖:v$parameter

             isses_modifiable  可以被alter session修改

             isssy_modifiable  可以被alter system修改       

--  sid:

       sid :隻對某一個執行個體

       *   :對所有的執行個體修改

    SQL> show parameter sga_  /*檢視與sga有關的參數*/

    sga_max_size                         big integer 388M

    sga_target                           big integer 388M

    SQL> alter system set sga_max_size = 350m;  /*特殊的參數不能被修改*/

    alter system set sga_max_size = 350m

                   *

    ORA-02095: specified initialization parameter cannot be modified

    SQL> a  scope = spfile

      1* alter system set sga_max_size = 350m scope = spfile

    SQL> /

    SQL> select instance_name from v$instance;

    INSTANCE_NAME

    ----------------

    orcl

    SQL> alter system set sga_max_size = 350m scope = spfile

sid = 'orcl';

    --隻改記憶體

    SQL> show parameter pga

    pga_aggregate_target                 big integer 129M

    SQL> alter system set pga_aggregate_target = 130m scope = memory;

--  同時修改記憶體和參數檔案,以下兩條語句等效

    SQL> alter system set pga_aggregate_target = 130m scope = both; 

    SQL> alter system set pga_aggregate_target = 130m ;

    --alter session

    SQL> show parameter sql_

    plsql_ccflags                        string

    plsql_code_type                      string      INTERPRETED

    plsql_compiler_flags                 string      INTERPRETED, NON_DEBUG

    plsql_debug                          boolean     FALSE

    plsql_native_library_dir             string

    plsql_native_library_subdir_count    integer     0

    plsql_optimize_level                 integer     2

    plsql_v2_compatibility               boolean     FALSE

    plsql_warnings                       string      DISABLE:ALL

    sql92_security                       boolean     FALSE

    sql_trace                            boolean     FALSE

    sql_version                          string      NATIVE

    sqltune_category                     string      DEFAULT

    SQL> alter session set sql_trace = true;

    Session altered.

--  可以從v$parameter視圖中來得到哪些可以使用alter system修改,哪些可以使用alter

session來修改。

    SQL> col name for a40

    SQL> select NAME,ISSES_MODIFIABLE,ISSYS_MODIFIABLE from v$parameter

      2  where name like 'sql%';

    NAME                                     ISSES ISSYS_MOD

    ---------------------------------------- ----- ---------

    sql_trace                                TRUE  IMMEDIATE

    sql92_security                           FALSE FALSE

    sql_version                              TRUE  FALSE

    sqltune_category                         TRUE  IMMEDIATE

--  TURE:可以該類型修改,FLASE:不支援該類型修改,IMMEDIATE:也是支援該類型修改

    SQL> alter system set sql_version = 8; /*不支援system類型修改*/

    alter system set sql_version = 8

    ORA-02096: specified initialization parameter is not modifiable with this option

    SQL> alter session set sql_version = 8;

    ERROR:

    ORA-00096: invalid value 8 for parameter sql_version, must

be from among MAX,

    NATIVE, 8.1.6, 8.1.5

    SQL> alter session set sql_version = '8.1.6'; /*支援session類型修改*/

    SQL> select distinct issys_modifiable from v$parameter;

    ISSYS_MOD

    ---------

    IMMEDIATE   /*動态參數,直接修改到記憶體的參數alter system set <> = <>,後面不需要跟scope*/

    FALSE       /*靜态參數,不能直接修改到記憶體,alter system set <> = <> scope = spfile*/

    DEFERRED    /*會話級别參數,直接通過alter session set <> = <>*/

    SQL> select distinct isses_modifiable from v$parameter;

    ISSES

    -----

--系統中的常用參數:

    SQL> ho ls /u01/app/oracle/10g/dbs/

    hc_orcl.dat  initdw.ora    lkORCL     spfileorcl.ora

    init.ora     initorcl.ora  orapworcl

    /*下面的參數描述了執行個體相關池的配置設定情況*/

    *.audit_file_dest='/u01/app/oracle/admin/orcl/adump' /*警告日志路徑*/

    *.background_dump_dest='/u01/app/oracle/admin/orcl/bdump' /*背景程序日志路徑*/

    *.compatible='10.2.0.1.0'  /*版本相容号*/

    /*下面是控制檔案的資訊*/

    *.core_dump_dest='/u01/app/oracle/admin/orcl/cdump' /*伺服器程序相關的日志路徑*/

    *.db_block_size=8192   /*記憶體塊的大小*/

    *.db_create_file_dest='/u01/app/oracle/oradata/orcl'  /*tablespace ,datafile路徑*/

    *.db_create_online_log_dest_1='/u01/app/oracle/disk1'  /*聯機日志檔案路徑*/

    *.db_create_online_log_dest_2='/u01/app/oracle/disk2'  /*聯機日志檔案路徑*/

    *.db_domain=''  /域名/

    *.db_file_multiblock_read_count=16  /*一次可讀取塊的大小:*8k

= 128kb*/

    *.db_name='orcl' /資料庫辨別符/

    *.db_recovery_file_dest='/u01/app/oracle/flash_recovery_area' /*閃回路徑*/

    *.db_recovery_file_dest_size=2147483648           /*閃回區可使用的大小GB*/

    *.dispatchers='(PROTOCOL=TCP) (SERVICE=orclXDB)'  /*共享伺服器的配置參數*/

    *.job_queue_processes=10                          /*目前作業程序數*/

    *.open_cursors=600                                /*可打開的遊标數*/

    *.pga_aggregate_target=135266304                  /*伺服器程序大小*/

    *.processes=250                                   /*描述目前可以運作的程序數*/

    *.remote_login_passwordfile='EXCLUSIVE'           /*遠端登陸是否要用密碼檔案*/

    *.sga_target=406847488                            /*定義了sga的大小*/

    *.undo_management='AUTO'                          /*Undo表空間的管理方式為自動管理*/

    *.undo_tablespace='UNDOTBS1'                      /*指定使用哪一個undo表空間*/

    *.user_dump_dest='/u01/app/oracle/admin/orcl/udump' /**/

--11g中的參數檔案:

--  隐藏參數:

    SQL> desc x$ksppi /*Name列中為隐藏參數的名字*/

     Name                                      Null?    Type

     ----------------------------------------- -------- ----------------------------

     ADDR                                               RAW(4)

     INDX                                               NUMBER

     INST_ID                                            NUMBER

     KSPPINM                                            VARCHAR2(80)

     KSPPITY                                            NUMBER

     KSPPDESC                                           VARCHAR2(255)

     KSPPIFLG                                           NUMBER

     KSPPILRMFLG                                        NUMBER

     KSPPIHASH                                          NUMBER

 --下面視圖中為隐藏參數的值

     SQL> desc x$ksppcv

     KSPPSTVL                                           VARCHAR2(512)

     KSPPSTDVL                                          VARCHAR2(512)

     KSPPSTDF                                           VARCHAR2(9)

     KSPPSTVF                                           NUMBER

     KSPPSTCMNT                                         VARCHAR2(255)

 --使用下面的指令來檢視系統中的隐藏參數;

     SQL> select ksppinm,ksppstvl from x$ksppi a,x$ksppcv

b where a.indx = b.indx;

     SQL> a      and ksppinm like '%_allow%';                                    

      1* select ksppinm,ksppstvl from x$ksppi a,x$ksppcv

b where a.indx = b.indx     and ksppinm like '%_allow%'

    KSPPINM                                                            KSPPSTVL

    ----------------------------------------                           ----------

    _allow_level_without_connect_by                                    FALSE

    _asm_allow_only_raw_disks                                          TRUE

    _asm_allow_resilver_corruption                                     FALSE

/*

參數的删除:

    對于pfile直接編輯删除即可

    對于spfile 例如使用alter system set pga_aggregate_target

reset将恢複到預設值 */

    pga_aggregate_target                 big integer 130M

    SQL> alter system reset pga_aggregate_target scope = spfile sid = '*';

--  修改會預設值後重新啟動可以看到該參數的值由M變為M

    SQL> show parameter pga;

    pga_aggregate_target                 big integer 76M