欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

Oracle 架构表空间详解

最编程 2024-10-04 21:01:24
...

文章目录

  • 1 表空间介绍
    • 1.1 简介
    • 1.2 表空间分类
      • 1.2.1 SYSTEM 表空间
      • 1.2.2 SYSAUX 表空间
      • 1.2.3 UNDO 表空间
      • 1.2.4 USERS 表空间
    • 1.3 表空间字典与本地管理
      • 1.3.1 字典管理表空间(Dictionary Management Tablespace,DMT)
      • 1.3.2 本地管理方式的表空间(Local Management Tablespace,LMT)
    • 1.4 表空间的创建与管理
      • 1.4.1 表空间的创建
      • 1.4.2 Oracle大文件表空间
      • 1.4.3 修改表空间
        • 1.4.3.1 修改 AUTOEXTEND
        • 1.4.3.2 修改表空间数据文件大小
      • 1.4.4 为表空间添加数据文件
      • 1.4.5 重命名表空间数据文件
        • 1.4.5.1 alter tablespace
        • 1.4.5.2 alter database
      • 1.4.6 表空间属性操作
        • 1.4.6.1 修改表空间的读写属性
        • 1.4.6.2 表空间的脱机与联机
        • 1.4.6.3 数据文件的脱机与联机
      • 1.4.7 删除表空间
        • 1.4.7.1 删除数据文件
        • 1.4.7.2 删除表空间
    • 1.5 设置用户的默认表空间
      • 1.5.1 查看数据库的默认表空间
      • 1.5.2 修改数据库的默认表空间
      • 1.5.3 查看用户的默认表空间
      • 1.5.4 创建新用户,指定或者不指定默认表空间
    • 1.6 临时表空间管理
      • 1.6.1 简介
      • 1.6.2 查看临时表空间信息
      • 1.6.3 创建临时表空间
      • 1.6.4 设置默认临时表空间
      • 1.6.5 使用临时表空间组
    • 1.7 undo 表空间管理
      • 1.7.1 相关参数
      • 1.7.2 管理方式
        • 1.7.2.1 AUTO:自动管理
        • 1.7.2.2 MANUAL:手工管理
      • 1.7.3 与 undo 表空间有关的数据字典与动态视图
      • 1.7.4 管理 undo 表空间
        • 1.7.4.1 新建 undo 表空间
        • 1.7.4.2 修改 undo 表空间
        • 1.7.4.3 回退信息保留时间相关设置
        • 1.7.4.5 切换undo表空间
        • 1.7.4.6 删除undo表空间
    • 1.8 undo 表空间的应用:闪回技术
      • 1.8.1 简介
      • 1.8.2 闪回版本查询
      • 1.8.3 闪回事务查询(Flashback Transaction Query)
      • 1.8.4 闪回删除
        • 1.8.4.1 禁用和启用回收站
        • 1.8.4.2 查看回收站中的信息
        • 1.8.4.3 使用闪回删除恢复被删除(Drop)的表
        • 1.8.4.4 清除回收站中的对象
      • 1.8.5 闪回表
      • 1.8.6 闪回数据归档(Flashback Data Archive )
      • 1.8.6 闪回数据库
        • 1.8.6.1 简介
        • 1.8.6.2 操作

1 表空间介绍

1.1 简介

Oracle数据库开创性地提出了 表空间(tablespaces) 的设计理念,Oracle中很多优化都是基于表空间实现的。表空间是ORACLE数据库恢复的最小单位,容纳着许多数据库对象,如表、视图、索引、聚簇、回退段和临时段等。
Oarcle 数据库真正存放数据的是数据文件,表空间(tablespaces)实际上是一个逻辑的概念,在物理上并不存在。

Oracle 使用表空间将相关的逻辑结构(如段、数据区等)组合在一起,表空间是数据库的最大逻辑划分区域,通常用来存放数据表、索引、回滚段等数据对象,任何数据对象在创建时都必须被指定存储在某个表空间中。

表空间(属逻辑存储结构)与数据文件(属物理存储结构)相对应,一个Oracle数据库可以有一个或多个表空间,一个表空间由一个或多个数据文件组成,一个数据文件只属于一个表空间; Oracle 数据的存储空间在逻辑上表现为表空间,而在物理上表现为数据文件。
举个例子来说,表空间相当于操作系统中的文件夹,而数据文件就相当于文件夹中的文件。每个数据库至少有一个表空间(即 SYSTEM 表空间), 表空间的大小等于所有从属于它的数据文件大小的总和

