首页 > 数据库 > Oracle > 正文
Oracle表空间(Tablespace)
2011-10-30       个评论      
收藏    我要投稿

 

1、查看表空间的名称及大小

select t.tablespace_name, round(sum(bytes/(1024*1024)),0) ts_size

from dba_tablespaces t, dba_data_files d

where t.tablespace_name = d.tablespace_name

group by t.tablespace_name;

 

2、查看表空间物理文件的名称及大小

select tablespace_name, file_id, file_name,

round(bytes/(1024*1024),0) total_space

from dba_data_files

order by tablespace_name;

 

select tablespace_name, file_id, file_name,

round(bytes/(1024*1024),0) total_space

from dba_temp_files

order by tablespace_name;

 

3、查看表空间的使用情况

select sum(bytes)/(1024*1024) as free_space,tablespace_name

from dba_free_space

group by tablespace_name;

SELECT * from DBA_TEMP_FREE_SPACE;

 

4、查看/修改Database的Default Temporary Tablespace

SELECT PROPERTY_NAME, PROPERTY_VALUE FROM DATABASE_PROPERTIES WHERE

PROPERTY_NAME='DEFAULT_TEMP_TABLESPACE';

ALTER DATABASE DEFAULT TEMPORARY TABLESPACE tablespace_name;

 

 

转载:

http://blog.csdn.net/qingfengliuquan/article/details/5754497

http://dongyongjun.blog.sohu.com/169044317.html

http://steadyman.iteye.com/blog/680849;

TableSpace是Oracle空间管理上的逻辑单位,实体上存放数据的是Tablespace里面的档案(Data File);而我们所熟悉的Table就放在这一个一个的档案里面。所以TableSpace可以看成是Data File的群组。Tablespace可进一步分为segments、extents和blocks。一个datafile只属于一个数据库的一个tablespace。

当数据库刚建立起来,系统会建立一个叫做SYSTEM的系统TableSpace,存放SYS、SYSTEM等User重要的系统数据(ex:数据字典与预储程序等)如果我们建立Oracle User时,不指定预设的TableSpace,则此User则会以SYSTEM TableSpace作为预设的TableSpace。这将造成管理上的混乱与严重的效能问题,这是必须特别注意的。

TableSpace的类型:Permanent、Undo、Temporary

§Permanent Tablespace

  一般我们创建给AP使用的都是Permanent Tablespace。里面对象的生命周期不会随着交易或者用户的session结束而消失。

 

§Undo Tablespace

  Undo Tablespace是系统用的特殊的Tablespace,用来取代过去的rollback segement的机制,主要的功用是提供用户修改数据未commit之前的read consistency的功能以及rollback交易的功能。也因为undo tablespace主要是取代过去的rollback segement的机制,所以不能存放其他种类的segement。undo tablespace只能是local managed。

 

§Temporary Tablespace

  Temporary Tablespace也是系统用的特殊的Tablespace。当使用者需要做排序时,有时就会使用Temporary Tablespace,因此里面的Segement的生命周期都很短,可能交易结束或者User的Session结束就会消失。每个系统都必须要有一个预设的Temporary Tablespace(Default Temporary Tablespace),The DEFAULT TEMPORARY TABLESPACE clause of the CREATE DATABASE statement creates a default temporary tablespace for the database. 如果没有Default Temporary Tablespace,Create User的时候又忘了指定使用哪个Temporary Tablespace,会以SYSTEM tablespace来当作Temporary Tablespace,这样就很糟糕。以下列出几个Temporary Tablespace的特性。

 

1. Temporary Tablespace是NOLOGGING模式,因此若数据库损毁,做Recovery不需要恢复Temporary Tablespace。

2. Temporary最好是使用Local managed Tablespace

3. 若使用local managed模式,UNIFORM. SIZE参数最好是Sort_Area_Size的参数,这样效能比较好。

4. Uniform. size预设1024K,而Sort_area_size预设是512K

