分区表的可用性:
创建一个分区表:
CREATE TABLE employee
( empno int,
ename varchar2(20)
)
PARTITION BY HASH (empno)
( partition part_1 tablespace TBS_DAIMIN,
partition part_2 tablespace USERS
)
SQL> insert into employee select empno, ename from scott.emp
2 ;
14 rows created.
commit;
SQL> select * from employee partition(part_1);
EMPNO ENAME
---------- --------------------
7369 SMITH
7499 ALLEN
7654 MARTIN
7698 BLAKE
7782 CLARK
7839 KING
7876 ADAMS
7934 MILLER
8 rows selected.
SQL> select * from employee partition(part_2);
EMPNO ENAME
---------- --------------------
7521 WARD
7566 JONES
7788 SCOTT
7844 TURNER
7900 JAMES
7902 FORD
6 rows selected.
假如将该表的一个分区offline之后,出现下面的错误:
SQL> alter tablespace TBS_DAIMIN offline;
SQL> select * from employee;
select * from employee
*
ERROR at line 1:
ORA-00376: file 12 cannot be read at this time
ORA-01110: data file 12: '/opt/ora9/product/9.2/dbs/tbs_daimin02.dat'
原因:
主要是因为该表的一个分区已经offline,而 select * from employee是访问整个表的信息,这样必然需要访问表的所有分区,当访问到已经offline的时候,则会报错;
但是如果是试图访问联机的分区的数据,则可以成功;如下:
SQL> variable n number
exec :n :=SQL> 7521
PL/SQL procedure successfully completed.
SQL> select * from employee where empno = :n
2 ;
EMPNO ENAME
---------- --------------------
7521 WARD
但是这样分区有个好处就是放一张分区表出现故障时,可以通过分析确认是表的哪个分区出现故障,然后将出现故障的分区通过优化器从方案中排除对该分区的数据查询,可以减少故障时间。
比方说:
有一个100GB的表,并且这个表被分成50个2GB的分区,可以更快的从系统错误中恢复过来。如果有一个2GB的分区受损,则恢复时间则就恢复一个2GB分区所花费的时间,而不是恢复一个100GB的表所花费的时间
可用性得到了提高:
1、分区可以用优化器来排除,使得一个分区的破坏不会对用户产生很大的影响,最多就是查询不到受损分区的数据;
2、分区受损,只需要恢复该受损分区及可,这样减少了系统故障时间