• ORA-08176 错误的一个案例


    在演示事务的read only mode 的时候,因为一个错误有了这个意外的收获。场景是这样的:
    在session 1 中执行了如下的语句。
    SQL> set transaction read only;
    Transaction set.
    SQL> select count(*) from employees;
      COUNT(*)
    ----------
           107
    在session 2 中执行如下的语句。
    SQL>  insert into employees
      2  (employee_id, last_name, email,
      3  hire_date, job_id) values (210,
      4  'Hintz', 'JHINTZ', SYSDATE,
      5  'SH_CLERK');
     insert into employees
    *
    ERROR at line 1:
    ORA-01502: 索引 'HR.EMP_EMAIL_UK' 或这类索引的分区处于不可用状态
    嗯,这是因为以前我把这个索引的状态alter 成unusable了,好吧,我们rebulid。
    SQL> alter index emp_email_uk rebuild;
    Index altered.
    SQL>  insert into employees
      2  (employee_id, last_name, email,
      3  hire_date, job_id) values (210,
      4  'Hintz', 'JHINTZ', SYSDATE,
      5  'SH_CLERK');
    1 row created.
    SQL> commit;
    Commit complete.
    现在貌似一切很正常,返回到session 1 中执行如下的语句。
    SQL> select count(*) from employees;
    select count(*) from employees
                         *
    ERROR at line 1:
    ORA-08176: 一致读取失败; 回退数据不可用
    正常情况下,不应该啊,查看下undo 的保留时间,900s 足够了。也不可能
    是undo tablespace 的空间不够,因为我的实验系统中每秒的事务量几乎为零。
    就算空间不够也应该报“snapshot too old”的错。
    SQL> show parameter undo
    NAME                                 TYPE                   VALUE
    ------------------------------------ ---------------------- ---------
    undo_management                      string                 AUTO
    undo_retention                       integer                900
    undo_tablespace                      string                 UNDOTBS1
    不由的让人想到上面的alter index 的语句。我们试着重现错误。
    在session 1 中执行如下的语句.
    SQL> set transaction read only;
    Transaction set.
    SQL> select count(*) from employees;
      COUNT(*)
    ----------
           107
    在session 2 中执行如下的语句。
    SQL> alter index emp_email_uk unusable;
    Index altered.
    SQL>  INSERT INTO employees
      2  (employee_id, last_name, email,
      3  hire_date, job_id) VALUES (210,
      4  'Hintz', 'JHINTZ', SYSDATE,
      5  'SH_CLERK');
     INSERT INTO employees
    *
    ERROR at line 1:
    ORA-01502: 索引 'HR.EMP_EMAIL_UK' 或这类索引的分区处于不可用状态
    SQL> alter index emp_email_uk rebuild;
    Index altered.
    返回到session 1 中执行如下的语句。
    SQL> select count(*) from employees;
    select count(*) from employees
                         *
    ERROR at line 1:
    ORA-08176: 一致读取失败; 回退数据不可用
    --至此错误重现了。
    通过重现错误,我们已经知道症结所在的,所以以后我们需要避免这种情况的发生。对这个ORA-08176 错误也有了更多的认识。最后我们来看看这个错误代码的信息:
    ORA-08176: cannot continue consistent read for the table/index - no undo
    records
    Cause: Oracle encountered an operation that does not generate undo records.
    For example, the operation might have been an attempt to create an index by
    performing a direct load or executing a discrete mode transaction.
    导致这个问题的根本原因是上面加黑的那句话。
  • 相关阅读:
    [iOS]一行代码集成空白页面占位图(基于runtime+MJRefresh思想)
    怎么去掉Xcode工程中的某种类型的警告 Implicit conversion loses integer precision: 'NSInteger' (aka 'long') to 'int32
    iOS悬浮窗口(无论界面跳转、View始终在视图上显示,可移动)
    开发工程中遇到的BUG
    iOS基于B站的IJKPlayer框架的流媒体探究
    iOS 快速集成ijkplayer视频直播与录播框架
    每日英语:Air Pollution From Coal Use Cuts Lifespans in China, Study Shows
    每日英语:Do Successful People Need Sleep?
    每日英语:Risk-Averse Culture Infects U.S. Workers, Entrepreneurs
    每日英语:How to find the career of your dreams
  • 原文地址:https://www.cnblogs.com/zhjh256/p/10772261.html
Copyright © 2020-2023  润新知