Oralce Partition备份恢复实验

教程发布:风哥 教程分类:ITPUX技术网 更新日期:2022-02-12 浏览学习:538

作者:

1 实验目的
在备份数据量巨大的数据库时,为了加快数据备份、业务恢复速度,在备份实施过程中,会把不再需要更改的数据表空间设置为read only状态,全库备份时跳过这些表空间,灾难恢复时暂不恢复这些表空间,以加快业务恢复速度。
本次实验目的是测试这种备份恢复方式对分区表和分区索引的影响。
[@more@]2 准备实验环境
数据库版本: Oracle9.2.0.8
2.1 创建表空间
1. 数据库表空间
create tablespace tbs_data01 datafile 'E:oracleoradataora92tbs_data01.dbf' size 10m;
create tablespace tbs_data02 datafile 'E:oracleoradataora92tbs_data02.dbf' size 10m;
create tablespace tbs_data03 datafile 'E:oracleoradataora92tbs_data03.dbf' size 10m;
2. 索引表空间
create tablespace tbs_idx01 datafile 'E:oracleoradataora92tbs_idx01.dbf' size 10m;
create tablespace tbs_idx02 datafile 'E:oracleoradataora92tbs_idx02.dbf' size 10m;
create tablespace tbs_idx03 datafile 'E:oracleoradataora92tbs_idx03.dbf' size 10m;
2.2 创建分区表
CREATE TABLE T_app_MID
(
XH NUMBER(20) NOT NULL primary key,
GS_RQ DATE NOT NULL,
FS_RQ DATE NOT NULL
)
tablespace tbs_data01
PARTITION BY RANGE (GS_RQ)
(
PARTITION Y2009 VALUES LESS THAN (TO_DATE('2010-01-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS'))
TABLESPACE tbs_data01,
PARTITION Y2010 VALUES LESS THAN (TO_DATE('2011-01-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS'))
TABLESPACE tbs_data02,
PARTITION Y_NEW VALUES LESS THAN (MAXVALUE)
TABLESPACE tbs_data03
);
2.3 创建分区索引
2.3.1 在主键上创建全局索引
ALTER TABLE T_app_MID ADD
PRIMARY KEY
(XH)
USING INDEX
TABLESPACE TBS_DATA;
2.3.2 在分区字段创建local类型索引
CREATE INDEX I_app_HSJG_GSRQ_MID ON T_app_MID
(GS_RQ)
LOCAL (
PARTITION Y2009
TABLESPACE tbs_idx01,
PARTITION Y2010
TABLESPACE tbs_idx02,
PARTITION Y_NEW
TABLESPACE tbs_idx03
);
2.3.3 在非分区字段创建local类型索引
CREATE INDEX I_app_HSJG_FSRQ_MID ON T_app_MID
(FS_RQ)
LOCAL (
PARTITION Y2009
TABLESPACE tbs_idx01,
PARTITION Y2010
TABLESPACE tbs_idx02,
PARTITION Y_NEW
TABLESPACE tbs_idx03
);
2.4 插入实验数据
insert into T_app_MID values (1,to_date('2009-10-01','yyyy-mm-dd'),to_date('2009-10-01','yyyy-mm-dd'));
insert into T_app_MID values (2,to_date('2010-10-01','yyyy-mm-dd'),to_date('2010-10-01','yyyy-mm-dd'));
insert into T_app_MID values (3,to_date('2011-10-01','yyyy-mm-dd'),to_date('2011-10-01','yyyy-mm-dd'));
SQL> select count(*) from t_app_mid partition (Y2009) t;
COUNT(*)
----------
1
SQL> select count(*) from t_app_mid partition (Y2010) t;
COUNT(*)
----------
1
SQL> select count(*) from t_app_mid partition (Y_NEW) t;
COUNT(*)
----------
1
2.5 表空间设置为read only
把Y2009分区的数据表空间和索引表空间设置为read only
SQL> alter tablespace tbs_idx01 read only;
SQL> alter tablespace tbs_data01 read only;
2.6 数据库RMAN备份
RMAN全库备份
RMAN> backup database format 'e:oracleora92df_%d_%t_%U' tag db_full;
3 模拟故障并按表空间恢复数据库
3.1 模拟故障
把Y2009分区所在的数据文件改名:
TBS_DATA01.DBF 改名为 TBS_DATA01.DBF1
TBS_IDX01.DBF改名为 TBS_IDX01.DBF1
3.2 按表空间恢复数据库
RMAN> startup mount;
RMAN> restore tablespace EXAMPLE;
RMAN> restore tablespace INDX;
RMAN> restore tablespace SYSTEM;
RMAN> restore tablespace TBS_DATA02;
RMAN> restore tablespace TBS_DATA03;
RMAN> restore tablespace TBS_IDX02;
RMAN> restore tablespace TBS_IDX03;
RMAN> restore tablespace TOOLS;
RMAN> restore tablespace UNDOTBS1;
RMAN> restore tablespace USERS;
RMAN> recover tablespace EXAMPLE;
RMAN> recover tablespace INDX;
RMAN> recover tablespace SYSTEM;
RMAN> recover tablespace TBS_DATA02;
RMAN> recover tablespace TBS_DATA03;
RMAN> recover tablespace TBS_IDX02;
RMAN> recover tablespace TBS_IDX03;
RMAN> recover tablespace TOOLS;
RMAN> recover tablespace UNDOTBS1;
RMAN> recover tablespace USERS;
SQL> alter database datafile 'E:oracleoradataora92tbs_idx01.dbf' offline;
SQL> alter database datafile 'E:oracleoradataora92tbs_data01.dbf' offline;
SQL> alter database open;
注:暂不恢复表空间TBS_DATA01和TBS_IDX01
4 实验结果
4.1 数据范围涉及已损坏分区(Y2009)的操作都会出错
SQL> select * from t_app_mid;
select * from t_app_mid
*
ERROR 位于第 1 行:
ORA-00376: 此时无法读取文件 7
ORA-01110: 数据文件 7: 'E:oracleoradataora92TBS_DATA01.DBF'

