ITPub博客

首页 > 数据库 > Oracle > 只读表空间

只读表空间

原创 Oracle 作者:goasktom 时间:2014-05-23 21:24:54 0 删除 编辑

一.只读表空间和SCN的关系

--执行完检查点后,创建两个表空间,分记录下创建时的SCN

A>alter system checkpoint;

System altered.

A>select NAME,FILE#,CHECKPOINT_CHANGE# from v$datafile;

NAME                                                    FILE# CHECKPOINT_CHANGE#
-------------------------------------------------- ---------- ------------------
+FRA/orcl/datafile/system.256.847546913                     1             779052
+FRA/orcl/datafile/sysaux.257.847546983                     2             779052
+FRA/orcl/datafile/undotbs1.258.847547051                   3             779052
+FRA/orcl/datafile/users.260.848268619                      4             779052
+FRA/orcl/datafile/test.261.848268689                       5             779052

A>set time on
20:24:35 A>create tablespace readonly datafile size 4m;

Tablespace created.

20:25:40 A>create tablespace readwrite datafile size 4m;

Tablespace created.

20:25:48 A>select NAME,FILE#,CHECKPOINT_CHANGE# from v$datafile;

NAME                                                    FILE# CHECKPOINT_CHANGE#
-------------------------------------------------- ---------- ------------------
+FRA/orcl/datafile/system.256.847546913                     1             779052
+FRA/orcl/datafile/sysaux.257.847546983                     2             779052
+FRA/orcl/datafile/undotbs1.258.847547051                   3             779052
+FRA/orcl/datafile/users.260.848268619                      4             779052
+FRA/orcl/datafile/test.261.848268689                       5             779052
+FRA/orcl/datafile/readonly.262.848348705                   6             779090
+FRA/orcl/datafile/readwrite.264.848348743                  7             779377

7 rows selected.

SCN是与时间有关的单调递增函数,反映在这里就是,readonly表空间的SCN小于readwrite表空间的SCN,因为readonly创建在前


--将readonly表空间设为只读,并记录下相应的SCN——可以看出,SCN就是表示某种操作开始或完成时那一刻的时间,只不过不是用时分秒的形式而已

20:28:07 SYS>alter tablespace readonly read only;

Tablespace altered.

20:28:13 SYS>select NAME,FILE#,CHECKPOINT_CHANGE# from v$datafile;

NAME                                                    FILE# CHECKPOINT_CHANGE#
-------------------------------------------------- ---------- ------------------
+FRA/orcl/datafile/system.256.847546913                     1             779052
+FRA/orcl/datafile/sysaux.257.847546983                     2             779052
+FRA/orcl/datafile/undotbs1.258.847547051                   3             779052
+FRA/orcl/datafile/users.260.848268619                      4             779052
+FRA/orcl/datafile/test.261.848268689                       5             779052
+FRA/orcl/datafile/readonly.262.848348705                   6             779696     //readonly表空间设为只读那一刻的SCN,此后将保持不变
+FRA/orcl/datafile/readwrite.264.848348743                  7             779377

7 rows selected.

A>select TABLESPACE_NAME,STATUS from dba_tablespaces;

TABLESPACE_NAME                STATUS
------------------------------ ---------
SYSTEM                         ONLINE
SYSAUX                         ONLINE
UNDOTBS1                       ONLINE
TEMP                           ONLINE
USERS                          ONLINE
TEST                           ONLINE
READONLY                       READ ONLY
READWRITE                      ONLINE

8 rows selected.

--再来一次检查点,发现只有readonly表空间没动(块发生变化了,SCN才变,只读块不可能变,所以SCN也保持不变)

SYS>alter system checkpoint;

System altered.

SYS>select NAME,FILE#,CHECKPOINT_CHANGE# from v$datafile;