由于表空间在物理上(即磁盘上)包含操作系统中的一个或多个数据文件,因此在表空间中创建的数据对象就存在以下两种情况:

  • 若表空间只包含一个数据文件,则该表空间中的所有对象都存储在这个数据文件中。
  • 若表空间包含多个数据文件,则 Oracle 即可将数据对象存储在该表空间的任意一个数据文件中,也可以将同一个数据对象中的数据分布在表空间的多个数据文件中。

在创建数据库时, Oracle 系统会自动创建多个默认的表空间,这些表空间除了用于管理用户数据的表空间之外,还包括用于管理Oracle系统内部数据(如数据字典)的表空间。

1.2 表空间分类

表空间分为:系统表空间(system 表空间、sysaux 表空间)和非系统表空间(UNDO表空间、临时表空间、用户表空间、自定义表空间)。对应数据文件在$ORACLE_HOME\oradata\orcl下,分别为SYSTEM01.DBF,SYSAUX01.DBF,UNDOTBS01.DBF , TEMP01.DBF,USERS01.DBF。

表空间相关的视图包括:DBA_TABLESPACES(USER_TABLESPACES)、BA_DATA_FILES
与数据文件相关视图:V$DATAFILE
与临时文件相关视图:V$TEMPFILE,DBA_TEMP_FILES

查看表空间:

SQL> select name from v$tablespace;
SQL> select tablespace_name, file_name from dba_data_files;

1.2.1 SYSTEM 表空间

SYSTEM 表——系统表空间,用于存放 Oracle 系统内部表和数据字典的数据,如表名、列名、用户名等,系统表空间必须在任何时候都处于可用状态,也是数据库运行的必要条件。该表空间一旦损坏,数据库将无法打开。

Oracle 本身不赞成将用户创建的表、索引等存放在系统表空间中。表空间中的数据文件个数不是固定不变的,可以根据需要向表空间中追加新的数据文件

1.2.2 SYSAUX 表空间

SYSAUX 表空间是 Oracle 11g 新增加的表空间,是随着数据库的创建而创建的,它充当 SYSTEM的辅助表空间,降低了 SYSTEM 表空间的负荷,主要存储除数据字典以外的其他数据对象。
Oracle 将工具放到 sysaux 表空间,以减轻 system 表空间的压力。
SYSAUX表空间一般不存储用户的数据,由 Oracle 系统内部自动维护。

1.2.3 UNDO 表空间

UNDO 表空间——撤销表空间,用于存储撤销信息的表空间。当用户对数据表进行修改操作(包括插入、更新、删除等操作)时, Oracle 系统自动使用撤销表空间来临时存放修改前的旧数据。当所做的修改操作完成并执行提交命令后, Oracle 根据系统设置的保留时间长度来决定何时释放掉撤销表空间的部分空间。undo 表空间用于:事务的回滚;实例恢复(回滚);一致性读时需要构造 CR 块。

一般在创建 Oracle 实例后, Oracle 系统自动创建一个名字为“UNDOTBS1”的撤销表空间,该撤销表空间对应的数据文件是“UNDOTBS01.DBF”。

回退段的作用如下:

  • 为事务提供回退
    当事务执行失败或用户执行回滚操作(rollback)时,Oracle 会利用保存在回退段中的信息将数据恢复到原来的值;
  • 实例恢复
    当数据库实例运行失败,在数据库重新启动时,Oracle 先利用重做日志文件的信息对数据库进行恢复,再利用回退段中的信息回滚未提交的事务;
  • 提供读一致性
    当用户对数据进行修改时,会预先将其原始值保存到回退段中。此时,如果有其它用户访问该数据,则访问回退段中的信息,使当前用户未提交的修改其他用户无法看到,保证数据的一致性;
  • 提供对 DML 操作的闪回处理
    通过保留在回退段中的信息,用户可以查询某个数据在过去某个时刻的状态。