SQL> select count(*) from t_app_mid partition (Y2009) t;
select count(*) from t_app_mid partition (Y2009) t
*
ERROR 位于第 1 行:
ORA-00376: 此时无法读取文件 10
ORA-01110: 数据文件 10: 'E:oracleoradataora92TBS_IDX01.DBF'

SQL> select count(*) from t_app_mid where gs_rq < to_date('2010-01-01','yyyy-mm-dd'); select count(*) from t_app_mid where gs_rq < to_date('2010-01-01','yyyy-mm-dd') * ERROR 位于第 1 行: ORA-00376: 此时无法读取文件 10 ORA-01110: 数据文件 10: 'E:oracleoradataora92TBS_IDX01.DBF' 4.2 数据范围不涉及已损坏分区的操作 4.2.1 用全局索引字段作为where条件查询 用全局索引字段(xh)作为where查询未损坏分区数据时操作正常。 SQL> select * from t_app_mid where xh>1;
XH GS_RQ FS_RQ
---------- ---------- ----------
2 01-10月-10 01-10月-10
3 01-10月-11 01-10月-11

Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=10 Card=417 Bytes=12
927)
1 0 TABLE ACCESS (BY GLOBAL INDEX ROWID) OF 'T_app_MID' (Co
st=10 Card=417 Bytes=12927)
2 1 INDEX (RANGE SCAN) OF 'SYS_C001659' (UNIQUE) (Cost=2 Car
d=75)

4.2.2 用分区字段作为where条件查询
用分区字段(gs_rq)作为where条件查询未损坏分区数据时操作正常。
SQL> select count(*) from t_app_mid where gs_rq > to_date('2010-01-01','yyyy-mm-dd');
COUNT(*)
----------
2
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=1 Card=1 Bytes=9)
1 0 SORT (AGGREGATE)
2 1 PARTITION RANGE (ITERATOR)
3 2 INDEX (RANGE SCAN) OF 'I_app_HSJG_GSRQ_MID' (NON-UN
IQUE) (Cost=2 Card=8 Bytes=72)

SQL> select * from t_app_mid where gs_rq > to_date('2010-01-01','yyyy-mm-dd');
XH GS_RQ FS_RQ
---------- ---------- ----------
2 01-10月-10 01-10月-10
3 01-10月-11 01-10月-11
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=1 Card=8 Bytes=248)
1 0 PARTITION RANGE (ITERATOR)
2 1 TABLE ACCESS (BY LOCAL INDEX ROWID) OF 'T_app_MID' (C
ost=1 Card=8 Bytes=248)
3 2 INDEX (RANGE SCAN) OF 'I_app_HSJG_GSRQ_MID' (NON-UN
IQUE) (Cost=2 Card=1)
4.3 用非分区字段作为where条件查询
用非分区字段(fs_rq)作为where条件查询未损坏分区数据时操作出错。
SQL> select count(*) from t_app_mid where fs_rq > to_date('2010-01-01','yyyy-mm-dd');
select count(*) from t_app_mid where fs_rq > to_date('2010-01-01','yyyy-mm-dd')
*
ERROR 位于第 1 行:
ORA-00376: 此时无法读取文件 10
ORA-01110: 数据文件 10: 'E:oracleoradataora92TBS_IDX01.DBF'

5 总结
1). 分区表和分区索引都可以基于表空间做RMAN恢复
2). 对于全局型索引,只要查询范围未涉及已损坏分区,则可以利用该索引检索数据。
3). 对于分区字段的local型分区索引,只要查询范围未涉及已损坏分区,则可以利用该索引检索数据。
4). 对于非分区字段的local型分区索引,必须要把该索引上所有的分区表空间恢复后,才能利用该索引检索数据。
附:split分区操作例子
alter table t_app split partition y_new at (TO_DATE('2012-01-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS')) into (partition y2011 tablespace ts_y2011_kt_data,partition y_new);

本文标签:
网站声明:本文由风哥整理发布,转载请保留此段声明,本站所有内容将不对其使用后果做任何承诺,请读者谨慎使用!
【上一篇】
【下一篇】