Oracle 11g表空间——创建和扩展(永久)表空间本文内容创建(永久)表空间查看表空间扩展表空间创建(永久)表空间Oracle 按照区和段空间进行管理表空间。
区管理方式 - 针对区的分配方式的不同,有两种方式:字典管理方式(dictionary-managed tablespace,DMT)和本地管理方式(local-managed tablespace,LMT)。
Oracle 10g 开始强烈建议使用 LMT 方式。
从 Oracle 9i 开始,创建表空间时默认使用 LMT。
其中,LMT 区的分配方式:统一(UNIFORM)- 统一分配。
指定表空间中所有区的大小都相同。
默认值是 1MB。
自动(AUTOALLOCATE 或 SYSTEM)- 自动分配。
指定有 Oracle 系统来自动管理区的大小。
这是默认设置。
段管理方式– LMT 方式,除了可以指定区的分配方式外,还可以指定段的管理方式。
段空间管理方式主要是指 Oracle 用来管理段中已用数据块和空闲数据块的机制。
分为两种:手动(MANUAL)- Oracle 将使用空闲列表(free list)管理段的已用数据块和空闲数据块。
这是传统的段空间管理方式,为了与以前的版本兼容。
自动(AUTO)- Oracle 将使用位图(bitmap)来管理段的已用数据块和空闲数据块。
通过位图中单元的取值判断段中的数据块是否可用。
字典管理方式没有段管理。
下面示例演示用本地管理方式创建表空间。
这是 Oracle 推荐的方式。
示例 1:使用 AUTOALLOCATE 区分配方式。
创建表空间 mytbs01,数据文件是D:\oracledata\mytbs01_1.dbf,大小为 2M,并指定区分配方式为 AUTOALLOCATE。
create tablespace mytbs01datafile 'D:\oracledata\mytbs01_1.dbf' size 2Mautoallocate;示例 2:使用 UNIFORM 区分配方式。
创建表空间 mytbs02,数据文件是D:\oracledata\mytbs02_1.dbf 和 D:\oracledata\mytbs02_2.dbf,有两个文件,大小分别为 1M 和 2M,并指定区分配方式为 UNIFORM。
create tablespace mytbs02 datafile 'D:\oracledata\mytbs02_1.dbf' size1M,'D:\oracledata\mytbs02_2.dbf' size 2M uniform size 128k;示例 3:使用数据文件扩展方式。
创建表空间 mytbs03,并指定数据文件扩展方式为自动增长,每次 1M,最大扩展到 11M。
create tablespace mytbs03datafile 'D:\oracledata\mytbs03_1.dbf' size 1Mautoextend on next 2M maxsize 11M;此时,就不能再指定 UNIFORM。
示例 4:使用 AUTO 段管理方式。
创建表空间 mytbs04,区分配管理方式为 UNIFORM ,大小为默认值;用 segment space management 指定段管理方式。
create tablespace mytbs04datafile 'D:\oracledata\mytbs04_1.dbf' size 3M reuseuniformsegment space management auto;查看表空间可以通过下面 Oracle 系统表查看上面创建的表空间的相关信息。
dba_tablespaces - 数据库表空间管理信息。
dba_data_files - 数据库表空间文件管理信息。
dba_free_space - 数据库表空间文件使用信息。
示例 5:表空间使用情况,包括表空间名称、DBF 文件个数、总大小、剩余/占用大小等等。
select a.tablespace_name as "表空间名称",c.pieces as "DBF文件个数",a.totalspace || 'M' as "总大小",b.freespace || 'M' as "剩余大小",a.totalspace - nvl(b.freespace, 0) || 'M' as "占用大小",c.max_blocks as "最大块",c.min_blocks as "最小块",c.avg_blocks as "平均块",c.sum_blocks as "块总数"from (select t1.tablespace_name, sum(t1.bytes) / 1024 / 1024 as totalspacefrom dba_data_files t1 group by t1.tablespace_name) a,(select t2.tablespace_name, sum(t2.bytes) / 1024 / 1024 as freespacefrom dba_free_space t2group by t2.tablespace_name) b,(select t.tablespace_name,count(*) as pieces,max(t.blocks) as max_blocks,min(t.blocks) as min_blocks,avg(t.blocks) as avg_blocks,sum(t.blocks) as sum_blocksfrom dba_free_space tgroup by t.tablespace_name) cwhere a.tablespace_name = b.tablespace_nameand b.tablespace_name = c.tablespace_name;示例 6:表空间信息参看,包括表空间名称、路径、类型、管理方式、区管理方式、段管理方式和是否自动增长。
select t1.tablespace_name as "表空间名称",t2.file_name as "文件名",t1.contents as "类型",t1.extent_management as "管理方式",t1.allocation_type as "区管理方式",t1.segment_space_management as "段管理方式",t2.autoextensible as "是否自动扩展",t1.status as "是否联机"from dba_tablespaces t1, dba_data_files t2where t1.tablespace_name = t2.tablespace_name;扩展表空间表空间在物理上是由保存在磁盘上的数据文件组成的,例如,示例 1 创建的表空间mybtb01,最大为 2MB。
假设里面有个表,当数据占满了 2MB 空间之后,如果继续向表插入数据,Oralce 就会因为在 mytbs01 表空间上已经没有足够的空闲空间,而显示错误信息。
创建数据文件时会指定大小。
为了提供更大的表空间,增加数据,必须扩展表空间。
通常扩展表空间有三种方式:添加数据文件改变数据文件大小允许数据文件自动扩展示例 7:添加数据文件。
为示例 1 的表空间 mytbs01 添加新的数据文件D:\ORACLEDATA\MYTBS01_2.DBF。
SQL> column tablespace_name format a15SQL> column file_name format a28SQL> column total format a5SQL> select t.tablespace_name,2 t.file_name,3 t.bytes / 1024 / 1024 || 'M' as total4 from dba_data_files t5 where t.tablespace_name = 'MYTBS01';TABLESPACE_NAM FILE_NAME TOTAL-------------- ---------------------------- -----MYTBS01 D:\ORACLEDATA\MYTBS01_1.DBF 2MSQL> alter tablespace mytbs012 add datafile 'd:\oracledata\mytbs01_2.dbf' size 3M;数据库已更改。
SQL> select t.tablespace_name,2 t.file_name,3 t.bytes / 1024 / 1024 || 'M' as total4 from dba_data_files t5 where t.tablespace_name = 'MYTBS01';TABLESPACE_NAM FILE_NAME TOTAL-------------- ---------------------------- -----MYTBS01 D:\ORACLEDATA\MYTBS01_1.DBF 2MMYTBS01 D:\ORACLEDATA\MYTBS01_2.DBF 3M扩展前先查看表空间 mytbs01 数据文件情况。
再为表空间 mytbs01 添加新的数据文件。
示例 8:改变数据文件大小。
在示例 7 基础上,扩展表空间 mytbs01 数据文件D:\ORACLEDATA\MYTBS01_2.DBF 的大小。
SQL> column tablespace_name format a15SQL> column file_name format a28SQL> column total format a5SQL> select t.tablespace_name,2 t.file_name,3 t.bytes / 1024 / 1024 || 'M' as TOTAL4 from dba_data_files t5 where t.tablespace_name = 'MYTBS01';TABLESPACE_NAM FILE_NAME TOTAL-------------- ---------------------------- -----MYTBS01 D:\ORACLEDATA\MYTBS01_1.DBF 2MMYTBS01 D:\ORACLEDATA\MYTBS01_2.DBF 3MSQL> alter database2 datafile 'd:\oracledata\mytbs01_2.dbf'3 resize 4M;数据库已更改。