回退段的工作方式:

  • 当事务开始时,系统分配给该事务一个回退段。在事务的整个生命周期中,当数据发生改变时,数据的原始值被复制到回退段中。
  • 回退段采用循环写的方式进行工作,当事务写满回退段的一个区之后,会接着写入回退段的下一个区,当所有的区都写满后,事务开始循环写入到第一个区或者分配新的区(extent

1.2.4 USERS 表空间

USERS 表空间——用户表空间,是 Oracle 建议用户使用的表空间,可以在这个表空间上创建各种数据对象,比如创建表、索引、用户等数据对象

Oracle 系统的样例用户 SCOTT 对象就存放在 USERS表空间中。除了 Oracle 系统默认创建的表空间外,用户可根据应用系统的实际情况及其所要存放的对象类型创建多个自定义的表空间,以区分用户数据与系统数据。此外,不同应用系统的数据应存放在不同的表空间上,而不同表空间的文件应存放在不同的盘上,从而减少 I/O 冲突,提高应用系统的操作性能。

1.3 表空间字典与本地管理

在表空间中最小的空间分配单位,对表空间的管理是以为单位进行的。由于区(extent)是 Oracle 创建对象时的最小分配单元,所以表空间的管理实际上就是针对区的管理。 根据管理方式不同,表空间分为本地管理表空间(Oracle11g 默认采用本地管理方式的表空间)和字典管理表空间

1.3.1 字典管理表空间(Dictionary Management Tablespace,DMT)

由数据字典管理区。数据字典的信息存储在 system 表空间中,Oracle 服务器将在分配或回收区时更新数据字典中对应的表。使用数据字典管理存储空间的分配,当表空间分配新的区,或者回收已分配的区时,Oracle 会对数据字典对应的表进行查询、更新,并且会产生回退和重做信息。字典管理方式较为灵活,但效率要低得多。

用于管理表空间的数据字典表分别为:

  • UET ( UsedExtents,已使用的空间 ) ;
  • FET(FreeExtents,空闲空间)。

查看表空间管理方式:

 select tablespace_name,EXTENT_MANAGEMENT from dba_tablespaces;

EXTENT_MANAGEMENT 如果显示为 DICTIONARY 就是字典管理表空间。

字典管理表空间的工作方式:
当建立一个新的段或者段在表空间中请求新的空间时,Oracle 通过执行一系列的 SQL 语句来完成这个工作,这些工作包括从 FET$ 中找到可用的*空间,移动或增加相应的行到 UET$ 中,并在 FET$ 中删除相应的记录;当删除一个段的时候,Oracle 则移动 UET$ 中相应的行到 FET$。这个过程的发生是连续的、串行的,在繁忙的数据库中,这类操作极可能导致竞争和等待,产生数据字典的争用;
另一方面,当数据字典的表的信息被修改时,系统同样要记录 undoredo 信息,频繁的修改又不可避免地对整个数据库的性能产生影响。

字典管理表空间面临的另外一个严重问题是:空间碎片

1.3.2 本地管理方式的表空间(Local Management Tablespace,LMT)

从Oracle 8i 开始,Oracle 引入了一种全新的表空间管理方式:本地管理表空间
所谓本地化管理,就是指 Oracle 不再利用数据字典表来记录 Oracle 表空间里面的区间的使用状况,而是 在每个表空间的数据文件的头部加入了一个位图区域,在其中记录每个 Extent 的使用状况。每当一个 Extent 被使用,或者被释放以供重新使用时,Oracle 都会更新数据文件头部的这个记录,反映这个变化。

在创建本地管理表空间时,还可以选择更具体的空间分配方式:自动分配(autoallocate)统一尺寸(uniform)。若为自动分配,则让 Oracle 来决定区块的使用办法,缺省地 Oracle 会按照递增算法来分配空间;如果选择统一尺寸,则还可以详细指定每个区间(Extent)的大小。

在本地管理表空间的空间管理上,Oracle 将存储信息保存在表空间头部的位图中,而不是保存在数据字典中。通过这样的方式,在分配或者回收空间的时候,表空间就可以独立地在数据文件头部完成操作而无需与其他对象打交道。因为仅仅操作数据文件头部的几个数据块,不用操作数据字典,所以 Oracle 在本地管理的表空间中添加、删除段时,效率要比字典管理的表空间快,特别是在并发性很强的空间请求中。

本地管理表空间技术的主要优点:

  • 通过位图代替字典管理。
    本地管理的表空间用数据文件头部的位图块来记录和管理空间的分配和回收,避免了递归的空间管理操作,从而避免了字典操作以及因为字典操作而带来的性能问题。
  • 避免了碎片问题及空间浪费。
    本地化管理可以通过 UNIFORMAUTOALLOCATE 的方式进行区间管理,通过对Extent 进行 UNIFORM 约定,传统的空间碎片问题得以解决,进而空间的分配效率也大大提高。

查看表空间管理方式:

SQL> select tablespace_name,EXTENT_MANAGEMENT,allocation_type from dba_tablespaces;

1.4 表空间的创建与管理

1.4.1 表空间的创建

Oracle 使用 create tablespace 命令创建表空间,该命令的语法格式如下:

create [TEMPORARY] tablespace tablespace_name  ----- 表空间的名称
TEMPFILE | datafile '.../*.dbf'               ----- 数据文件的路径和名称
size x M|G                         ----- 数据文件的初始大小
autoextend on next x M|G           ----- 数据文件每次自动扩展多少,每次自动扩展多少
maxsize unlimited | x M|G;         ----- 数据文件的最大尺寸

说明:TEMPORARY 选项用于创建临时表空间,同时使用 TEMPFILE 指定文件名。
举例:

CREATE TABLESPACE tbs01 
Datafile 'D:\oracle\product\10.2.0\oradata\orcl\tbs01.dbf' SIZE 100M;

可加入Autoextend On Next 100M Maxsize Unlimited,否则会由于空间不足报ORA-01659错误(表示无法分配超出的MINEXTENTS)。

表空间默认区大小为64KB,可通过UNIFORM SIZE 128k来指定区大小为128k;或使用AUTOALLOCATE,区的大小由数据库根据情况指定。此时需要加入EXTENT MANAGEMENT LOCAL,表示表空间的区管理方式为本地管理(否则为字典管理)

1.4.2 Oracle大文件表空间

Oracle大文件表空间只包含一个数据文件,这个数据文件可包含4GB个数据块,一个数据文件大小可达32TB(8KB*4GB)。区(Extent)管理方式为本地管理(LOCAL),段(SEGMENT)管理方式为自动管理(AUTO)。

建立大表空间语句如下:

Create Bigfile Tablespace btbs1 Datafile 
'D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\BTBS01. DBF' Size 200M;

1.4.3 修改表空间

1.4.3.1 修改 AUTOEXTEND

表空间的大小由数据文件的个数和数据文件的大小决定,可通过以下方法调整:

  • 使用重置数据文件的大小;
  • 为表空间添加新的数据文件。

可以指定数据文件的 AUTOEXTEND 子句启用或禁用数据文件的自动扩展。文件将按指定的增量增加直到达到指定的最大值。使用AUTOEXTEND 子句的优点如下:

  • 当表空间的空间用尽时无需过多的直接干预
  • 确保应用程序不会由于未能分配区而暂停。
关闭数据文件的自动扩展属性:
ALTER DATABASE DATAFILE '+DATA/orcl/datafile/ts001.dbf' AUTOEXTEND OFF;

查看数据文件的自动扩展属性:
select tablespace_name, file_name,autoextensible from dba_data_files;

重新开启数据文件的自动扩展属性:
ALTER DATABASE DATAFILE '+DATA/orcl/datafile/ts001.dbf' AUTOEXTEND on next 100M;
1.4.3.2 修改表空间数据文件大小

尽管指定自动扩展选项可以使得数据文件在数据写满的情况下自动扩展,但自动扩展导致递归空间操作,从而降低系统性能。可以使用 ALTER DATABASE 命令手动增加或减少数据文件的大小。命令格式如下:

ALTER DATABASE DATAFILE file_name RESIZE x K|M;

示例:

Alter  Database  Datafile
'D:\oracle\product\10.2.0\oradata\orcl\tbs01.dbf' Resize 200M;


alter database  datafile '+DATA/orcl/datafile/ts001_2.dbf' 
     resize 200M;

1.4.4 为表空间添加数据文件

可以通过 ALTER TABLESPACE ADD DATAFILE 命令,向表空间添加数据文件以增加表空间的容量。命令格式如下:

ALTER TABLESPACE tablespace_name ADD DATAFILE filespec [autoextend_clause];

示例

SQL> alter tablespace ts001 
     add datafile '+DATA/orcl/datafile/ts001_2.dbf' 
     size 100M 
     autoextend on next 50m;
Tablespace altered.

表空间不足时,增加数据文件(可增加1个或多个)

ALTER TABLESPACE tbs01 add Datafile 
'D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\TBS01-1.DBF' Size 50M,
'D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\TBS01-2.DBF' Size 50M;

1.4.5 重命名表空间数据文件

1.4.5.1 alter tablespace

使用 alter tablespace 命令——不需要停库
命令格式如下:

ALTER TABLESPACE tablespace_name RENAME DATAFILE 'file_name1' TO 'file_name2';

说明:

  • 该方法不能移动 SYSTEM 表空间中的数据文件。
  • 源文件名必须与存储在控制文件内的文件名称匹配。
  • 表空间必须脱机,并且 TO 子句后的目标数据文件必须存在。

使用该命令重命名数据文件的步骤如下:

  • 使表空间脱机。
  • 使用操作系统命令移动或复制文件。
  • 执行 ALTER TABLESPACE RENAME DATAFILE 命令。
  • 使表空间联机。

示例如下:

-- 数据库在 open 状态
--1、设置表空间为 offline 状态
SQL> alter tablespace ts001 offline;
Tablespace altered.

--2、在操作系统下修改文件名
ASMCMD> cp +DATA/orcl/datafile/ts001.dbf +DATA/orcl/datafile/ts001_1.dbf
copying +DATA/orcl/datafile/ts001.dbf -> +DATA/orcl/datafile/ts001_1.dbf
ASMCMD> rm +DATA/orcl/datafile/ts001.dbf

--3、更新控制文件中的数据文件信息
SQL> alter tablespace ts001 rename DATAFILE '+DATA/orcl/datafile/ts001.dbf' to '+DATA/orcl/datafile/ts001_1.dbf';
Tablespace altered.

--4、设置表空间为 online 状态
SQL> alter tablespace ts001 online;
Tablespace altered.
1.4.5.2 alter database

使用 alter database 命令——需要停库
命令格式如下:

ALTER DATABASE RENAME FILE 'file_name1' TO 'file_name2';

说明:该命令可用来移动任意类型的数据文件,数据库必须处于 mount 状态,且目标数据文件必须存在。操作步骤如下:

  • 关闭数据库。
  • 使用操作系统命令移动文件。
  • 启动数据库到 mount 状态。
  • 执行 ALTER DATABASE RENAME FILE 命令。
  • 打开数据库。

示例如下:

--1、关闭数据库
SQL> shutdown immediate


--2、移动 ts001 表空间对应的数据文件
ASMCMD> cp +DATA/orcl/datafile/ts001_1.dbf +DATA/orcl/datafile/ts1_001.dbf
copying +DATA/orcl/datafile/ts001_1.dbf -> +DATA/orcl/datafile/ts1_001.dbf
ASMCMD> rm +DATA/orcl/datafile/ts001_1.dbf
ASMCMD> cp +DATA/orcl/datafile/ts001_2.dbf +DATA/orcl/datafile/ts1_002.dbf
copying +DATA/orcl/datafile/ts001_2.dbf -> +DATA/orcl/datafile/ts1_002.dbf
ASMCMD> rm +DATA/orcl/datafile/ts001_2.dbf

--3、启动到数据库到 mount 状态
SQL> startup mount

--4、使用 alter database 命令更改控制文件中数据文件的位置信息
SQL> alter database rename file '+DATA/orcl/datafile/ts001_1.dbf' to '+DATA/orcl/datafile/ts1_001.dbf';
SQL> alter database rename file '+DATA/orcl/datafile/ts001_2.dbf' to '+DATA/orcl/datafile/ts1_002.dbf';


--5、启动数据库到 open 状态
SQL> alter database open;

1.4.6 表空间属性操作

1.4.6.1 修改表空间的读写属性
ALTER TABLESPACE tablespace_name READ ONLY| READ WRITE; 

说明:执行该命令时,与该表空间相关的所有事务会自动回滚,不允许再对该表空间进行任何写入操作。
此时,用户只能在该表空间的对象上执行查询操作,而不能执行 DMLDDL 操作。但可以执行 DROP TABLEDROP INDEX 删除该表空间上的表或索引。
因为 DROP 命令只更新数据字典,数据字典位于 system 表空间,而不更新只读表空间上的物理文件。

1.4.6.2 表空间的脱机与联机

通过将表空间设置为联机或脱机状态可以控制表空间的可用性。当表空间处于联机状态时,用户可以访问其中的数据。当表空间处于脱机状态时,用户无法访问它的数据。表空间脱机一般用于以下几种情况:

  • 使数据库的一部分表空间不可用,但允许正常访问数据库的其余表空间;
  • 备份表空间时;
  • 在数据库打开时恢复表空间或数据文件;
  • 在数据库打开时移动数据文件

使表空间脱机和联机的命令如下:

ALTER TABLESPACE tablespace_name ONLINE | OFFLINE [NORMAL|TEMPORARY|IMMEDIATE|FOR RECOVER]}

