oracle 函数 只读,Oracle 只读表空间 说明

一.之前Blog的说明

之前的Blog里对Oracle 的只读表空间做了一些说明,链接如下:

假如存在一个只读的表空间,那么在重建控制文件之后,read-only的数据文件会重命名为MISSING00005的格式,最后是5位数字,这个数据根据file_id 对应。并且datafile 也会变成offline。

所以在重建控制文件之后,我们需要对只读文件的datafile 进行rename 操作,还原成原来的名称,并且修改其状态为online。具体操作示例有说明。

在重建控制文件之前需要留意datafile 的文件名称,如果有多个datafile,那么就需要注意其顺序。这个需要注意一下。

二.只读表空间

只读表空间可以用来处理过期化的数据,当然也可以使用之前提到的压缩或者进行转历史。

将表空间设为只读,可以带来如下好处:

2.1 减少数据库备份和恢复时间

对于只读表空间,只需要在第一备份时进行备份,在以后的备份中不需要在对备份过的只读表空间进行备份。

相关内容参考:

2.2 减少数据库启动和关闭的时间

在shutdown immediate 关闭数据库时,会将dirty data同步到磁盘上,即写入datafile。 因此这个操作可能会占用较多的时间。 同样在启动时也会有同步datafile的操作。

当表空间设置为只读后,在启动和关闭时就不会对只读表空间对应的数据文件进行处理。从而减少了数据库启动和关闭的时间。

2.3 防止对数据的误操作

只读表空间可以限制如下的操作:

Insert

Update

Delete

Truncate

Create

因为这些操作需要修改数据文件的block,而对于只读表空间上的表字段的修改,或者删除表和索引,都是不受限制,因为这些操作都是直接修改数据字典。

2.4 分区表的数据过期化处理

前提是的分区表的每个分区都在单独的表空间上,当对应分区过期后,可以直接将该分区对应的表空间设置为只读,那么对应分区的数据也就不能被修改,注意:这里仅仅是争对修改,我们还是可以进行DDL操作的。

三.只读表空间数据修改测试

--创建表空间dave:

SQL> select file_name fromdba_data_files;

FILE_NAME

--------------------------------------------------------------------------------

/u01/app/oracle/oradata/anqing/users01.dbfhttps://www.cndba.cn/Dave/article/1080

/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.dbfhttps://www.cndba.cn/Dave/article/1080

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

*https://www.cndba.cn/Dave/article/1080

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数据:

https://www.cndba.cn/Dave/article/1080

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 ithttps://www.cndba.cn/Dave/article/1080

但是我们可以对只读表空间上的对象做一些不涉及表空间的操作,只修改数据字典的操作是可以进行的。

--添加列:

SQL> alter table dave add col1varchar2(20);

--修改列:

SQL> alter table dave modify col1varchar2(200);

https://www.cndba.cn/Dave/article/1080

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

QQ:       tianlesoftware@gmail.com

版权声明:本文为博主原创文章,未经博主允许不得转载。

oracle 11g

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值