之前的Blog里对Oracle 的只读表空间做了一些说明,链接如下:
Oracle 表空间创建参数 说明
http://blog.csdn.net/tianlesoftware/article/details/6166928
Oracle 表空间基本操作
http://blog.csdn.net/tianlesoftware/article/details/4681973
Oracle 重建控制文件 对 只读表空间 和 临时表空间 影响 测试
http://blog.csdn.net/tianlesoftware/article/details/7231680
假如存在一个只读的表空间,那么在重建控制文件之后,read-only的数据文件会重命名为MISSING00005的格式,最后是5位数字,这个数据根据file_id 对应。并且datafile 也会变成offline。
所以在重建控制文件之后,我们需要对只读文件的datafile 进行rename 操作,还原成原来的名称,并且修改其状态为online。具体操作示例有说明。
在重建控制文件之前需要留意datafile 的文件名称,如果有多个datafile,那么就需要注意其顺序。这个需要注意一下。
只读表空间可以用来处理过期化的数据,当然也可以使用之前提到的压缩或者进行转历史。
Oracle数据压缩(Compression) 技术 说明
http://blog.csdn.net/tianlesoftware/article/details/8170488
将表空间设为只读,可以带来如下好处:
对于只读表空间,只需要在第一备份时进行备份,在以后的备份中不需要在对备份过的只读表空间进行备份。
相关内容参考:
RMAN 系列(四) ---- RMAN 备份
http://blog.csdn.net/tianlesoftware/article/details/5687938
Oracle 块修改跟踪 (Block Change Tracking) 说明
http://blog.csdn.net/tianlesoftware/article/details/6997647
在shutdown immediate 关闭数据库时,会将dirty data同步到磁盘上,即写入datafile。 因此这个操作可能会占用较多的时间。 同样在启动时也会有同步datafile的操作。
当表空间设置为只读后,在启动和关闭时就不会对只读表空间对应的数据文件进行处理。从而减少了数据库启动和关闭的时间。
只读表空间可以限制如下的操作:
Insert
Update
Delete
Truncate
Create
因为这些操作需要修改数据文件的block,而对于只读表空间上的表字段的修改,或者删除表和索引,都是不受限制,因为这些操作都是直接修改数据字典。
前提是的分区表的每个分区都在单独的表空间上,当对应分区过期后,可以直接将该分区对应的表空间设置为只读,那么对应分区的数据也就不能被修改,注意:这里仅仅是争对修改,我们还是可以进行DDL操作的。
--创建表空间dave:
SQL> select file_name fromdba_data_files;
FILE_NAME
--------------------------------------------------------------------------------
/u01/app/oracle/oradata/anqing/users01.dbf
/u01/app/oracle/oradata/anqing/undotbs01.dbf
/u01/app/oracle/oradata/anqing/sysaux01.dbf
/u01/app/oracle/oradata/anqing/system01.dbf
/u01/app/oracle/oradata/anqing/example01.dbf
SQL> create tablespace dave file'/u01/app/oracle/oradata/anqing/dave01.dbf' size 100M autuextend off;
create tablespace dave file'/u01/app/oracle/oradata/anqing/dave01.dbf' size 100M autuextend off
*
ERROR at line 1:
ORA-02180: invalid option for CREATETABLESPACE
SQL> c/file/datafile/
1*create tablespace dave datafile '/u01/app/oracle/oradata/anqing/dave01.dbf'size 100M autuextend off
SQL> c/autuextend/autoextend/
1*create tablespace dave datafile '/u01/app/oracle/oradata/anqing/dave01.dbf'size 100M autoextend off
SQL> /
Tablespace created.
SQL> set lin 160
SQL> col tablespace_name for a15
SQL> col file_name for a50
SQL> select tablespace_name,file_namefrom dba_data_files;
TABLESPACE_NAME FILE_NAME
-----------------------------------------------------------------
DAVE /u01/app/oracle/oradata/anqing/dave01.dbf
USERS /u01/app/oracle/oradata/anqing/users01.dbf
UNDOTBS1 /u01/app/oracle/oradata/anqing/undotbs01.dbf
SYSAUX /u01/app/oracle/oradata/anqing/sysaux01.dbf
SYSTEM /u01/app/oracle/oradata/anqing/system01.dbf
EXAMPLE /u01/app/oracle/oradata/anqing/example01.dbf
6 rows selected.
--创建表
SQL> create table dave tablespace daveas select * from dba_objects;
Table created.
--创建索引:
SQL> create index idx_dave_id ondave(object_id);
Index created.
--表空间dave 设置为只读:
SQL> alter tablespace dave read only;
Tablespace altered.
--删除表dave上的数据:
SQL> delete from dave;
delete from dave
*
ERROR at line 1:
ORA-00372: file 6 cannot be modified atthis time
ORA-01110: data file 6:'/u01/app/oracle/oradata/anqing/dave01.dbf'
--因为表空间是只读的,所以无法删除。
--update 表dave:
SQL> update dave set object_id=1 whererownum=1;
update dave set object_id=1 where rownum=1
*
ERROR at line 1:
ORA-00372: file 6 cannot be modified atthis time
ORA-01110: data file 6:'/u01/app/oracle/oradata/anqing/dave01.dbf'
--无法update
--insert 数据:
SQL> insert into dave select * fromdba_objects;
insert into dave select * from dba_objects
*
ERROR at line 1:
ORA-00372: file 6 cannot be modified atthis time
ORA-01110: data file 6:'/u01/app/oracle/oradata/anqing/dave01.dbf'
--无法truncate:
SQL> truncate table dave;
truncate table dave
*
ERROR at line 1:
ORA-00372: file 6 cannot be modified atthis time
ORA-01110: data file 6:'/u01/app/oracle/oradata/anqing/dave01.dbf'
--同样,在只读表空间也无法进行create table 操作,因为无法分配空间:
SQL> create table dave2 tablespace daveas select * from dba_objects;
create table dave2 tablespace dave asselect * from dba_objects
*
ERROR at line 1:
ORA-01647: tablespace 'DAVE' is read-only, cannotallocate space in it
但是我们可以对只读表空间上的对象做一些不涉及表空间的操作,只修改数据字典的操作是可以进行的。
--添加列:
SQL> alter table dave add col1varchar2(20);
Table altered.
--修改列:
SQL> alter table dave modify col1varchar2(200);
Table altered.
--删除列:
SQL> alter table dave drop column col1;
alter table dave drop column col1
*
ERROR at line 1:
ORA-12988: cannot drop column from tableowned by SYS
--注意这里的提示是不能删除SYS用户对象的列。 其实即使换成其他用户,也是不能删除。这里就不在测试了。
--drop 索引和表:
SQL> drop index idx_dave_id;
Index dropped.
SQL> drop table dave;
Table dropped.
由此,对于只读表空间上的对象,我们仅仅是不能进行修改,但是我们还是可以进行drop,添加修改列等操作。 因为这些操作不涉及表空间的操作,仅仅是对Oracle 数据字典的修改。
---------------------------------------------------------------------------------------
Skype: tianlesoftware
Email: [email protected]
Blog: http://blog.csdn.net/tianlesoftware
Weibo: http://weibo.com/tianlesoftware
Twitter: http://twitter.com/tianlesoftware
Facebook: http://www.facebook.com/tianlesoftware
Linkedin: http://cn.linkedin.com/in/tianlesoftware