说明:

  • NORMAL(默认设置):将表空间中所有数据文件内的所有块从 SGA 中写入数据文件并将数据文件关闭。在使该表空间重新联机之前,无须对其执行介质恢复。
  • TEMPORARY:对表空间内的所有联机数据文件执行检查点操作,但是在执行检查点时并不检查数据文件的状态,即使某些文件无法写入检查点,Oracle 也会忽略这些错误。在重新联机之前,所有脱机文件可能都需要进行介质恢复。
  • IMMEDIATE:不保证表空间文件可用,而且不执行检查点操作。在使表空间重新联机前,必须对其执行介质恢复操作。
  • FOR RECOVER:使表空间脱机以进行表空间时间点恢复。
  • SYSTEM:表空间无法设置为脱机状态。
    当一个表空间脱机后,Oracle 服务器将使与之相关联的所有数据文件脱机。
1.4.6.3 数据文件的脱机与联机

与表空间类似,可以把数据文件设置为联机或脱机状态。脱机的数据文件对于数据库来说是不可用的,直到它们被恢复为联机状态为止。

如果数据文件发生损坏时,Oracle 会自动将这个数据文件设置为脱机状态,并且记录在警告文件中。如果损坏的文件恢复后,需要以手工方式重新将数据文件恢复为联机状态。将数据文件设置为脱机状态,不会影响表空间的状态,但是反过来,将表空间设置为脱机状态后,属于该表空间的数据文件同时会进入脱机状态。可以使用 ALTER ATABASE 命令改变数据文件的状态:

--把表空间 ts001 对应的数据文件设置为脱机状态
SQL> ALTER DATABASE DATAFILE '+DATA/orcl/datafile/ts001.dbf' OFFLINE;

1.4.7 删除表空间

1.4.7.1 删除数据文件

从表空间中删除数据文件命令如下:

alter tablespace tablespace_name drop datafile 'file_name';
1.4.7.2 删除表空间

可以通过 DROP TABLESPACE 命令从数据库中删除表空间。删除表空间时需要注意以下问题:

  • 如果表空间包含数据段,必须使用 INCLUDING CONTENTS 选项。
  • 删除表空间后,数据将不再包含在数据库内。
  • 删除表空间时,只删除关联数据库控制文件内的文件指针。操作系统文件仍然存在,可以使用 AND DATAFILES 子句同时删除操作系统文件。
  • 表空间切换到只读状态,仍可以删除该表空间以及其中的段。
  • 删除表空间之前,建议将表空间脱机,以确保没有事务处理访问该表空间内的任何段。
  • SYSTEM 表空间不能被删除。

删除表空间的命令如下:

DROP TABLESPACE tablespace_name [INCLUDING CONTENTS [AND DATAFILES] [CASCADE CONSTRAINTS]]

说明:

  • INCLUDING CONTENTS:删除表空间内的所有段。
  • AND DATAFILES:删除关联的操作系统文件。
  • CASCADE CONSTRAINTS:如果表空间之外的表引用了该表空间内表的主键和唯一键,则删除引用完整性约束。

