最近在工作中遇到有同事对Oracle表空间的理解有问题,所以写了这篇文章。我会从概念,管理及特别需要关注的点等几个维度对表空间进行一些介绍。本文以介绍表空间为主,涉及到的其他概念不展开描述。有问题的地方希望大家指正。

表空间概念

表空间属于逻辑结构,是Oracle物理结构与逻辑结构之间的桥梁。官方文档上是这样说的:

A tablespace is a logical storage container for segments. Segments are database objects, such as tables and indexes, that consume storage space. At the physical level, a tablespace stores data in one or more data files or temp files.

表空间在逻辑上包含段(常见的段有表和索引),段数据存储开销的存储空间由表空间提供;在物理上将数据存储在一个或多个数据文件或临时数据文件中。

一个数据库必须包含 SYSTEM 和 SYSAUX 表空间。下图是一个典型的数据库表空间示意图。

图1:表空间示意图

表空间分类

表空间大层面上可以分为永久表空间临时表空间。我们通常所说的表空间指的都是永久表空间,以下如无特殊说明,提到表空间的地方默认都是指永久表空间。

永久表空间(Permanent Tablespaces)

永久表空间用来持久化存储用户对象数据。表空间中的用户对象数据最终物理的保存在表空间对应的数据文件上。

永久表空间的主要作用

  • 控制数据库数据的磁盘空间分配;
  • 为数据库用户指定配额;
  • 在不影响整体数据库可用性的情况下,为各表空间独立进行离线/上线操作;
  • 对各个表空间独立进行备份恢复;
  • 使用数据泵(Oracle Data Pump)工具进行数据的导入导出;
  • 通过传输表空间,将表空间从一个数据库复制或移动到另一个数据库,甚至可以跨平台;

通过传输表空间移动数据要比导出/导入相同数据快几个数量级,因为传输表空间只涉及复制数据文件和集成表空间元数据。在传输表空间时,还可以移动索引数据。

XTTS(跨平台传输表空间)技术是现在最常用的数据迁移技术之一,其具备跨平台,跨版本迁移数据库的特点。

SYSTEM表空间

SYSTEM表空间是数据库创建时生成的一个必须的管理表空间,Oracle通过SYSTEM表空间来管理数据库。

SYSTEM表空间中所有对象的所有者都时SYS用户,主要包含以下信息:

  • 数据字典;
  • 数据库管理信息;
  • 已编译的存储对象,如触发器、存储过程、包等;

SYSAUX表空间

SYSAUX表空间是SYSTEM表空间的辅助表空间。因为SYSAUX是许多Oracle数据库特性和产品(OEM,audit,AWR等)的默认表空间,这些特性和产品以前都需要自己的表空间,所以SYSAUX减少了数据库所需的表空间数量,还减少了系统表空间的负载。

在正常的数据库操作期间,数据库不允许删除或重命名SYSAUX表空间。如果SYSAUX表空间变得不可用,那么核心数据库功能仍然可以运行。使用SYSAUX表空间的数据库特性可能会失效,或者功能受限。

UNDO表空间

用来保存UNDO数据的表空间。Oracle官方建议UNDO使用自动管理模式。

一个数据库可以包含多个UNDO表空间,但一次只能使用一个。当实例打开数据库时,会自动选择第一个可用的UNDO表空间,如果没有可用的UNDO表空间,实例会将UNDO数据存放到SYSTEM表空间中,这是极其不推荐的。

UNDO是Oracle非常核心的功能,关于UNDO的管理以后会单独写文章。

临时表空间(Temporary Tablespaces)

临时表空间只包含会话期间留存的临时数据,不能存储持久化数据。临时表空间的数据存储在临时表空间文件上,与普通数据文件有区别。

临时表空间可以改善不适合内存排序的排序操作的并发性,同时改善排序期间空间管理的效率。(设计阶段应尽量避免非内存排序)

每个数据库用户都会分配一个默认临时表空间,可以在创建用户时指定,如果没有指定,则默认使用系统级别的默认临时表空间。

表空间大小

表空间空间管理方面可以分为大文件表空间(bigfile)和小文件(smallfile)表空间。默认创建的表空间都是小文件表空间。

小文件表空间最多支持1024个数据文件,每个数据文件最大32G(8K标准块),整个表空间最大32T;

大文件表空间有且仅有一个数据文件,最大32T(8K标准块)。

