准备
SQL> drop tablespace yang including contents;
表空间已丢弃。
SQL> create tablespace yang
2 logging
3 datafile 'd:\oracle\oradata\game\yang.ora' size 10m reuse
4 autoextend
5 on maxsize unlimited
6 extent management local
7 segment space management auto;
表空间已创建。
SQL> alter user yang default tablespace yang;
用户已更改。
SQL> conn yang/yang
已连接。
SQL> create table test as select * from dba_objects;
表已创建。
SQL> select count(*) from test;
COUNT(*)
----------
30025
1 表空间offline,无法访问表空间的表
SQL> conn /as sysdba
已连接。
SQL> alter tablespace yang offline;
表空间已更改。
SQL> select count(*) from test;
select count(*) from test
*
ERROR 位于第 1 行:
ORA-00376: 此时无法读取文件 15
ORA-01110: 数据文件 15: 'D:\ORACLE\ORADATA\GAME\YANG.ORA'
2 在某个transaction执行中offline表空间
step 1: 将表的容量加到20万
SQL> select count(*) from test;
COUNT(*)
----------
210175
step 2:test表执行大数据量的update
SQL> update test set object_name = upper(object_name);
step 3: 在update还没有结束时,offline该表所在的表空间
SQL> alter tablespace yang offline;
表空间已更改。
step 4: 此时update报错
update test set object_name = upper(object_name)
*
ERROR 位于第 1 行:
ORA-00376: 此时无法读取文件 15
ORA-01110: 数据文件 15: 'D:\ORACLE\ORADATA\GAME\YANG.ORA'
step 5: online表空间
SQL> alter tablespace yang online;
表空间已更改。
step 6: 查询test表发现数据并没有改变,
SQL> select object_name from test where rownum<5;
当offline tablespace时,如果存在active transaction在使用这个tablespace的数据,会保留旧的数据保留在回滚段上,这样在online时,会将对这部分数据rollback
3 表使用的数据所在的tablespace offline
step 1:创建索引到表空间yang2上
SQL> create index test_index on test(object_id) tablespace yang2;
索引已创建。
SQL> set autotrace on
SQL> select * from test where object_id =34099;
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT ptimizer=CHOOSE
1 0 TABLE ACCESS (BY INDEX ROWID) OF 'TEST'
2 1 INDEX (RANGE SCAN) OF 'TEST_INDEX' (NON-UNIQUE)
step2:offline tablespace yang2
SQL> alter tablespace yang2 offline;
表空间已更改。
step3:需要使用索引查询
SQL> select * from test where object_id =34099;
select * from test where object_id =34099
*
ERROR 位于第 1 行:
ORA-00376: 此时无法读取文件 16
ORA-01110: 数据文件 16: 'D:\ORACLE\ORADATA\GAME\YANG2.ORA'
本来认为如果将索引所在的表空间offline后,查询该表的数据就不走索引但能访问数据,但没想到会报错。而且试了9i和10g都是如此处理的
所以Concepts的某些翻译中的这句话是有问题的:
如果包含索引的表空间脱机,那么查询依旧可以访问表数据,因为对表数据的访问并不一定需要索引数据。来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/22111412/viewspace-619322/ ,如需转载,请注明出处,否则将追究法律责任。