5. Temporary Tablespace不能使用local managed的AUTOALLOCATE参数。

 

TableSpace的Extent空间管理:Local Managed与Dictionary Managed

  Local Managed与Dictionary Managed最主要的分别,在于空间管理方式的不同。Local managed的管理方式是让每个TableSpace自己利用bitmaps去管理他自己的空间,而Dictionary Managed则是利用SYSTEM TableSpace的数据字典来做空间管理。这两者最大的不同在于Local managed大大的改善了Oracle做空间管理(例如:产生新的Exten或释放Extent...等)时,抢夺SYSTEM TableSpace资源的问题。所以Oracle从8i以后已经朝Local managed的方向去走了,所以我们应该尽量使用Local managed的方式才对,所以Dictionary managed的方式不多做介绍了。

 

§Local managed tablespace

1. Local managed使用bitmaps做空间管理。

2. bitmaps中每个bit代表一个data block或者一堆相邻的data block(extent)

3. 从10g开始,SYSTEM Tablespace预设使用local managed-->Oracle建议使用local managed的证据。

4. 假如SYSTEM TableSpace是local managed,那么其他TableSpace必须是local managed。

5. 若没指定使用local managed或者dictionary managed,则预设使用local managed。

6. 使用local managed可以增进效能,因为减少了SYSTEM TableSpace的效能竞争。

7. 使用local managed则不需要做空间缝合(loalescing),因为相邻的不同大小的extent,辨识extent使用状态的bits也在一起,Oracle可以直接使用这些相邻的extent。不需要先进行缝合才可以使用。这也可以增进部份效能。

 

§local managed的extent空间管理(Extent Management):AUTOALLOCATE与UNIFORM

  AUTOALLOCATE与UNIFORM这两个参数,是用来设定Local managed的extent大小的参数。AUTOALLOCATE是让Oracle自己来决定extent的大小;而UNIFORM则是强制规定TableSpace中extent的为固定的大小。通常若你明确的知道extent必须多大,才会使用UNIFORM,使用UNIFORM的好处是每个extent的大小都相同,不会产生空间破碎的问题。但是如果无法预知extent必须多大,使用AUTOALLOCATE会比较好,让Oracle自己决定使用extent的大小,可以比较符合实际的需求,因此会比较节省空间,但是这可能会产生部分空间破碎的问题。使用AUTOEXTENT,Oracle会使用的extent大小为64k、1M、8M、64M。根据我系统上使用的结果,99.95%的extent都是使用64k、只有少部分使用1M的extent,所以其实破碎的情况不严重,使用AUTOALLOCATE在我的系统上其实就够用了。想知道你的TableSpace所使用的Extent有几种,请用下列的语法:

Select bytes,count(*) from dba_extents where tablespace_name='your_tablespace_name' group by bytes

 

§Local managed中的Segment的空间管理(Segment Space Management ):AUTO与MANUAL

  Tablespace中的Segment的空间管理上,可以设置的参数为AUTO与MANUAL。MANUAL是使用我们熟悉的PCTUSED、FREELISTS、FREELIST GROUPS的方式来管理Segment中的data block;而AUTO则是使用bitmaps来管理data block。使用AUTO来管理的话,以往create tablespace或create table时设定的storage的参数设定都不需要再设定了,因为data block的管理已经是bitmaps了,不再是free list了。如果没有特别的需求话,使用AUTO会比使用MANUAL有更好的空间利用率,与效能上的提升。

 

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

1、创建表空间

创建表空间的完整命令:

 

Create [undo] tablespace <ts_name>

 

datafile <file_spec1> [,<file_spec2>]

 

mininum extent <m> k|m

 

blocksize <n> [k]

 

logging clause

 

force logging

 

default storage_clause

 

online | offline

 

permanent | temporary

 

extent_manager_clause

 

segment_manager_clause

 

1)、undo指定系统将创建一个回滚表空间

 

2)、tablespace指定表空间名称

 

