Oracle 表空间管理
概念
表空间用于组织管理实体数据文件
Oracle stores data logically in tablespaces and physically in datafiles associated with the corresponding tablespace.[1]

自Oracle 10g后,Oracle提供两类表空间BigFile Tablespace,BFT和SmallFile Tablespace,SFT,分别支持不同类型的datafiles,关于这两类表空间详细内容,可以参考此文[2]。本文主要以SmallFile Tablespace类型表空间实现为主,这也目前Oracle默认的表空间设置。
创建

以表空间所属用户身份登录
-- 表空间名 tb_name
create tablespace tb_name  
-- 开启log
logging  
-- 指定数据文件存放路径及文件名
datafile 'D:/app/Administrator/oradata/user_data.dbf'
-- 初始大小
size 50m  
-- 自动拓展 开
autoextend on  
-- 每次自动拓展大小
next 50m maxsize unlimited
extent management local;  查询
查询已有表空间
SELECT a.tablespace_name                        "表空间名",
       total                                    "表空间大小",
       free                                     "表空间剩余大小",
       ( total - free )                         "表空间使用大小",
       Round(( total - free ) / total, 4) * 100 "使用率   %"
FROM   (SELECT tablespace_name,
               Sum(bytes) free
        FROM   DBA_FREE_SPACE
        GROUP  BY tablespace_name) a,
       (SELECT tablespace_name,
               Sum(bytes) total
        FROM   DBA_DATA_FILES
        GROUP  BY tablespace_name) b
WHERE  a.tablespace_name = b.tablespace_name扩展
根据官方文档说明,扩展表空间有两种方式
- Add a datafile to a tablespace
 - Increase the size of a datafile
 
第一种用于扩展系统表空间或其他已经存在的表空间
第二种用于直接拓展datafile大小,如果创建时设置了自动拓展就无需设置了


第一种实现如下
ALTER TABLESPACE tb_name 
-- 不要跟已有文件冲突
ADD DATAFILE 'D:/app/Administrator/oradata/user_data_1.dbf'
-- 初始大小
size 50m 
-- 自动拓展 开
autoextend on 
-- 每次自动拓展大小 可以设置大一些
next 1024m maxsize unlimited;收缩
删除表或者删除较多内容后,datafile文件不会自动缩减,可以通过resize方式重置表空间大小。用下面代码可以生成不同datafile的resize方案,再分别执行。
SELECT /*+ ordered use_hash(a,c) */   
    'alter database datafile '''
    || a.file_name
    || ''' resize '
    || round(a.filesize -(a.filesize - c.hwmsize - 100) * 0.8)
    || 'M;',
    a.filesize,
    c.hwmsize
FROM
    (
        SELECT
            file_id,
            file_name,
            round(bytes / 1024 / 1024) filesize
        FROM
            dba_data_files
    )  a,
    (
        SELECT
            file_id,
            round(MAX(block_id) * 8 / 1024) hwmsize
        FROM
            dba_extents
        GROUP BY
            file_id
    )  c
WHERE
        a.file_id = c.file_id
    AND a.filesize - c.hwmsize > 100对于TEMP表空间,可以采用shrink方式[3],与之相关还有move操作,可阅读相关文章[4]
-- 查询temp表空间情况
 select * from dba_temp_free_space;
-- 收缩
  alter tablespace temp shrink space;Reference
本文最后更新于:2021年4月22日 下午
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。