示例:

DROP TABLESPACE tbs01 INCLUDING CONTENTS AND DATAFILES;

1.5 设置用户的默认表空间

在Oracle11g 以前,如果创建用户时未使用 DEFAULT TABLESPACE 子句指定默认表空间,则将 SYSTEM 表空间作为它们的默认表空间。
Oracle 10g 中定义了数据库级别的默认表空间 USERS,在创建用户时如果没有定义默认表空间,就会把数据库级别的默认表空间当作用户的默认表空间。

1.5.1 查看数据库的默认表空间

SELECT PROPERTY_VALUE
     FROM database_properties
     WHERE PROPERTY_NAME = 'DEFAULT_PERMANENT_TABLESPACE';

说明:

  • 如果在创建用户时没有指定用户表空间,则默认会使用数据库的默认表空间,如果我们修改了数据库的默认表空间,用户的表空间也会发生改变。
  • 如果在创建用户时指定用户的表空间是其他的表空间,修改数据库的默认表空间不会影响用户的表空间。
  • 数据库的默认表空间不能删除,除非将默认表空间指向其他表空间之后才可以删除。
  • 如果用户的默认表空间指向其他的表空间,当这个表空间被删除之后,用户的默认表空间会自动指向数据库的默认表空间。

1.5.2 修改数据库的默认表空间

SQL> ALTER DATABASE DEFAULT TABLESPACE ts001;
Database altered.

