IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    通过update _NEXT_OBJECT 实现obj$.obj#和obj$.dataobj#跳号

    惜分飞发表于 2016-09-06 03:04:48
    love 0

    联系:手机(+86 13429648788) QQ(107644445)QQ咨询惜分飞

    标题:通过update _NEXT_OBJECT 实现obj$.obj#和obj$.dataobj#跳号

    作者:惜分飞©版权所有[未经本人同意,不得以任何形式转载,否则有进一步追究法律责任的权利.]

    在一些特殊的情况下(比如ORA-00600 [15267],ORA-00600 [KKDLCOB-OBJN-EXISTS],Ora-600 [15260]),考虑需要把dba_objects中的object_id往前推进,这里通过试验的方法实现该功能
    数据库版本信息

    SQL> select * from v$version;
    
    BANNER
    ----------------------------------------------------------------
    Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - Prod
    PL/SQL Release 10.2.0.4.0 - Production
    CORE    10.2.0.4.0      Production
    TNS for Linux: Version 10.2.0.4.0 - Production
    NLSRTL Version 10.2.0.4.0 - Production
    

    分析obj和dataobj

    SQL> select max(obj#),max(dataobj#) from obj$;
    
     MAX(OBJ#) MAX(DATAOBJ#)
    ---------- -------------
         51887         51907
    
    SQL> select name from obj$ where obj#=51887;
    
    NAME
    ------------------------------
    T_DUL
    
    SQL> select name from obj$ where dataobj#=51907;
    
    NAME
    ------------------------------
    _NEXT_OBJECT
    
    SQL> select object_id,data_object_id from dba_objects where object_name='_NEXT_OBJECT';
    
    no rows selected
    

    为什么dba_objects中无_NEXT_OBJECT
    因为dba_objects视图中跳过了_NEXT_OBJECT这条记录
    _next_object


    测试创建新表后obj和dataobj的变化

    SQL>  create table t_xff as select * from dual;
    
    Table created.
    
    SQL> select max(obj#),max(dataobj#) from obj$;
    
     MAX(OBJ#) MAX(DATAOBJ#)
    ---------- -------------
         51898         51907
    
    SQL> select name from obj$ where obj#=51898;
    
    NAME
    ------------------------------
    T_XFF
    
    SQL> select max(object_id),max(data_object_id) from dba_objects where object_name='T_XFF';
    
    MAX(OBJECT_ID) MAX(DATA_OBJECT_ID)
    -------------- -------------------
             51898               51898
    

    通过测试可以确定,obj发生增加,但是dataobj不一定增加(因为dataobj本身比obj大,如果出现obj>dataobj那属于异常情况)

    测试数据库重启obj和dataobj是否会跳号

    ---正常重启数据库
    SQL> SHUTDOWN IMMEDIATE;
    Database closed.
    Database dismounted.
    ORACLE instance shut down.
    SQL> STARTUP
    ORACLE instance started.
    
    Total System Global Area  260046848 bytes
    Fixed Size                  1266920 bytes
    Variable Size              83888920 bytes
    Database Buffers          171966464 bytes
    Redo Buffers                2924544 bytes
    Database mounted.
    Database opened.
    SQL> select max(obj#),max(dataobj#) from obj$;
    
     MAX(OBJ#) MAX(DATAOBJ#)
    ---------- -------------
         51898         51907
    
    ---强制重启数据库
    SQL> shutdown abort
    ORACLE instance shut down.
    SQL> startup
    ORACLE instance started.
    
    Total System Global Area  260046848 bytes
    Fixed Size                  1266920 bytes
    Variable Size              83888920 bytes
    Database Buffers          171966464 bytes
    Redo Buffers                2924544 bytes
    Database mounted.
    Database opened.
    SQL> select max(obj#),max(dataobj#) from obj$;
    
     MAX(OBJ#) MAX(DATAOBJ#)
    ---------- -------------
         51898         51907
    

    通过这个证明obj和dataobj没有因为数据库重启而发生改变

    实现obj跳号

    SQL> shutdown immediate;
    Database closed.
    Database dismounted.
    ORACLE instance shut down.
    SQL> startup restrict
    ORACLE instance started.
    
    Total System Global Area  260046848 bytes
    Fixed Size                  1266920 bytes
    Variable Size              83888920 bytes
    Database Buffers          171966464 bytes
    Redo Buffers                2924544 bytes
    Database mounted.
    Database opened.
    SQL>  update obj$ set dataobj#=1000000 where name='_NEXT_OBJECT';  
    
    1 row updated.
    
    SQL> commit;
    
    Commit complete.
    
    SQL> shutdown abort;
    ORACLE instance shut down.
    SQL> startup
    ORACLE instance started.
    
    Total System Global Area  260046848 bytes
    Fixed Size                  1266920 bytes
    Variable Size              83888920 bytes
    Database Buffers          171966464 bytes
    Redo Buffers                2924544 bytes
    Database mounted.
    Database opened.
    
    SQL> select max(obj#),max(dataobj#) from obj$;
    
     MAX(OBJ#) MAX(DATAOBJ#)
    ---------- -------------
         51898       1000000
    
    SQL> create table t_www_xifenfei_com as select * from dual;
    
    Table created.
    
    SQL> select max(obj#),max(dataobj#) from obj$;
    
     MAX(OBJ#) MAX(DATAOBJ#)
    ---------- -------------
       1000000       1000010
    
    SQL> select max(object_id),max(data_object_id) from dba_objects;
    
    MAX(OBJECT_ID) MAX(DATA_OBJECT_ID)
    -------------- -------------------
           1000000             1000000
    
    SQL> select object_name from dba_objects where object_id=1000000;
    
    OBJECT_NAME
    ----------------------------------------------------------------
    T_WWW_XIFENFEI_COM
    

    通过丢_NEXT_OBJECT的更新实现obj和dataobj跳号(变成100w)

    • 通过修改col$.col#改变列展示顺序
    • ORACLE用户重命名
    • dual 缺少同义词故障解决
    • 通过odu验证rman backup对于truncate对象备份处理
    • 通过bbed修改obj$中dataobj$重现I_OBJ4索引报ORA-08102错误
    • 正常关闭数据库sequence cache不为0 sequence不跳跃
    • 使用oradebug修改数据库scn
    • Oracle 11g丢失access$恢复方法
    • ORA-01052: required destination LOG_ARCHIVE_DUPLEX_DEST is not specified
    • 修改props$.NLS_CHARACTERSET导致ORA-00900异常恢复
    • ORACLE 12C varchar2支持32k长度字符串
    • 关于9I中sga_max_size参数描述


沪ICP备19023445号-2号
友情链接