3)、datafile指定数据文件的路径、名称、大小及自增长状况:具体形如'E:\oracle\product\10.2.0\oradata\orcl\TEST.DBF' size 50M autoextend on next 10M maxsize 500M,也可以指定on为off,就没有后面的递增和最大尺寸了,也可以在maxsize后面指定最大尺寸unlimited说明表空间无限大。

 

4)、mininum extent <m> k|m指出在表空间的extent的最小值,这个参数可以减少空间碎片,保证在表空间的extent是这个数值的整数倍;

 

5)、blocksize <n> [k]设置块的大小,如果要设置这个参数,必须设置成db_block_size的整数倍;

 

6)、logging cluse指示这个表空间上所有用户对象的日志属性,缺省是logging;

 

7)、force logging指示表空间进入强制日志模式。此时系统将记录表空间上对象的所有改变,除了临时段的改变。这个参数高于logging参数中的nologging选项;

 

8)、default storage_clause声明缺省的存储子句;

 

9)、online|offline指定表空间状态;

 

10)、permanent | temporary指出表空间的属性,是永久表空间还是临时表空间。永久表空间存放的是永久对象,临时表空间存放的是session生命期中存在的临时对象。这个参数生成的临时表空间创建后一直都是字典管理,不能使用extent management local选项。如果要创建本地管理表空间,必须使用create temporary tablespace。声明了这个参数就不能声明block size。

 

11)、extent_manager_clause说明表空间如何管理extent。一旦声明了这个子句,就只能通过移植的方式改变这些参数。如果希望表空间本地管理的话,声明local选项。本地管理表空间是通过位图管理的。Autoallocate说明表空间自动分配extent,用户不能指定extent的大小。只有9.0以上的版本具有这个功能。Uniform说明表空间的范围的固定大小,缺省是1M。不能将本地管理的数据库的SYSTEM表空间设置成字典管理。ORACE推荐使用本地管理表空间。如果没有设置这个子句,oracle会进行默认设置。如果初始化参数compatible小于9.0.0,那么系统创建字典管理表空间,如果大于9.0.0,那么按如下设置:

 

如果没有指定default storage_clause,oracle创建一个自动分配的本地管理表空间;否则如果指定了mininum extent,那么oracle判断mininum extent、initial、next是否相等,以及pctincrease是否为0,如果满足这2个条件,oracle吃醋昂就一个本地管理表空间,extent size是initial,如果不满足,那么oracle将创建一个自动分配的本地管理表空间;如果没有指定mininum extent,那么oracle判断initial和next是否相等,以及pctincrease是否为0,如果满足这2个条件,那么oracle创建一个本地管理表空间并制定uniform,否则oracle将创建一个自动分配的本地管理表空间。(本地管理表空间只能存储永久对象。如果你声明了local,则不能声明default storage_clause,mininum extent,temporary);

 

12)、segment_management_clause : segment space management auto。

 

2、表空间的状态:

Tablespace的状态有3种:ONLINE、OFFLINE、READ ONLY。ONLINE是正常工作的状态,OFFLINE状态下,是不允许访问数据的,

SYSTEM tablespace和DEFAULT temp tablespace是不能被OFFLINE的,且带有active undo segments的tablespace也不能被OFFLINE。

切换ONLINE和OFFLINE状态的命令是alter tablespace <ts_name> offline/online。当状态变成READ-ONLY时,会产生一个checkpoint,此时数据只能读不能写,但是可以drop对象,相关命令是alter tablespace <ts_name> read only和alter tablespace <ts_name> read write。

 

3、表空间的存储设置

修改tablespace和datafiles的存储设置。这项工作是指修改tablespace的大小和datafile的存放位置。

 

在修改tablespace的大小之前,我们需要先知道tablespac的当前存储情况。可以用下面的SQL语句实现:

 

SELECT a.tablespace_name,

 

a.bytes bytes_used,

 

b.largest,

 

round(((a.bytes - b.bytes) / a.bytes)*100, 2) percent_used

 

