18_Oracle_Admin_只读表空间和离线表空间

、只读表空间

只读的表空间只能进行select操作,设定只读表空间的命令为:

ALTER TABLESPACE userdata READ ONLY;

设定只读表空间会触发checkpoint,将缓存中的数据写入data file;但是尽管设定了只读属性,依然可以对这个表空间进行drop操作(比如drop table),因为drop操作并没有改变表空间的结构,只是更改了数据字典里的值,而数据字典是存储在SYSTEM TABLESPACE里的,SYSTEM TABLESPACE是不可以设定为READ ONLY的。

========创建一个表空间========

SQL> create tablespace wiley

 2  datafile‘/oracle/oradata/orcl/wiley.dbf‘ size 20M

 3  extent management local uniformsize 128k;

Tablespace created.

==========创建一个用户,指定其缺省的表空间为新建的表空间===========

SQL> create user wiley identified by******

 2  default tablespace wiley;

-- 创建用户的相关信息可以查阅联机文档SQL REFERENCE,这里创建了用户wiley,并将其
-- 缺省的表空间指定为新建的表空间wiley。
 
User created.

SQL> grant connect, resource to wiley;

-- 为新用户赋相应的权限
 
Grant succeeded.

===========新用户登录数据库==============

[[email protected] ~]$ sqlplus wiley

 
SQL*Plus: Release 11.2.0.1.0 Production on Sat Aug 3014:44:12 2014
 
Copyright (c) 1982, 2009, Oracle.  All rights reserved.
 
Enter password:
 
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 -Production
With the Partitioning, OLAP, Data Mining and RealApplication Testing options

==========创建表,并插入一条数据==========

SQL> create table t (id integer, namechar(10));

Table created.

SQL> insert into t values(0, ‘wiley‘);

1 row created.

SQL> commit;

Commit complete.

SQL> select * from t;

        ID NAME
---------- ----------
         0 wiley

========再插入一条数据,但是不commit===========

SQL> insert into t values(1, ‘2014‘);

1 row created.

 

SQL> select * from t;

 
        ID NAME
---------- ----------
         0 wiley
         1 2014

============切换成SYS用户==============

SQL> show user

USER is "SYS"

SQL> alter tablespace wiley read only;

-- 执行alter命令时,数据库被hold住了因为用户没有commit

======切换为wiley用户,commit刚才插入的值========

SQL> show user

USER is "WILEY"

SQL> commit;

 

Commit complete.

========再次切换为sys用户========

SQL> alter tablespace wiley read only;

Tablespace altered.
-- tablespace已经被altered了

===========再次切换为wiley用户============

SQL> insert into t values (2, ‘mickey‘);

insert into t values (2, ‘mickey‘)
            *
ERROR at line 1:
ORA-00372: file 6 cannot be modified at this time
ORA-01110: data file 6: ‘/oracle/oradata/orcl/wiley.dbf‘
-- 不能插入数据了

SQL> delete from t where id = 1;

delete from t where id = 1
            *
ERROR at line 1:
ORA-00372: file 6 cannot be modified at this time
ORA-01110: data file 6: ‘/oracle/oradata/orcl/wiley.dbf‘
-- 也不能删除数据

SQL> 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: ‘/oracle/oradata/orcl/wiley.dbf‘
-- 也不能truncate表,因为truncate只删除数据,而不删除表结构,它和delete是等效的

SQL> select * from t;

        ID NAME
---------- ----------
         0 wiley
         1 2014
-- 可以查询

SQL> drop table t;

 
Table dropped.
-- 可以drop table。

========切换为sys用户,将wiley设为可读写的表空间==========

SQL> show user

USER is "SYS"

SQL> alter tablespace wiley read write;

Tablespace altered.

只读表空间可以用来存放不经常修改的静态数据,因为只读表空间不需要恢复(recovery),从而可以提高数据库的性能。

二、将表空间设为离线

数据库在进行备份恢复时,将表空间设为离线状态会更加可靠;当表空间设为离线后,用户将不能访问数据了。但是有些情况是不能讲表空间设为离线的:

1. SYSTEM 表空间不能设为离线;

2. 如果表空间里面正在进行一些特定的事物(transaction),数据库就会在undotablespace中增加一个undosegment,这个undosegment就出于active状态,那么表空间也不能设为离线;

3. 缺省的全局临时表空间,如果这个临时表空间不是default的,是可以离线的;

=========以wiley用户创建一个表=========

SQL> create table tt (id integer, namechar(10));

Table created.

SQL> insert into tt values(0, ‘aaa‘);

1 row created.

SQL> commit; 

Commit complete.

SQL> select * from tt; 

        ID NAME
---------- ----------
         0 aaa

SQL> insert into tt values (1, ‘bbb‘);

1 row created.

SQL> select * from tt;

        ID NAME
---------- ----------
         0 aaa
         1 bbb

=======切换成SYS用户,将表空间wiley设为离线=========

SQL> alter tablespace wiley offline;

Tablespace altered.
-- 即使用户有没有commit,也可以将表空间设为离线

========以wiley用户重新登录===========

[[email protected]~]$ sqlplus wiley

 
SQL*Plus: Release 11.2.0.1.0 Production on Sat Aug 3015:18:30 2014
 
Copyright (c) 1982, 2009, Oracle.  All rights reserved.
 
Enter password:
 
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 -Production
With the Partitioning, OLAP, Data Mining and RealApplication Testing options
# 离线的tablespace也可以登录