表空间管理

创建表空间

基本语法:

CREATE [BIGFILE/SMALLFILE] TABLESPACE tnsname
DATAFILE
[dbfpath] SIZE dbfsize [AUTOEXTEND ON] [NEXT nextsize] [MAXSIZE maxsize],
...;

[  ]里面内容可选项;
tnsname 根据需要自己定义;
dbfpath 表示数据文件路径,在使用OMF的情况下,可以不写;否则要保证路径中的目录存在;
dbfsize 为初始表空间大小,单位为K,M,G,T(建议初始值做好规划,一次给到位);
AUTOEXTEND 是否自动扩展,值为ON或OFF;
nextsize 为扩展时的一次扩展的大小(根据I/O性能及表空间增长情况设置适当值,不要太小);
maxsize 为文件最大大小,指定UNLIMITED时表示不限大小(此时仍然受到单个数据文件32G(smallfile 8K)/32T(bigfile 8K)的限制);
如果表空间计划使用的会非常大,可以直接创建多个数据文件或使用bigfile表空间。

encryption,nologging,compression等高级特性不在这里详细解释,需要使用时查询官方文档;
区管理和段空间管理使用默认值即可,不用设置(EXTENT MANAGEMENT LOCAL  SEGMENT SPACE MANAGEMENT AUTO)。

示例:

CREATE TABLESPACE lmtbsb DATAFILE
'/u02/oracle/data/lmtbsb01.dbf' SIZE 500M AUTOEXTEND ON NEXT 50M MAXSIZE UNLIMITED,
'/u02/oracle/data/lmtbsb02.dbf' SIZE 500M AUTOEXTEND ON NEXT 50M MAXSIZE UNLIMITED;

CREATE BIGFILE TABLESPACE bigtbs DATAFILE
'/u02/oracle/data/bigtbs.dbf' SIZE 50G AUTOEXTEND ON NEXT 50M MAXSIZE UNLIMITED; 

扩展表空间

扩展表空间有两种情况(针对smallfile表空间),扩展数据文件,增加数据文件。当单个数据文件扩展到最大限制后,还需要扩展时,必须选择增加数据文件。

基本语法:

扩展数据文件:

ALTER DATABASE DATAFILE [file_name/file_id] RESIZE filesize [AUTOEXTEND ON] [NEXT nextsize] [MAXSIZE maxsize];

增加数据文件:

ALTER TABLESPACE tbsname ADD DATAFILE dbfpath SIZE dbfsize [AUTOEXTEND ON] [NEXT nextsize] [MAXSIZE maxsize];

这里的file_name/file_id可以通过DBA_DATA_FILES查询得到;

tbsname是需要扩展的表空间名,必须是存在的表空间,必须是smallfile表空间;

可以同时对数据文件的其他属性进行设置,具体设置项不再一一描述。

示例:

ALTER DATABASE DATAFILE '/u02/oracle/data/lmtbsb01.dbf' RESIZE 1G;

ALTER TABLESPACE lmtbsb ADD DATAFILE '/u02/oracle/data/lmtbsb03.dbf' SIZE 500M AUTOEXTEND ON NEXT 50M MAXSIZE UNLIMITED;

删除表空间

删除表空间属于极度高危的操作,生产环境谨慎操作。

基本语法:

--仅删除表空间
DROP TABLESPACE tnsname;
--删除表空间及数据文件
DROP TABLESPACE tnsname INCLUDING CONTENTS AND DATAFILES;

示例:

DROP TABLESPACE lmtbsb;

DROP TABLESPACE bigtbs INCLUDING CONTENTS AND DATAFILES;

表空间相关数据字典视图和动态性能视图

DBA_TABLESPACES :描述数据库中的所有表空间
DBA_DATA_FILES :描述数据库中的所有数据文件
DBA_SEGMENTS :描述数据库中的所有段存储分配情况
DBA_FREE_SPACE :描述数据库中所有表空间的空闲区情况
DBA_HIST_TBSPC_SPACE_USAGE :显示历史表空间的使用情况的统计信息
V$TABLESPACE :显示控制文件中的表空间信息
V$DATAFILE :显示控制文件中的数据文件信息

表空间相关查询