FROM

 

(SELECT tablespace_name,

 

SUM(bytes) bytes

 

FROM Dba_Data_Files

 

GROUP BY tablespace_name) a,

 

(SELECT tablespace_name,

 

SUM(bytes) bytes,

 

MAX(bytes) largest

 

FROM dba_free_space

 

GROUP BY tablespace_name) b

 

WHERE a.tablespace_name = b.tablespace_name

 

ORDER BY ((a.bytes - b.bytes) / a.bytes) DESC;

 

上面这条SQL语句中,有2条子查询,第一条取得的是表空间的总字节数,第二条取得的是表空间中余下的字节数,最终得到的结果是已经使用的字节数和百分比。

 

修改tablespace的大小,主要是通过datafile的大小来实现的,修改datafile的大小又有3种方法:

1)、使数据文件自增长;

2)、改变数据文件大小;

3)、添加数据文件。

 

使数据文件自增长:表DBA_DATA_FILES中有一个字段AUTOEXTENSIBLE与这个方法对应,它指示数据文件是否自增长,也就是数据文件不能满足存储需求时,是否自动增加大小来满足需求。先运行下列命令创建一个datafile大小为5M的表空间—TEST:create tablespace test datafile 'E:\oracle\product\10.2.0\oradata\orcl\TEST.DBF' size 5M;这个时候,AUTOEXTENSIBLE是no,也就是数据文件的大小是固定的,不会自增长(当然,我们也可以在创建命令中加入指令设置自增长)。下面我们手动来修改数据文件为自增长:alter database datafile 'E:\oracle\product\10.2.0\oradata\orcl\TEST.DBF' autoextend on next 5M maxsize 50M;这条命令将TEST.DBF数据文件设置为按5M大小进行自增长,最大为50M。(临时表空间用alter database tempfile...,下同)

 

改变数据文件大小:以前面的数据文件为例,我想将数据文件设置为100M大小,可以执行命令:alter database datafile 'E:\oracle\product\10.2.0\oradata\orcl\TEST.DBF' resize 100M;

 

添加数据文件:这应该是最好的一种方式,便于管理。以TEST表空间为例,添加数据文件的命令如下:alter tablespace test add datafile 'E:\oracle\product\10.2.0\oradata\orcl\TEST01.DBF' size 5M autoextend on next 5M maxsize 50M;这条命令就直接指定了数据文件自增长。

 

除了修改表空间的大小,存储设置中还可以进行的一项工作就是移动数据文件。

移动数据文件有2种方法,一种是使用alter tablespace命令,一种是使用alter database命令。

 

使用alter tablespace移动数据文件前,需要先将表空间OFFLINE,然后目标数据文件必须存在(也就是将需要移动的数据文件复制到目的地)。以将数据文件TEST01.DBF移动到上一层目录为例。先执行命令:alter tablespace test offline;然后将TEST01.DBF复制到上一级目录,再执行命令:alter tablespace test rename datafile E:\oracle\product\10.2.0\oradata\orcl\TEST01.DBF' to 'E:\oracle\product\10.2.0\oradata\TEST01.DBF';然后再将表空间ONLINE就可以了:alter tablespace test online;。

 

使用alter database移动数据文件时,同样,目标数据文件必须存在(原文件的副本),且数据库需要处于MOUNTED状态。第一种方法,已经将数据文件移动到了父一级目录,下面再将它移回来。先关闭数据库:shutdown immediate;然后启动数据库,启动选项为mount:startup mount;然后执行移动命令:alter database rename file 'E:\oracle\product\10.2.0\oradata\TEST01.DBF' to 'E:\oracle\product\10.2.0\oradata\orcl\TEST01.DBF';再打开数据库:alter database open,报错了:

 

ORA-01113:文件7需要介质恢复

 

ORA-01110:数据文件7:’E:ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\TEST01.DBF’,细节还不明白,只知道数据库认为这个数据文件收到破坏,需要使用备份、日志信息来恢复。这本来是个比较严重的问题,但是在这个实例中,还是很好解决的,执行命令:

 