SQL> select * from tt;

select * from tt
*
ERROR at line 1:
ORA-00376: file 6 cannot be read at this time
ORA-01110: data file 6: ‘/oracle/oradata/orcl/wiley.dbf‘

========切回SYS用户,然后将wiley这个表空间设为在线========

SQL> alter tablespace wiley online;

 
Tablespace altered.

===========切回wiley用户==========

SQL> select * from tt;

-- 可以执行查询语句了
 
        ID NAME
---------- ----------
         0 aaa
         1 bbb

在设定离线时,可以附加三种选项:NORMAL, TEMPORARY和IMMEDIATE,分别对应不同的强制级别,可以查询联机文档SQL REFERENCE 获取相关信息。

时间: 2024-10-24 13:18:10

18_Oracle_Admin_只读表空间和离线表空间的相关文章

【只读表空间--恢复-1】

1>只读 ---备份只读  故障 只读  还原有故障的数据文件 2>只读 ---备份只读  可写 故障  还原备份数据文件,重做recover 3>只读 ---备份可写  只读 故障  还原备份数据文件,recover 1> 进入rman,确保是否有备份的文件: [[email protected] ~]$ rman target / Recovery Manager: Release 10.2.0.5.0 - Production on Thu Nov 6 09:44:08 20

Oracle 读写-只读表空间回复详解

(一) 使用备份时的控制文件进行恢复,如下图,即使用备份位置的控制文件进行恢复 1) 创建测试表空间ts1及相关测试表(表空间为ts1) [email protected]>create tablespace ts1 datafile '/u01/app/oracle/oradata/ORCL/ts1.dbf' size 10m; Tablespace created. [email protected]>create table scott.t(x int) tablespace ts1;

SQL Server查看所有表大小,所占空间

将数据库的所在机器所有数据库名称及其大小查询出来 2.将数据库下的所有表的名称及其大小查询出来 请高手指点! 1.查看所有数据库相关信息,包裹存储路径等. use master select * from dbo.sysdatabases 2. 以SQL2000自带PUBS为例 exec sp_MSForEachTable @precommand=N'create table ###(表名 sysname,记录数 int,保留空间 Nvarchar(10),使用空间 varchar(10),索引

oracle 查看表行数所占空间大小

最新数据库空间有感觉捉急了,上次,删了些数据空了800+G,撑了一个多月,现在还有400+G,每天10G的增量,多少空间也感觉不够用啊. 不能加硬盘,就只有删数据了.. 删数据,人懒,直接找表行最多,占空间最大的表删 于是就有了下面一段SQL: select ut.table_name,ut.OWNER,ut.tablespace_name,num_rows,us.BYTES from dba_tables ut,(select segment_name,sum(bytes)/1024/1024

oracle 查询数据库表空间大小和剩余空间

dba_data_files:数据库数据文件信息表.可以统计表空间大小(总空间大小). dba_free_space:可以统计剩余表空间大小. 增加表空间即向表空间增加数据文件,表空间大小就是数据文件总大小. 检查Oracle各个表空间的增长情况(各表空间使用率) select A.tablespace_name,(1-(A.total)/B.total)*100 used_percent from (select tablespace_name,sum(bytes) total from db

查询数据库中所有表的记录数,所占空间,索引使用空间

常用 --查询数据库中所有表的记录数,所占空间,索引使用空间 exec sp_MSForEachTable @precommand=N'create table ##(表名 sysname,记录数 int,保留空间 Nvarchar(20),使用空间 varchar(20),索引使用空间 varchar(20),未用空间 varchar(20))', @command1=N'insert ## exec sp_spaceused ''?''', @postcommand=N'select * f

白话空间统计之:空间自相关

白话空间统计之:空间自相关 空间自相关,肯定是空间统计里面第一个拦路虎了,很多人遇上了这个高大上的词汇,立刻就发现,这五个字我好像都认识,但是到底说了啥?不知道. 如果翻开各种教材,从统计学到数学到物理学,各种解释都摆出了一副"老子就是高大上学霸,屌丝学渣勿扰"的样子,这个东西真得就那么难么?虾神我就不信了,所以:I have a dream,就是写出一个最接地气的空间统计解释来.(好大的宏愿,阿弥陀佛老天保佑,别吹炸了.) 首先,要明白一下空间自相关这个神奇的概念,不得不先说一个神奇

Lua中只读表和只允许修改表

Lua中的table表非常灵活强大,可以随时加入和修改,但有时在多人协作和 一些项目中有些凌乱,我们可以利用元表的性质来保护我们的一些表格. 1.Lua中的只读表 function ReadOnlyTable (t) local proxy = {} local mt = { __index = t, __newindex = function (t,k,v) error("attempt to update a read-only talbe",2) end } setmetatab

sed模式空间和暂存空间的区别

学了sed,觉得模式空间和暂存空间比较乱 整理一下 sed编辑器逐行处理文件,并将输出结果打印到屏幕上.sed命令将当前处理的行读入模式空间(pattern  space)进行处理,sed在该行上执行完所有命令后就将处理好的行打印到屏幕上(除非之前的命令删除了该行),sed处理完一行就将其从模式空间中删除,然后将下一行读入模式空间,进行处理.显示.处理完文件的最后一行,sed便结束运行.sed在临时缓冲区(模式空间)对文件进行处理,所以不会修改原文件,除非显示指明-i选项. 与模式空间和暂存空间