表空间(table space)是Oracle数据库中最大的逻辑结构。从逻辑上说,Oracle数据库是由若干个表空间组成的。表空间与数据库的物理结构有着十分密切的关系,它与磁盘上若干个数据文件相对应。从物理上说数据库的数据被存放在数据文件中,从逻辑上说数据是被存放在表空间中。
表空间是个重要的概念,因为它提供了一套有效组织数据的方法。数据库的逻辑配置实际上是指表空间的配置。它不仅对数据库的性能有重要的影响,而且对简化存储管理有明显作用。表空间是组织数据和进行空间分配的逻辑结构。可以将表空间看作是数据库对象(如表、索引、视图、过程、函数和触发器等)的容器,它被划分成若干个独立的逻辑段,分别对应地存储在数据库中所创建的对象。也就是说,数据库的所有对象都被逻辑地保存在表空间中。
一个数据文件只能属于一个表空间,一个表空间只能属于一个数据库,一个表空间可以有几个数据文件。Oracle数据把方案对象(如表、索引)逻辑地存储在表空间中,同时把它们(定义和数据)物理地存储在数据文件,而数据文件物理分布在各个磁盘中。
附件:
●控制数据库所占用的磁盘空间
●控制用户所占用的表空间配额,因此也就控制了用户所占用的空间配额
●通过将不同表的数据、分区表的不同分区的数据放置到不同的表空间(或其中的数据文件)中,可以提高数据库的I/O性能,并有利于进行部分备份和恢复等管理工作
●能够将一个表的数据和这个表的索引数据分别放置在不同的表空间(或其中的数据文件)中,同样可以提高数据库的I/O性能
●可以将表空间设置成只读状态而保持大量的静态数据
●表空间提供了一个备份和恢复的单位。Oracle提供了按表空间备份和恢复的功能
一个数据库通常有SYSTEM、SYSAUX和TEMP三个默认表空间,一个或多个临时表空间,而且还有一个撤销表空间和几个应用程序专用的应用表空间。可以创建新的表空间来满足用户或应用程序对数据库存储空间的需求。创建表空间需要决定创建什么类型的表空间。
1.系统表空间
系统表空间包括SYSTEM和SYSAUX表空间,其它表空间是非系统表空间。系统表空间在所有数据库中都是必须的,是自动创建的,一般存放数据字典表及其数据。
2.永久表空间
永久表空间用于保存永久性的数据,如系统数据,应用系统数据。每个用户都会分配一个永久表空间,以便保存其方案对象的数据。除了撤销(undo)表空间,相对于临时表空间( temporary)表空间来说,其它表空间就是永久表空间(permanent)表空间,如系统表空间。
3.临时表空间
执行具有排序(order by)、分组汇总(group by)、索引(create index)等功能的SQL语句时,会产生大量临时数据。服务器进程首先将临时数据存放到PGA区的排序区中,当排序区不够用时,服务器进程就会在临时表空间中建立临时段,并将这些临时数据存放到临时段中。
如果在创建用户时没有为用户指定一个临时表空间,那么就会使用SYSTEM表空间来创建临时段,存放临时数据。这样做的结果是:
●占用SYSTEM表空间的存储空间,是可用的存储空间下降
●频繁地分配和释放临时段,会使SYSTEM表空间中产生大量的存储碎片,使磁盘的读取效率下降
●由于这些原因,会直接影响数据库的性能
如果在数据运行过程中,经常有大量的并发程序,为了避免在SYSTEM表空间中存储临时数据,DBA应该在数据库中创建一个专门用来存储临时数据的临时表空间,对应的文件称为临时文件。临时表空间可以被所有用户共享使用,如TEMP表空间。
用户的临时表空间是创建这个用户时创建的。数据库默认临时表空间是在创建(create database)数据库时,使用default temporary table space子句指定。
4.撤销表空间
运行在自动撤销管理(automatic undo management)模式的数据库,用撤销(undo)表空间来存储、管理撤销数据。Oracle使用撤销数据来隐式或显式地回退事务、提供数据的读一致性,帮助数据库从逻辑错误中恢复、实现闪回查询(Flashback Query)。
在Oracle中可以创建多个撤销表空间,但同一时刻只允许激活一个撤销表空间。在初始化参数文件中用UNDO_TABLESPACE指出要激活的撤销表空间。不使用的撤销表空间可以删除。撤销表空间的组织与管理是由Oracle内部自动完成的。当回退段不足时,一个事务可以使用多个回退段,不会终止事务的运行。DBA只需要知道撤销表空间是否有足够的空间,而不必为每个事务设置回退段。
5.大文件表空间和小文件表空间
大文件(bigfile)表空间是在Oracle 10g中新引进的表空间。大文件表空间只能放置一个数据文件(或临时文件)。其数据文件可以包括4G个数据库,如果每个数据块的大小为8KB,那么大文件表空间可以达到32TB。
小文件(smallfile)表空间是以前的Oracle表空间的新名称,是默认创建的表空间类型。在小文件表空间中可以放置最多1022个数据文件。一个数据库最多可以放置64K个数据文件。 SYSTEM和SYSAUX表空间总是被创建为小文件表空间。
1.读写(Read-Write)
默认情况下所有的表空间都是读写状态。任何具有表空间配额并且具有适当权限的用户都可以读写表空间中的数据。
2.只读(Read-Only)
如果将表空间设置为只读状态,则任何用户(包括DBA)都无法向该表空间中写入数据,也无法修改表空间中已有的数据。这种限制与用户的权限无关。
将表空间设置成只读状态的主要目的:避免对数据库中的静态数据进行修改。使用户只能以SELECT方式查询只读数据,不能使用INSERT、UPDATE、DELECT等方式修改数据。由于只读表空间中的数据不会被修改,因此DBA只需要将只读表空间备份即可。如果数据库中保存的是只读数据,将这些数据保存在一个单独的表空间中,然后将这个表空间设置为只读状态,不仅能够提高数据的安全性,而且可以减轻DBA管理和维护工作量。
3.脱机状态(offline)
在有多个应用表空间的数据库中,DBA可以通过将某个应用表空间设置为脱机状态,使该表空间暂时不让用户访问。用户仍然可以访问数据库的其它表空间。也可以将某个处于脱机状态的表空间重新设置为联机状态。DBA可以通过设置改变联机或脱机状态。
四种脱机模式
●正常(Normal):这个模式是默认模式。该模式表示将表空间从正常状态切换到脱机状态。在进入脱机状态的过程中,必须保证该表空间的所有数据文件都是联机的、可用的,Oracle会执行一次检查点,以便将SGA区中与该表空间相关缓存数据写入数据文件中,然后关闭表空间的所
有数据文件。
●临时(Temporary):此模式表示将表空间以临时方式切换到脱机状态。在进入脱机状态的过程中,不必保证该表空间的所有数据文件都是联机的、可用的,Oracle会执行一次检查点(checkpoint)。如果在这个过程中某些数据文件处于不可用状态,Oracle也会忽略这些错误,进入Tempporary脱机模式。
●立即(Immediate):该模式表示将表空间以立即方式切换到脱机状态。在进入脱机状态的过程中,不必保证这个表空间的所有数据文件都是联机的、可用的,Oracle也不会执行检查点,而是将属于该表空间的所有数据文件切换到脱机状态。
●恢复(For Recover):这个模式表示将表空间以恢复方式切换到脱机状态。如果要对表空间进行基于时间的恢复,可以使用这种模式将表空间切换到脱机状态。然后DBA就可以使用备份的数据文件覆盖原有的数据文件,再这些数据文件上,利用归档重做日志,将表空间恢复到某个时间点状态。
注:SYSTEM表空间不能设置为只读状态、脱机状态,因为在数据库运行过程中始终会使用到SYSTEM表空间中的数据。
表空间的区和段管理方式示意图
在创建区管理方式是本地关管理方式表空间时,不能在CREATE TABLESPACE语句中用DEFAULT STORAGE子句指定存储参数。
1.区管理方式
对于区的分配方式不同,表空间有两种管理方式。
●字典管理方式(dictionary-managed tablespace,DMT)
字典管理方式是传统的管理方式,是为了与早期版本兼容而保留的区管理方式。在字典管理方式下,使用数据字典来管理存储空间的分配。
当表空间中分配新的区域或回收已分配的区时,Oracle将对数据字典中的相关基础表进行查询、更新,并且在这一过程中,使用单线程搜索方法,速度较慢。另外,对表的更新操作会产生回退信息和重做信息,因此在分配区或回收区时,会在数据库中产生回退信息和重做信息。这是字典管理方式的特点,也是缺点。
●本地管理方式( Local-managed tablespace,LMT)
本地管理方式是一种新的、改进的管理方式。Oracle建议使用本地管理方式代替字典管理方式。从Oracle 9i开始,创建表空间时。默认使用本地管理方式。
在本地管理方式下,表空间中区的分配与回收的管理信息都被存储在表空间的数据文件中,而不是存储在数据字典中。表空间会在每个数据文件中维护一个“位图(bitmap)”结构,用于记录表空间中所有区的分配情况。
位图分配区示意图
Oracle为每个可能的区保留一位。该位为1,表示使用;该位为0,表示空闲。位图图像消耗64K的表空间。当在表空间中分配新的区或回收已分配的区时,Oracle将对数据文件中的位图进行更新,这种更新不是对表的更新操作,所以不会产生回退信息和重做信息,因此这种管理方式比字典管理方式效率高。
在本地管理方式下,可以用如下两个选项来指定表空间的分配方式。
●统一(UNIFORM):统一分配,指定表空间中所有的区的大小都相同,区的大小的默认值是1M,也可以人工指定大小。但不能撤销表空间中的这个选项。
●自动(AUTOALLOCATE或SYSTEM):自动分配,由Oracle系统自动管理区的大小,这个选项是系统默认设置。
表大小与区大小的对应关系表
附件:
当表的大小小于64KB时,表中每个区的大小为64KB,当表的大小达到1MB时,表中每个区的大小为1MB,当表的大小超过64MB且小于1000MB时,区的大小是8MB,当表的大小超过1000MB时,区的大小为64MB。这个算法可以实现小表取小区,大表取大区,可以避免大表占用过多的区。所以,自动选项最适合由小表和大表构成一个多用途的数据库系统。但如果数据是超过1GB的大表,系统在分配磁盘空间时一次分配64MB,如果所插入的数据没有达到64MB,则可能造成空间的浪费。
一般情况下,使用自动分配是最佳的选择。对于DBA来说,不需要对区的分配和回收的存储管理太多关注。通过系统自动分配,将存储管理交给Oracle自动完成。
2.段空间管理方式
在本地管理方式的表空间中,除了可以使用UNIFORM,AUTOALLOCATE来指定区的分配方式,还可以指定段空间管理方式。段空间管理方式是指Oracle用来管理段中已用数据块和空闲块的机制。 在本地管理方式下,可以用下面两个关键字来指定表空间的段空间管理方式。
●MANUAL(手动):这时Oracle将使用空闲列表(free list)来管理段的空闲数据块。这是为了与以前的版本相兼容而保留的。
●AUTO(自动):这时Oracle将使用位图(bitmap)来管理段中已使用数据块和空闲数据块。即,通过位图中单元的取值来判断段中数据块是否可用。
空闲列表是传统的段管理方式,段中所有的空闲数据块都被放入一个空闲列表( free list)中,在需要存储空间时就在该列表中进行搜索。与空闲列表相比,使用位图的自动方式能够提供更好的存储利用率,并且简化管理工作量。
在自动方式下,用户不需要指定PCTFREE、PCTUSED、FREELIST、GROUP等参数来为段设置存储管理方式,假如你设置了,也将被系统忽略。
例:通过dba_tablespaces数据字典视图,可以查询当前数据库中各个表空间的区、段空间的管理方式
附件:
从逻辑上说数据库由多个表空间组成。DBA通过创建表空间为数据库建立存储空间,并且把各种类型的应用数据存放在不同的表空间中。在数据库运行过程中,DBA应该根据需要对表空间进行维护和管理。
表空间的管理主要包括确定表空间大小,创建、修改和删除表空间,选择修改表空间的区和段管理方式,设置表空间状态等。可以通过将表空间设置为脱机或联机状态,改变表空间的可用性,也可以为用户分配表空间配额。
表空间是用来存储表、索引中的数据的。表空间的大小取决于所包含的表和索引的数量。
确定表大小
确定表的大小需要关注下面几个问题:
●每行大约多少字节
●该表最初或最少要包含多少行
●每个时间段(如周、月、年)该表行的增长情况
●在该表进行的操作类型(插入、更新、删除)
●哪种操作类型比较多
●需要多少预留空间
例 查询数据字典视图(select * from user_tab_columns;),可以根据该表的各个列的数据类型来确定各个列的最大长度。(部分)
SQL> select * from user_tab_columns;
TABLE_NAME COLUMN_NAME
------------------------------ ------------------------------
DATA_TYPE
--------------------------------------------------------------------------------
DAT DATA_TYPE_OWNER DATA_LENGTH DATA_PRECISION DATA_SCALE N
--- ------------------------------ ----------- -------------- ---------- -
COLUMN_ID DEFAULT_LENGTH
---------- --------------
DATA_DEFAULT
--------------------------------------------------------------------------------
NUM_DISTINCT LOW_VALUE
------------ ----------------------------------------------------------------
HIGH_VALUE DENSITY
---------------------------------------------------------------- ----------
NUM_NULLS NUM_BUCKETS LAST_ANAL SAMPLE_SIZE
---------- ----------- --------- -----------
CHARACTER_SET_NAME CHAR_COL_DECL_LENGTH GLO USE
-------------------------------------------- -------------------- --- ---
AVG_COL_LEN CHAR_LENGTH C V80 DAT HISTOGRAM
----------- ----------- - --- --- ---------------
ACCESS$ D_OBJ#
TABLE_NAME COLUMN_NAME
------------------------------ ------------------------------
DATA_TYPE
--------------------------------------------------------------------------------
DAT DATA_TYPE_OWNER DATA_LENGTH DATA_PRECISION DATA_SCALE N
--- ------------------------------ ----------- -------------- ---------- -
COLUMN_ID DEFAULT_LENGTH
---------- --------------
DATA_DEFAULT
--------------------------------------------------------------------------------
NUM_DISTINCT LOW_VALUE
------------ ----------------------------------------------------------------
HIGH_VALUE DENSITY
---------------------------------------------------------------- ----------
NUM_NULLS NUM_BUCKETS LAST_ANAL SAMPLE_SIZE
---------- ----------- --------- -----------
CHARACTER_SET_NAME CHAR_COL_DECL_LENGTH GLO USE
-------------------------------------------- -------------------- --- ---
AVG_COL_LEN CHAR_LENGTH C V80 DAT HISTOGRAM
----------- ----------- - --- --- ---------------
NUMBER
TABLE_NAME COLUMN_NAME
------------------------------ ------------------------------
DATA_TYPE
--------------------------------------------------------------------------------
DAT DATA_TYPE_OWNER DATA_LENGTH DATA_PRECISION DATA_SCALE N
--- ------------------------------ ----------- -------------- ---------- -
COLUMN_ID DEFAULT_LENGTH
---------- --------------
DATA_DEFAULT
--------------------------------------------------------------------------------
NUM_DISTINCT LOW_VALUE
------------ ----------------------------------------------------------------
HIGH_VALUE DENSITY
---------------------------------------------------------------- ----------
NUM_NULLS NUM_BUCKETS LAST_ANAL SAMPLE_SIZE
---------- ----------- --------- -----------
CHARACTER_SET_NAME CHAR_COL_DECL_LENGTH GLO USE
-------------------------------------------- -------------------- --- ---
AVG_COL_LEN CHAR_LENGTH C V80 DAT HISTOGRAM
----------- ----------- - --- --- ---------------
22 N
TABLE_NAME COLUMN_NAME
------------------------------ ------------------------------
DATA_TYPE
--------------------------------------------------------------------------------
DAT DATA_TYPE_OWNER DATA_LENGTH DATA_PRECISION DATA_SCALE N
--- ------------------------------ ----------- -------------- ---------- -
COLUMN_ID DEFAULT_LENGTH
---------- --------------
DATA_DEFAULT
--------------------------------------------------------------------------------
NUM_DISTINCT LOW_VALUE
------------ ----------------------------------------------------------------
HIGH_VALUE DENSITY
---------------------------------------------------------------- ----------
NUM_NULLS NUM_BUCKETS LAST_ANAL SAMPLE_SIZE
---------- ----------- --------- -----------
CHARACTER_SET_NAME CHAR_COL_DECL_LENGTH GLO USE
-------------------------------------------- -------------------- --- ---
AVG_COL_LEN CHAR_LENGTH C V80 DAT HISTOGRAM
----------- ----------- - --- --- ---------------
1
TABLE_NAME COLUMN_NAME
------------------------------ ------------------------------
DATA_TYPE
--------------------------------------------------------------------------------
DAT DATA_TYPE_OWNER DATA_LENGTH DATA_PRECISION DATA_SCALE N
--- ------------------------------ ----------- -------------- ---------- -
COLUMN_ID DEFAULT_LENGTH
---------- --------------
DATA_DEFAULT
--------------------------------------------------------------------------------
NUM_DISTINCT LOW_VALUE
------------ ----------------------------------------------------------------
HIGH_VALUE DENSITY
---------------------------------------------------------------- ----------
NUM_NULLS NUM_BUCKETS LAST_ANAL SAMPLE_SIZE
---------- ----------- --------- -----------
CHARACTER_SET_NAME CHAR_COL_DECL_LENGTH GLO USE
-------------------------------------------- -------------------- --- ---
AVG_COL_LEN CHAR_LENGTH C V80 DAT HISTOGRAM
----------- ----------- - --- --- ---------------
…………
表大小计算公式
表的大小=最大行数x行x(1+PCTFREE/100)X预留的百分比
一个帮助理解的例子
假设要为一个企业的应用程序的表创建存储其数据的表空间(数据文件)。这些应用程序共有4个表,其中3个表(CUSTOMERS,BALANCES,OPTIONS)是相互关联的,属于一个应用程序,将这些表放在一个表空间中。另外一个表(RECORD_CALLS)比较大且独立,属于另外的应用,将其放在一个表空间。
从管理和性能上来说,这样的安排比较合理。从管理上看,把相关的表放入同一个表空间时,可以隔离应用程序中各个模块的依赖型。例如,一个模块需要维护,就可以将模块涉及的表空间脱机,不影响其它模块的运行。从性能上看,这会将不同的事务分配给不同的表空间,减少争用。
各个表的设计
附件:
tablespace2001.jpg [ 45.39 KiB | 被浏览 209 次 ]
通过分析上表可以看出,存储3个表(CUSTOMERS、BALANCES、OPTIONS)的表空间大小是86.5+29.7+80.5=196.7MB;存储一个表(RECORD_COLLS)的表空间的大小是433.9MB。创建这些表空间时,这些估计值可以作为初始大小。
一个表空间是由一个或多个数据文件组成的,表、索引、分区、大对象数据被创建在一个特定的表空间中(因此数据也存储在这个表空间的数据文件中)。表空间的配置实质上就是考虑应该如何创建层次结构的表空间(以便将表创建在相应的表空间中),以及将表空间中的数据文件安排在哪个磁盘中。
表空间层次结构
在创建数据库时都会自动建立系统表空间(SYSTEM和SYSAUX表空间)。Oracle仅在SYSTEM表空间中存储数据字典等Oracle自身的对象和数据,其它用户对象和数据则保存在其它表空间中。因此需要为系统创建其它非系统表空间。使用多个表空间允许用户在执行数据库操作时有更大的灵活性。
当一个数据库需要创建多个表空间时,注意下面策略:
●将用户数据和数据字典分别存放,避免数据字典对象和方案对象被保存在同一个数据文件中产生I/O冲突。
●一个应用程序的数据与另一个应用程序的数据分别存放,保证各个应用程序的数据的独立性,防止如果一个表空间必须脱机,则多个应用程序都受到影响的情况。
●在不同的磁盘驱动器上存储不同表空间的数据文件,以减少I/O冲突,平均分配I/O操作。
●撤销数据和用户数据分别存放,防止单个磁盘故障造成数据永久丢失。
●当其他表空间联机时,可以使某个表空间脱机,以便对数据库的某个应用或者某个部分进行单独备份恢复,提供更好的整体可用性。
●能够将某个表空间设置为只读状态,从而将数据库的一部分设置为只读状态。
●能够为某种特殊用途专门设置一个表空间,比如临时表空间,撤销表空间等,以优化表空间的使用效率。
●能够灵活地为用户设置表空间配额。
●某些操作系统对一个进程可以同时打开的文件数有限制。这些限制会影响同时联机的表空间数量。因此,为了避免超过操作系统的限制,在建立数据库时,应该仔细规划表空间的数量,尽量做到为不同类型的应用创建独立的表空间,并且只创建满足需求的足够的表空间。
●在创建表空间时,应当为表空间创建几个较大的数据文件或者将数据文件设置为自动增长方式,而不要为表空间创建很多很小的数据文件。
Oracle灵活体系结构(Oracle Flexible Architecture,OFA)的目标之一就是通过把每个类型的数据放入不同的磁盘(对应于数据文件,即对应于表空间)中,以分隔应用程序数据和系统数据。
创建表空间的原因如下:
●创建附加表空间后,就不必一定使用USER表空间来储存用户数据
●如果将某些用户、用户组或应用程序的数据,存储到单独的表空间或表空间组中,就会使备份、恢复和管理更加方便。这样,就不会影响其它数据库应用程序的操作。
●某些具有大的分区表的应用程序可以从将数据分布到多个表空间。这可以将经常访问的数据放置到高性能的磁盘中,而将不经常访问的数据放在性能低的磁盘内。
用户必须拥有create tablespace系统权限才能创建表空间。
所有的表空间都应该由SYS用户(数据字典的所有者)创建。
创建表空间应该先创建一个文件夹(或子目录),以便将新的表空间的数据文件(一个表空间必须有一个数据文件)分配到相应的文件夹中。当通过添加数据文件来创建表空间时,应该指出大小和完全限定的文件名。Oracle会按所指定的信息来自动创建和格式化数据文件。
在表空间的创建中,Oracle将完成下面几项工作:
●在数据字典和控制文件中记录新创建的表空间。
●在操作系统中按指定的位置和文件名创建指定大小的操作系统文件,作为该表空间对应的数据文件。
●在警告文件中记录下创建表空间的信息。
和表空间相关的一些操作:
查询空闲空间
select tablespace_name,sum(bytes)/1024/1024 from dba_free_space group by tablespace_name;
修改文件大小语句如下
alter database datafile '需要增加的数据文件路径'resize 800M;
创建表空间
create tablespace sales datafile '/home/app/oracle/oradata/oracle8i/sales01.dbf'
size 800M autoextend on next 50M maxsize unlimited
extent management local autoallocate;
临时表空间
create temporary tablespace temp1
tempfile '/home/app/oracle/oradata/oracle8i/temp01.dbf' size 800M
autoextend on maxsize 1000M
UNDO 表空间
create undo tablespace UNDOTBS1 datafile 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\UNDOTBS01.DBF' size 20M;
给用户分配quota
alter user TEST quota unlimited on example;
grant unlimited tablespace to TEST