recover datafile ’E:ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\TEST01.DBF’。提示完成介质恢复,再打开数据库:alter database open;一切就正常了。

 

4、删除表空间

删除表空间,使用命令drop tablespace <ts_name>。但是有3个选项需要注意:

 

INCLUDING CONTENTS:指示删除表空间中的segments;

 

INCLUDING CONTENTS AND DATAFILES:指示删除segments和datafiles;

 

CASCADE CONSTRAINTS:删除所有与该空间相关的完整性约束条件。

 

Drop tablespace test INCLUDING CONTENTS AND DATAFILES CASCADE CONSTRAINTS;

 

需要注意的是SYSTEM表空间以及具有active segments的表空间是无法删除的。

 

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

a)TableSpace管理准则

1、使用多个TableSpace

* 用户数据与数据字典数据分离,减少竞争

* 应用程序之间的数据分离,防止某个TableSpace脱机后对多个程序造成影响

* 不同磁盘驱动器上存储数据,减少I/O竞争

* 回滚段数据与用户数据分离,防止单磁盘故障造成数据永久丢失

* 可以控制单个TableSpace脱机,提供更高的整体可用性

* 为特定类型数据库使用保留TableSpace,可优化TableSpace的使用

* 可以备份单独的TableSpace

 

2、指定表空间默认的存储参数

为TableSpace设置合适的参数,下文中详细介绍。

 

3、为用户指定表空间限额

可以有效控制TableSpace的大小,限制用户权限防止发生意外。

 

b)创建TableSpace

1、创建本地管理TableSpace

Oracle创建的TableSpace默认均是本地管理的,明确的表述应该是:

在CREATE TABLESPACE 语句中EXTENT MANAGEMENT 子句中指定LOCAL

然后可以用AUTOALLOCATE 选项(默认)来使Oracle自动管理盘区

CREATE TABLESPACE lmtbsb DATAFILE '/u02/oracle/data/lmtbsb01.dbf' SIZE 50M

EXTENT MANAGEMENT LOCAL AUTOALLOCATE;

 

也可以使用一个指定大小(UNIFORM SIZE)的同意盘区来管理该TableSpace

CREATE TABLESPACE lmtbsb DATAFILE '/u02/oracle/data/lmtbsb01.dbf' SIZE 50M

EXTENT MANAGEMENT LOCAL UNIFORM SIZE 128K;

如果未指定盘区大小,则默认为1M,说明数据文件至少要大于1MB

 

注:如果TableSpace被期望用于包含需要不同盘区大小和拥有很多盘区的大小变动的对象,那选择AUTOALLOCATE是最好的选择。AUTOALLOCATE是一种管理TableSpace的简便方法,只是有可能会对一些空间造成浪费。如果需要准确控制未用空间,并能够精确预计为一个或多个对象要非配的空间和盘区大小,那就可以使用UNIFORM。

 

2、在本地管理TableSpace中指定段空间管理

可使用SEGMENT SPACE MANAGEMENT子句来设置端控件的管理模式,有以下几种模式:

MANUAL(默认):使用段中管理空闲空间的空闲列表。

AUTO:使用位图来管理段中的空闲空间。又称为自动段空间管理。

AUTO立功了一种更加简单、有效的管理方法,完全消除了为表空间中创建的段指定和调整PCTUSED、FREELISTS、FREELISTS GROUPS属性的任何必要。

 

CREATE TABLESPACE lmtbsb DATAFILE '/u02/oracle/data/lmtbsb01.dbf' SIZE 50M

EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO;

 

注:LOB类型不能指定自动段空间管理。

 

3、修改本地管理TableSpace

* 不能讲本地管理TableSpace改为本地管理的temp TableSpace

* 不能改变TableSpace的段空间管理办法

* 本地管理TableSpace没有必要合并空闲盘区

* 可以添加数据文件