--查询表空间使用率
SELECT d.tablespace_name "Name", d.status "Status",
       TO_CHAR (NVL (a.BYTES  , ), '99,999,990.90') "Size (M)",
          TO_CHAR (NVL (a.BYTES ), )  ,
                   '99,999,990.99'
                  ) USE,
       TO_CHAR (NVL ((a.BYTES )) , ),
                '990.00'
               ) "Used %"
  FROM SYS.dba_tablespaces d,
       (SELECT   tablespace_name, SUM (BYTES) BYTES
            FROM dba_data_files
        GROUP BY tablespace_name) a,
       (SELECT   tablespace_name, SUM (BYTES) BYTES
            FROM dba_free_space
        GROUP BY tablespace_name) f
 WHERE d.tablespace_name = a.tablespace_name(+)
   AND d.tablespace_name = f.tablespace_name(+)
   AND NOT (d.extent_management LIKE 'LOCAL' AND d.CONTENTS LIKE 'TEMPORARY')
UNION ALL
SELECT d.tablespace_name "Name", d.status "Status",
       TO_CHAR (NVL (a.BYTES  , ), '99,999,990.90') "Size (M)",
          TO_CHAR (NVL (t.BYTES, )  , '99,999,990.99') USE,
       TO_CHAR (NVL (t.BYTES , ), '990.00') "Used %"
  FROM SYS.dba_tablespaces d,
       (SELECT   tablespace_name, SUM (BYTES) BYTES
            FROM dba_temp_files
        GROUP BY tablespace_name) a,
       (SELECT   tablespace_name, SUM (bytes_cached) BYTES
            FROM v$temp_extent_pool
        GROUP BY tablespace_name) t
 WHERE d.tablespace_name = a.tablespace_name(+)
   AND d.tablespace_name = t.tablespace_name(+)
   AND d.extent_management LIKE 'LOCAL'
   AND d.CONTENTS LIKE 'TEMPORARY'
   ORDER BY USE DESC;

--查询表空间增长率

col inc_ratex for a8
  SELECT A.NAME,
         B.TABLESPACE_ID,
         B.DATETIME,
         B.USED_SIZE_MB,
         B.INC_MB,
         CASE
            , ) = '.'
            THEN
               ' || INC_RATE
            , ) = '-.'
            THEN
               , LENGTH (INC_RATE))
            ELSE
               INC_RATE
         END
            AS INC_RATEX
    FROM V$TABLESPACE A,
         (SELECT TABLESPACE_ID,
                 DATETIME,
                 USED_SIZE_MB,
                 (DECODE (PREV_USE_MB, , , USED_SIZE_MB) - PREV_USE_MB)
                    AS INC_MB,
                    TO_CHAR (
                       ROUND (
                            (  DECODE (PREV_USE_MB, , , USED_SIZE_MB)
                             - PREV_USE_MB)
                          , , PREV_USE_MB)
                          ,
                          ))
                 || '%'
                    AS INC_RATE
            FROM (  SELECT TABLESPACE_ID,
                           TRUNC (TO_DATE (RTIME, 'mm/dd/yyyy hh24:mi:ss'))
                              DATETIME,
                            )
                              USED_SIZE_MB,
                           LAG ( ), , )
                              OVER (
                                 PARTITION BY TABLESPACE_ID
                                 ORDER BY
                                    TRUNC (
                                       TO_DATE (RTIME, 'mm/dd/yyyy hh24:mi:ss')))
                              AS PREV_USE_MB
                      FROM DBA_HIST_TBSPC_SPACE_USAGE
                     WHERE TRUNC (TO_DATE (RTIME, 'mm/dd/yyyy hh24:mi:ss')) >
                           TRUNC (SYSDATE )
                  GROUP BY TABLESPACE_ID,
                           TRUNC (TO_DATE (RTIME, 'mm/dd/yyyy hh24:mi:ss')))) B
   WHERE A.TS# = B.TABLESPACE_ID
ORDER BY B.TABLESPACE_ID, DATETIME;

本文主要参考文献为Oracle 12.2官方文档 ==>Database Concepts==>Part IV Oracle Database Storage Structures==>12 Logical Storage Structures==>Overview of Tablespaces

