[20190917]oracle参数deferred属性.txt

来源:这里教程网 时间:2026-03-03 14:12:43 作者:

[20190917]oracle参数deferred属性.txt --//以前测试要修改一些参数,如果发现不能修改,我一般选择写入spfile文件,重启测试文件。 --//或者写入initXXXX.ora文件,使用该参数文件启动数据库实例。 --//实际上有小量参数是具有deferred属性。这类参数对当前回话不生效,对以后登录的回话生效。 --//这类类型的参数不是很多,简单看看顺便做一个记录: 1.环境: SCOTT@test01p> @ ver1 PORT_STRING                    VERSION        BANNER                                                                               CON_ID ------------------------------ -------------- -------------------------------------------------------------------------------- ---------- IBMPC/WIN_NT64-9.1.0           12.2.0.1.0     Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production              0 2.测试: SYS@test> select name,DISPLAY_VALUE,ISSES_MODIFIABLE, ISSYS_MODIFIABLE from v$parameter where  ISSYS_MODIFIABLE='DEFERRED'; NAME                           DISPLAY_VALUE                  ISSES ISSYS_MOD ------------------------------ ------------------------------ ----- --------- backup_tape_io_slaves          FALSE                          FALSE DEFERRED recyclebin                     on                             TRUE  DEFERRED session_cached_cursors         50                             TRUE  DEFERRED audit_file_dest                D:\APP\ORACLE\ADMIN\TEST\ADUMP FALSE DEFERRED object_cache_optimal_size      10240000                       TRUE  DEFERRED object_cache_max_size_percent  10                             TRUE  DEFERRED sort_area_size                 65536                          TRUE  DEFERRED sort_area_retained_size        0                              TRUE  DEFERRED olap_page_pool_size            0                              TRUE  DEFERRED 9 rows selected. --//12cR2仅仅9个这样类型的参数(不包括隐含参数).可以发现一个参数session_cached_cursors参数设置其实不用重启数据库. --//其它应该很少修改. SYS@test> alter system set session_cached_cursors=100; alter system set session_cached_cursors=100                                           * ERROR at line 1: ORA-02096: specified initialization parameter is not modifiable with this option SYS@test> alter system set session_cached_cursors=100 scope=memory; alter system set session_cached_cursors=100 scope=memory                                             * ERROR at line 1: ORA-02096: specified initialization parameter is not modifiable with this option --//按照以前我如果要修改就修改spfile文件,然后等待时机重启数据库. SYS@test> alter system set session_cached_cursors=100 DEFERRED scope=memory; System altered. --//再重新登录 SYS@test> @ hide session_cached_cursors NAME                   DESCRIPTION                              DEFAULT_VALUE SESSION_VALUE SYSTEM_VALUE ---------------------- ---------------------------------------- ------------- ------------- ------------ session_cached_cursors Number of cursors to cache in a session. TRUE          100           100 3.修改我自己的脚本: $ cat hide.sql col name format a40 col description format a66 col session_value format a22 col default_value format a22 col system_value format a22 select    a.ksppinm  name,    a.ksppdesc DESCRIPTION,    b.ksppstdf DEFAULT_VALUE,    b.ksppstvl SESSION_VALUE,    c.ksppstvl SYSTEM_VALUE,    DECODE (BITAND (a.ksppiflg / 256, 1), 1, 'TRUE', 'FALSE')  ISSES_MODIFIABLE,    DECODE        (           BITAND (a.ksppiflg / 65536, 3)          ,1, 'IMMEDIATE'          ,2, 'DEFERRED'          ,3, 'IMMEDIATE'          ,'FALSE'        ) ISSYS_MODIFIABLE from x$ksppi a, x$ksppcv b, x$ksppsv c where a.indx = b.indx  and a.indx = c.indx  and lower(a.ksppinm) like lower('%&1%') order by 1; SYS@test> @ hide.txt session_cached_cursors NAME                   DESCRIPTION                              DEFAULT_VALUE SESSION_VALUE SYSTEM_VALUE ISSES ISSYS_MOD ---------------------- ---------------------------------------- ------------- ------------- ------------ ----- --------- session_cached_cursors Number of cursors to cache in a session. TRUE          100           100          TRUE  DEFERRED --//实际上对于参数session_cached_cursors,对于会话是可以修改的,.执行如下: SYS@test> alter session set session_cached_cursors=200 ; Session altered. 4.继续测试: --//再来看看open_cursor参数: SYS@test> @ hide open_cursor NAME                       DESCRIPTION                                   DEFAULT_VALUE SESSION_VALUE SYSTEM_VALUE ISSES ISSYS_MOD -------------------------- --------------------------------------------- ------------- ------------- ------------ ----- --------- _close_cached_open_cursors close cursors cached by PL/SQL at each commit TRUE          FALSE         FALSE        TRUE  FALSE open_cursors               max # cursors per session                     FALSE         300           300          FALSE IMMEDIATE --//可以发现ISSYS_MODIFIABLE=IMMEDIATE.按照道理立即生效而实际情况呢? --//下面一段测试ora-04031例子,先打开2个会话分别以scott,sys用户登录: --//session 1,scott用户登录: create table a1 ( id1 number,id2 number); --//session 2,sys用户登录: SYS@test01p> @ hide open_cursor NAME                       DESCRIPTION                                   DEFAULT_VALUE SESSION_VALUE SYSTEM_VALUE ISSES ISSYS_MOD -------------------------- --------------------------------------------- ------------- ------------- ------------ ----- --------- _close_cached_open_cursors close cursors cached by PL/SQL at each commit TRUE          FALSE         FALSE        TRUE  FALSE open_cursors               max # cursors per session                     FALSE         300           300          FALSE IMMEDIATE --//open_cursors=300. --//session 1: SCOTT@test01p> alter system set open_cursors=50000 scope=memory ; System altered. --//session 2: SYS@test01p> @ hide open_cursor NAME                       DESCRIPTION                                   DEFAULT_VALUE SESSION_VALUE SYSTEM_VALUE ISSES ISSYS_MOD -------------------------- --------------------------------------------- ------------- ------------- ------------ ----- --------- _close_cached_open_cursors close cursors cached by PL/SQL at each commit TRUE          FALSE         FALSE        TRUE  FALSE open_cursors               max # cursors per session                     FALSE         50000         50000        FALSE IMMEDIATE --//你可以发现open_cursors无论是session还是system,都是50000. --//session 1: --//不要退出执行如下脚本 $ cat sharepool/shp7 declare msql varchar2(500); mcur number; mstat number; begin     for i in 1 .. 49000 loop         mcur := dbms_sql.open_cursor;         msql := 'select id1 from a1 where id2='||to_char(i);         dbms_sql.parse(mcur,msql,dbms_sql.native); --      mstat := dbms_sql.execute(mcur);     end loop; end; / --//注解那行不用执行。 --//测试例子是打开光标并分析,由于没有使用绑定变量,并且光标没有正常关闭,大量消耗共享池. SCOTT@test01p> @ sharepool/shp7 declare * ERROR at line 1: ORA-01000: maximum open cursors exceeded ORA-06512: at "SYS.DBMS_SQL", line 1134 ORA-06512: at line 9 --//如果不退出执行,出现ORA-01000: maximum open cursors exceeded.很明显光标数量不足也就是当前open_cursors=300. --//如果退出再次执行,就会消耗大量共享池,出现ora-04031错误。 SCOTT@test01p> @ sharepool/shp7 declare * ERROR at line 1: ORA-04031: unable to allocate 256 bytes of shared memory ("shared pool","select name,online$,contents...","SQLA^56d22d85","qeeRwo: qeeCreateRwo") ORA-06512: at "SYS.DBMS_SQL", line 1134 ORA-06512: at line 9 总结: --//实际上想通过一些简单的例子说明就是简简单单的参数设置,oracle有时候都能人搞晕.在看看那些隐含参数是具有DEFERRED特性的. /* Formatted on 2019/9/17 21:48:38 (QP5 v5.227.12220.39754) */ SELECT *   FROM (SELECT a.ksppinm name               ,a.ksppdesc DESCRIPTION               ,b.ksppstdf DEFAULT_VALUE               ,b.ksppstvl SESSION_VALUE               ,c.ksppstvl SYSTEM_VALUE               ,DECODE (BITAND (a.ksppiflg / 256, 1), 1, 'TRUE', 'FALSE')                   ISSES_MODIFIABLE               ,DECODE                (                   BITAND (a.ksppiflg / 65536, 3)                  ,1, 'IMMEDIATE'                  ,2, 'DEFERRED'                  ,3, 'IMMEDIATE'                  ,'FALSE'                )                   ISSYS_MODIFIABLE           FROM x$ksppi a, x$ksppcv b, x$ksppsv c          WHERE a.indx = b.indx AND a.indx = c.indx)  WHERE ISSYS_MODIFIABLE = 'DEFERRED'; --//输出太长,不在贴出. SELECT count(*)   FROM (SELECT a.ksppinm name               ,a.ksppdesc DESCRIPTION               ,b.ksppstdf DEFAULT_VALUE               ,b.ksppstvl SESSION_VALUE               ,c.ksppstvl SYSTEM_VALUE               ,DECODE (BITAND (a.ksppiflg / 256, 1), 1, 'TRUE', 'FALSE')                   ISSES_MODIFIABLE               ,DECODE                (                   BITAND (a.ksppiflg / 65536, 3)                  ,1, 'IMMEDIATE'                  ,2, 'DEFERRED'                  ,3, 'IMMEDIATE'                  ,'FALSE'                )                   ISSYS_MODIFIABLE           FROM x$ksppi a, x$ksppcv b, x$ksppsv c          WHERE a.indx = b.indx AND a.indx = c.indx)  WHERE ISSYS_MODIFIABLE = 'DEFERRED';   COUNT(*) ----------        124 --//可以发现许多隐含参数具有这个特性的.

相关推荐