* 可以改变TableSpace状态(ONLINE/OFFLINE)

* 修改TableSpace为只读or只写

* rename数据文件

* 启用/禁用该TableSpace数据文件的自动盘区大小

 

 

4、创建字典管理的TableSpace

CREATE TABLESPACE tbsb

DATAFILE '/u02/oracle/data/tbsb01.dbf' SIZE 50M

EXTENT MANAGEMENT DICTIONARY

DEFAULT STORAGE (

INITIAL 50K

NEXT 50K

MINEXTENTS 2

MAXEXTENTS 50

PCTINCREASE 0);

 

使用ALTER TABLESPACE语句可以进行以下操作:

* 添加一个新的文件

* 改变默认的存储参数

* 合并TableSpace的空闲空间

* 可以改变TableSpace状态(ONLINE/OFFLINE)

* 修改TableSpace为只读or只写

* rename数据文件

* 启用/禁用该TableSpace数据文件的自动盘区大小

 

5、临时表空间

临时表空间主要用于提高多个排序操作的并发能力、减小开销,或避免Oracle空间管理操作在一起进行。临时表空间创建之后,可以被多个用户共享。

一个给定实例和表空间的所有排序操作共享一个单一的排序段。即排序段为一个给定表空间的每个执行排序操作的实例而存在。

排序段由使用临时表空间用于排序的第一个语句创建,并在关闭时释放,一个盘区不能被多个事务共享。

 

可以使用V$SORT_SEGMENT视图来查看临时表空间排序段的空间分配和回收情况

用V$SORT_USAGE视图查看这些段的当前排序用户

 

注:临时表空间中不能创建明确对象。

 

6、创建本地管理的临时表空间

CREATE TEMPORARY TABLESPACE lmtemp TEMPFILE '/u02/oracle/data/lmtemp01.dbf' SIZE 20M REUSE

EXTENT MANAGEMENT LOCAL UNIFORM SIZE 16M;

 

注1:临时数据文件信息查询与数据文件不同,需要查询V$TEMPFILE和DBA_TEMP_FILES,但结构与V$DATAFILE和DBA_DATA_FILES类似。

注2:临时表空间在初次使用时才分配空间,可以更快创建和修改大小,但要注意磁盘大小。

 

7、本地管理临时表空间的修改

* 添加临时文件

ALTER TABLESPACE lmtemp ADD TEMPFILE '/u02/oracle/data/lmtemp02.dbf' SIZE 20M REUSE;

 

* 改变临时文件状态

ALTER DATABASE TEMPFILE '/u02/oracle/data/lmtemp02.dbf' ONLINE|OFFLINE;

 

* 更改临时文件大小

ALTER DATABASE TEMPFILE '/u02/oracle/data/lmtemp02.dbf' RESIZE 4M;

 

* 取消临时文件并删除相应操作系统文件

ALTER DATABASE TEMPFILE '/u02/oracle/data/lmtemp02.dbf' DROP

INCLUDING DATAFILES;

 

8、创建字典管理的临时表空间

CREATE TABLESPACE sort

DATAFILE '/u02/oracle/data/sort01.dbf' SIZE 50M

DEFAULT STORAGE (

INITIAL 2M

NEXT 2M

MINEXTENTS 1

PCTINCREASE 0)

EXTENT MANAGEMENT DICTIONARY

TEMPORARY;

 

注1:不能以这种方式创建EXTENT MANAGEMENT LOCAL的临时表空间。

注2:可以使用ALTER TABLESPACE tbsa TEMPORARY;语句将一个现有的字典管理永久表空间改为临时表空间。

点击复制链接 与好友分享!回本站首页
相关TAG标签 空间
上一篇:《Oracle编程艺术》学习笔记(22)-表类型
下一篇:《Oracle编程艺术》学习笔记(23)-段
相关文章
图文推荐
文章
推荐
点击排行

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训
版权所有: 红黑联盟--致力于做实用的IT技术学习网站