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.
致使這個問題的根本緣由是上面加黑的那句話。
相關文章
相關標籤/搜索