1.5.3 查看用户的默认表空间

当前用户
SQL> select default_tablespace from user_users;

所有用户
SQL> select user_id, username, default_tablespace from dba_users;

1.5.4 创建新用户,指定或者不指定默认表空间

不指定默认表空间
SQL> create user john identified by john;

指定默认表空间
SQL> create user tom identified by tom default tablespace ts001;

1.6 临时表空间管理

1.6.1 简介

临时表空间用来管理数据库排序操作以及用于存储临时表中间排序结果等临时对象。如果 Oracle 需要执行排序操作时,并且当 PGAsort_area_size 大小不够时,就会把数据放入临时表空间里进行排序。当操作完成后,系统会自动清理临时表空间中的临时对象,自动释放临时段。和永久表空间不同的地方在于它是由临时数据文件(temporary files)组成的,而不是永久数据文件(datafiles)。临时表空间不会存储永久类型的对象,因此不需要备份

此外,对临时数据文件的操作不产生 redo 日志,但会生成 undo 日志。

临时表空间存储大规模排序操作(小规模排序操作会直接在RAM里完成,大规模排序才需要磁盘排序Disk Sort)和散列操作的中间结果。临时表空间不会存储永久类型的对象,所以它不会也不需要备份。

1.6.2 查看临时表空间信息

查看临时空间
SQL> select tablespace_name,contents from dba_tablespaces;

临时文件
select file#, ts#, name from v$tempfile;

查看数据库默认的临时表空间
SELECT PROPERTY_VALUE FROM database_properties
WHERE PROPERTY_NAME = 'DEFAULT_TEMP_TABLESPACE';

1.6.3 创建临时表空间

创建临时表空间的语法和永久表空间相似,命令如下:

SQL> create temporary tablespace temp02 tempfile '+DATA/orcl/tempfile/temp02.dbf' 
    size 50M autoextend on next 50M;

查看永久表空间及其对应的临时文件:
SQL> select file_id, file_name, tablespace_name from dba_temp_files;

此外,为临时表空间添加数据文件、更改数据文件的大小、删除表空间对应的数据文件等操作与永久表空间的对应操作也是基本相同的。

1.6.4 设置默认临时表空间

默认情况下,用户的默认临时表空间自动继承数据库的默认临时表空间。

--查看数据库的默认临时表空间
SQL> select * from database_properties where property_name like '%TABLESPACE%';

--查看某个用户的默认临时表空间
SQL> select user_id,username,default_tablespace,temporary_tablespace 
     from dba_users where username='JOHN';

修改数据库的默认临时表空间
SQL> alter database default temporary tablespace temp02;

1.6.5 使用临时表空间组

临进表空间组是 Oracle10g 开始引入的一个新特性,它是一个逻辑概念,不需要显示的创建和删除。只要把一个临时表空间分配到一个组中,临时表空间组就自动创建,所有的临时表空间从临时表空间组中移除就自动删除。如果删除一个临时表空间组的所有成员,该组也自动被删除。

临时表空间的名字不能与临时表空间组的名字相同,可以在创建临时表空间是指定表空间组。

临时表空间的作用:
可以把用户的默认临时表空间指定为一个临时表空间组,当此用户建立多个连接时如果用到临时表空间,不同的连接将会使用临时表空间组中的不同临时表空间。

创建临时表空间同时加入临时表空间组
SQL> CREATE TEMPORARY TABLESPACE TEMP03 
     TEMPFILE '+DATA/orcl/tempfile/temp03.dbf' SIZE 10M 
     TABLESPACE GROUP temp_group;

查看临时表空间组
SQL> select * from dba_tablespace_groups;

把表空间加入临时表空间组
SQL> ALTER TABLESPACE TEMP02 TABLESPACE GROUP TEMP_GROUP;
Tablespace altered.


把临时表空间从临时表空间组中移除
ALTER TABLESPACE TEMP03 TABLESPACE GROUP '';

指定用户的默认临时表空间为临时表空间组
SQL> alter user john temporary tablespace TEMP_GROUP;

1.7 undo 表空间管理

1.7.1 相关参数

与 undo 表空间有关的初始化参数

SQL> show parameter undo_
undo_management 		     string	 AUTO
undo_retention			     integer	 900
undo_tablespace 		     string	 UNDOTBS1

说明:

  • undo_management:UNDO 表空间回退段的管理方式:AUTO(自动管理),MANUAL(手动管理)。
  • undo_retention:事务提交后,相应的 UNDO 数据保留的时间,单位:秒。
  • undo_tablespace:指定使用的 undo 表空间