NAME                                                    FILE# CHECKPOINT_CHANGE#
-------------------------------------------------- ---------- ------------------
+FRA/orcl/datafile/system.256.847546913                     1             779784
+FRA/orcl/datafile/sysaux.257.847546983                     2             779784
+FRA/orcl/datafile/undotbs1.258.847547051                   3             779784
+FRA/orcl/datafile/users.260.848268619                      4             779784
+FRA/orcl/datafile/test.261.848268689                       5             779784
+FRA/orcl/datafile/readonly.262.848348705                   6             779696
+FRA/orcl/datafile/readwrite.264.848348743                  7             779784

7 rows selected.

--分别将两个表空间置为离线,观察SCN的变化,发现readwrite表空间变了,readonly仍然没变

SYS>alter tablespace readonly offline;

Tablespace altered.

SYS>select NAME,FILE#,CHECKPOINT_CHANGE# from v$datafile;

NAME                                                    FILE# CHECKPOINT_CHANGE#
-------------------------------------------------- ---------- ------------------
+FRA/orcl/datafile/system.256.847546913                     1             779784
+FRA/orcl/datafile/sysaux.257.847546983                     2             779784
+FRA/orcl/datafile/undotbs1.258.847547051                   3             779784
+FRA/orcl/datafile/users.260.848268619                      4             779784
+FRA/orcl/datafile/test.261.848268689                       5             779784
+FRA/orcl/datafile/readonly.262.848348705                   6             779696
+FRA/orcl/datafile/readwrite.264.848348743                  7             779784

7 rows selected.

SYS>alter tablespace readwrite offline;

Tablespace altered.

SYS>select NAME,FILE#,CHECKPOINT_CHANGE# from v$datafile;

NAME                                                    FILE# CHECKPOINT_CHANGE#
-------------------------------------------------- ---------- ------------------
+FRA/orcl/datafile/system.256.847546913                     1             779784
+FRA/orcl/datafile/sysaux.257.847546983                     2             779784
+FRA/orcl/datafile/undotbs1.258.847547051                   3             779784
+FRA/orcl/datafile/users.260.848268619                      4             779784
+FRA/orcl/datafile/test.261.848268689                       5             779784
+FRA/orcl/datafile/readonly.262.848348705                   6             779696
+FRA/orcl/datafile/readwrite.264.848348743                  7             779880

7 rows selected.

--离线后,检查点不起作用
SYS>alter system checkpoint;

System altered.

SYS>select NAME,FILE#,CHECKPOINT_CHANGE# from v$datafile;

NAME                                                    FILE# CHECKPOINT_CHANGE#
-------------------------------------------------- ---------- ------------------
+FRA/orcl/datafile/system.256.847546913                     1             779909
+FRA/orcl/datafile/sysaux.257.847546983                     2             779909
+FRA/orcl/datafile/undotbs1.258.847547051                   3             779909
+FRA/orcl/datafile/users.260.848268619                      4             779909
+FRA/orcl/datafile/test.261.848268689                       5             779909
+FRA/orcl/datafile/readonly.262.848348705                   6             779696
+FRA/orcl/datafile/readwrite.264.848348743                  7             779880

7 rows selected.

--上线操作只对readwrite表空间有影响
SYS>alter tablespace readonly online;

Tablespace altered.

SYS>select NAME,FILE#,CHECKPOINT_CHANGE# from v$datafile;

NAME                                                    FILE# CHECKPOINT_CHANGE#
-------------------------------------------------- ---------- ------------------
+FRA/orcl/datafile/system.256.847546913                     1             779909
+FRA/orcl/datafile/sysaux.257.847546983                     2             779909
+FRA/orcl/datafile/undotbs1.258.847547051                   3             779909
+FRA/orcl/datafile/users.260.848268619                      4             779909
+FRA/orcl/datafile/test.261.848268689                       5             779909
+FRA/orcl/datafile/readonly.262.848348705                   6             779696
+FRA/orcl/datafile/readwrite.264.848348743                  7             779880

7 rows selected.

SYS>alter tablespace readwrite online;

Tablespace altered.

SYS>select NAME,FILE#,CHECKPOINT_CHANGE# from v$datafile;

