在演示事務的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.
致使這個問題的根本緣由是上面加黑的那句話。