Oracle表空间概述及其基本管理的更多相关文章

  1. Oracle 表空间和用户权限管理

    一. 表空间 Oracle数据库包含逻辑结构和物理结构. 数据库的物理结构指的是构成数据库的一组操作系统文件. 数据库的逻辑结构是指描述数据组织方式的一组逻辑概念以及它们之间的关系. 表空间是数据库逻 ...

  2. Oracle 表空间和用户权限管理【转】

    一. 表空间 Oracle数据库包含逻辑结构和物理结构. 数据库的物理结构指的是构成数据库的一组操作系统文件. 数据库的逻辑结构是指描述数据组织方式的一组逻辑概念以及它们之间的关系. 表空间是数据库逻 ...

  3. Oracle 表空间的创建与管理

    Oracle数据库创建之后有一些默认的表空间随之被创建,查询数据字典 dba_data_files 可以得到数据库当前的所有表空间信息. select * from v$tablespace; sel ...

  4. Oracle表空间管理

    oracle表空间相关常用命令小结: 1.ALTER DATABASE SET DEFAULT BIGFILE TABLESPACE;              //修改表空间数据文件类型 2.ALT ...

  5. Oracle 表空间的日常维护与管理

    目录 Oracle 表空间的日常维护与管理 1.创建数据表空间 2.创建临时表空间 3.创建 UNDO 表空间 4.表空间的扩展与修改大小 5.表空间重命名 6.表空间的删除 7.更改表空间的读写模式 ...

  6. Oracle 表空间详解

    目录 目录 表空间概述 表空间的分类 默认表空间 查看默认的永久表空间 查看默认的TEMP表空间 查看默认的表空间类型 逻辑结构到物理结构的映射 对表空间的操作 查看表空间使用情况 查看数据库拥有的表 ...

  7. Oracle表空间,用户,用户授权

    一:Oracle表空间 1,Oracle表空间与SQL Server文件组对比 SQL Server的文件组(文件组包括若干MDF,NDF数据文件)对我们来说并不陌生,前段时间我在博客“怎样玩转千万级 ...

  8. oracle表空间相关

    数据库被划分为若干个表空间,每个表空间内保存一组相关的逻辑对象.每个表空间由一个或者多个数据文件组成.oracle中的数据逻辑上存储在表空间里,物理上存储在属于该表空间的数据文件里.表空间是用户和物理 ...

  9. 【转】Oracle 表空间与数据文件

    --============================== --Oracle 表空间与数据文件 --============================== /* 一.概念 表空间:是一个或 ...

随机推荐

  1. Java安装完毕后的环境配置

    右键计算机=>属性=>高级系统设置=>环境变量=>系统变量=>新建系统变量 变量名:JAVA_HOME变量值:E:\Program Files\Java\jdk-9.0. ...

  2. H3C 传输层

  3. poj 3572 Hanoi Tower

    Hanoi Towers Time Limit : 10000/5000ms (Java/Other) Memory Limit : 131072/65536K (Java/Other) Total ...

  4. Attention is all your need 谷歌的超强特征提取网络——Transformer

    过年放了七天假,每年第一件事就是立一个flag——希望今年除了能够将技术学扎实之外,还希望能够将所学能够用来造福社会,好像flag立得有点大了.没关系,套用一句电影台词为自己开脱一下——人没有梦想,和 ...

  5. 精选Pycharm里6大神器插件

    http://www.sohu.com/a/306693644_752099 上次写了一篇关于Sublime的精品插件推荐,有小伙伴提议再来一篇Pycharm的主题.相比Sublime,Pycharm ...

  6. 程序中打开IE浏览器并访问指定地址

    最简单的方法 Process.Start("iexplore.exe");  //直接打开IE浏览器(打开默认首页)            Process.Start(" ...

  7. HDU 1071

    题意:就是求给你一个抛物线的三个点,第一个给定的点是抛物线的顶点,让你求直线p2p3与抛物线的定积分 思路:因为题目条件给了顶点,所以直接用抛物线的顶点式去求. 本弱弱数学太差.还得复习一下公式 #i ...

  8. siblings() 获得匹配集合中每个元素的同胞

    定义和用法 siblings() 获得匹配集合中每个元素的同胞,通过选择器进行筛选是可选的. 如果给定一个表示 DOM 元素集合的 jQuery 对象,.siblings() 方法允许我们在 DOM ...

  9. Python--day31--TCP的长链接

  10. 报错:org.springframework.beans.factory.BeanCreationException

    报错码为以下内容,把自己走的坑贴出来,免得大家如同样的坑.以下解决方法仅供参考. ERROR [RMI TCP Connection(3)-127.0.0.1] - Context initializ ...