NAME                                                    FILE# CHECKPOINT_CHANGE#
-------------------------------------------------- ---------- ------------------
+FRA/orcl/datafile/system.256.847546913                     1             779909
+FRA/orcl/datafile/sysaux.257.847546983                     2             779909
+FRA/orcl/datafile/undotbs1.258.847547051                   3             779909
+FRA/orcl/datafile/users.260.848268619                      4             779909
+FRA/orcl/datafile/test.261.848268689                       5             779909
+FRA/orcl/datafile/readonly.262.848348705                   6             779696
+FRA/orcl/datafile/readwrite.264.848348743                  7             779925

7 rows selected.

综上,只读表空间不管进行什么操作,永远保持其被设为只读寻一刻的SCN
而普通表空间只在离线后不受检查点影响,离线操作本身仍然会修改SCN

二.只读表空间和DML,DDL的关系

A>create table t(id int) tablespace readonly;

Table created.

A>insert into t values(1);

1 row created.

A>commit;

Commit complete.

A>create index t_ind on t(id) tablespace readonly;

Index created.

--表空间设为只读后,插入/更新/删除都不行

SYS>alter tablespace readonly read only;

Tablespace altered.

A>insert into t values(2);
insert into t values(2)
            *
ERROR at line 1:
ORA-00372: file 6 cannot be modified at this time
ORA-01110: data file 6: '+FRA/orcl/datafile/readonly.262.848348705'


A>update t set id=2;
update t set id=2
       *
ERROR at line 1:
ORA-00372: file 6 cannot be modified at this time
ORA-01110: data file 6: '+FRA/orcl/datafile/readonly.262.848348705'


A>delete from t;
delete from t
            *
ERROR at line 1:
ORA-00372: file 6 cannot be modified at this time
ORA-01110: data file 6: '+FRA/orcl/datafile/readonly.262.848348705'


--truncate也不行,还是有点费解的
A>truncate table t;
truncate table t
               *
ERROR at line 1:
ORA-00372: file 6 cannot be modified at this time
ORA-01110: data file 6: '+FRA/orcl/datafile/readonly.262.848348705'

--同样是建表,为什么t2可以,t3不行呢?

A>create table t2(id int) tablespace readonly;

Table created.

A>create table t3 tablespace readonly as select * from t;
create table t3 tablespace readonly as select * from t
                                                     *
ERROR at line 1:
ORA-01647: tablespace 'READONLY' is read-only, cannot allocate space in it

--原因在于段的分配上,t2的段被延迟分配了,所以只是个定义,并没有实质性的分配段的操作,也就不用动表空间

DBMS_METADATA.GET_DDL(UPPER('TABLE'),UPPER('T2'))
--------------------------------------------------------------------------------

  CREATE TABLE "A"."T2"
   (    "ID" NUMBER(*,0)
   ) SEGMENT CREATION DEFERRED
  PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
  TABLESPACE "READONLY"

A>alter table t add name varchar2(10);

Table altered.

A>desc t
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 ID                                                 NUMBER(38)
 NAME                                               VARCHAR2(10)

--本来以为ID列有数据,所以不能删,没想到NAME列没数据也不能删

A>alter table t drop column id;
alter table t drop column id
*
ERROR at line 1:
ORA-12985: tablespace 'READONLY' is read only, cannot drop column

A>alter table t drop column name;
alter table t drop column name
*
ERROR at line 1:
ORA-12985: tablespace 'READONLY' is read only, cannot drop column

--删除索引和表没问题

A>drop index t_ind;

Index dropped.

A>drop table t;

Table dropped.

综上,表空间设为只读后,凡是跟数据有关的操作都不允许,比较特殊的有两个地方,一是truncate,另一个是删除空列

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/29646619/viewspace-1168628/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: show_space
下一篇: Clustoring Factor
请登录后发表评论 登录
全部评论

注册时间:2014-05-07

  • 博文量
    27
  • 访问量
    43325