1.7.2 管理方式

SQL> show parameter undo_management

rollback segment 管理方式有两种:AUTO(自动管理,默认方式),MANUAL(手动管理)。

1.7.2.1 AUTO:自动管理

自动管理方式下,由初始化参数 undo_tablespace 指定一个 undo 表空间,作为默认使用的 undo 表空间。

自动管理模式下,创建 undo 表空间 undotbs11

SQL> create undo tablespace undotbs11
     datafile '+DATA/orcl/datafile/undotbs11' size 50m
     autoextend on next 50m;

把 undo 表空间切换为 undotbs11

SQL> alter system set undo_tablespace = undotbs11;
SQL> show parameter undo_tablespace

--查看回退段
SQL> select segment_name,tablespace_name,status from
1.7.2.2 MANUAL:手工管理

把回退段的管理方式修改为手工管理,只需要把初始化参数 undo_management 修改为 manual 即可。
当回退段的管理方式为自动管理,并且由于回退段出现问题而导致数据库无法启动时,可以把回退段管理方式设置为手工管理,数据库启动后再修改为自动管理。
:集群环境下修改回退段管理方式会影响到所有节点

初始化参数 undo_management 为静态参数,修改之后需要重启数据库才能生效。

SQL> alter system set undo_management = manual scope = spfile;

注意:回退段管理方式修改为手工管理之后,发现原有的回退段全部变成了 OFFLINE 状态(system 除外)。此时,只有系统表空间的对象能够进行数据修改操作,用户表空间的对应无法进行数据修改操作。

update e01 set sal=sal+1;
update e01 set sal=sal+1
       *
ERROR at line 1:
ORA-01552: cannot use system rollback segment for non-system tablespace 'USERS'

出现错误:由于 emp 表不在系统表空间,因此没有回退段可用,导致数据修改无法进行。
把表 e01 移动到 system 表空间
SQL> alter table e01 move tablespace system;
Table altered.

在回退段管理方式修改为手工管理之后,需要手工创建回退段,并设置为 online

步骤1:创建回退段
SQL> create rollback segment undo_segs001 tablespace UNDOTBS1;
Rollback segment created.

SQL> create rollback segment undo_segs002 tablespace UNDOTBS1;
Rollback segment created.

步骤2:查看新建的回退段的状态(OFFLINE)
SQL> select segment_name, tablespace_name,status from dba_rollback_segs;
UNDO_SEGS002		       UNDOTBS1 		      OFFLINE
UNDO_SEGS001		       UNDOTBS1 		      OFFLINE


步骤3:修改回退段的状态为 ONLINE
SQL> alter rollback segment UNDO_SEGS001 online;
SQL> alter rollback segment UNDO_SEGS002 online;

步骤4:把回退段信息添加到参数文件,否则重启后会自动变成 offline
SQL> alter system set rollback_segments='UNDO_SEGS001','UNDO_SEGS002','UNDO_SEGS003','UNDO_SEGS004','UNDO_SEGS005' scope=spfile;

1.7.3 与 undo 表空间有关的数据字典与动态视图

查看所有表空间信息
select * from v$tablespace;

查看表空间的类型
select tablespace_name,contents from dba_tablespaces;

查看表空间对应的数据文件
select tablespace_name,file_name from dba_data_files;

查看 undo 表空间所包含的回退段及回退段的大小等特征。
select SEGMENT_NAME,TABLESPACE_NAME,STATUS from dba_rollback_segs ;

查看所有表空间所包含的段及段的大小等特征。
select owner,segment_name,bytes/1024/1024 mb 
from dba_segments where tablespace_name like '%UNDO%';

查询 undo 表空间中区的大小与状态信息。
select tablespace_name,segment_name,extent_id,status from dba_undo_extents;

undo表空间中区的状态status 一共有3种:EXPIRED、UNEXPIRED、ACTIVE。
EXPIRED:表示该回退信息对应的事务已经提交,保存时间超过保留区;
UNEXPIRED:表示该回退信息对应的事务已经提交,保存时间没有超过保留区;
ACTIVE:表示回退信息对应的事务还没有提交,该区还在使用;

查询回退段的名称
select * 
						

上一篇: ROS C++:使用 ros::AsyncSpinner 多线程处理 ROS 消息

下一篇: docker 学习笔记 (1.0)

推荐阅读