目录
2.3.1永久表空间(Permanent tablespace)
2.3.3临时表空间(Temporary tablespace)
一、概述表空间
- 表空间是 Oracle 中用于存储逻辑对象的独立存储单元。它被划分为若干个连续的数据块,每个数据块大小可以在创建表空间时指定,比如 2KB、4KB、8KB 等。块是Oracle中最小的存储单位。块大小可以在创建表空间时指定,一旦指定就不能更改。块大小的选择会影响数据库的性能和存储空间的使用效率。
- 一个表空间由多个数据文件(data file)组成,每个数据文件可以存储一个或多个表空间,这些数据文件可以位于同一个磁盘上或者不同的磁盘上。
- 每个表空间都有自己的名字和属性,表空间是由表空间名称、数据文件名称、数据文件大小、数据文件路径等组成的。
- 表空间还可以设置自动扩展属性,当表空间中的空间不足时,可以自动增加数据文件的大小。此外,表空间还可以设置存储参数,如表空间的初始大小、最大大小、增量大小等。
下面是一些关于 Oracle 表空间的详细描述:
- 每个表空间拥有一组数据文件,这组数据文件可以存在于不同的磁盘上、文件系统上或者操作系统上,从而实现了物理独立性。
- 表空间可以用来管理数据库中的表、索引、视图和其他对象。因此,一个 DBA 可以更加灵活地管理数据和资源,优化磁盘空间利用和备份恢复。
- 每个表空间都有一个名字,并且必须指定大小(默认为无限制)。表空间可以动态增长,但最好预留一些空间以便后续应用需求。
- 某个表或索引可以被创建在一个特定的 tablespace 中。对于大型的数据库,通常会将不同类别的表和索引分配到不同的 tablespace 中,以便更好地控制存储空间和性能。
- 在 Oracle 11g 及之前的版本中,通常有四种类型的表空间:SYSTEM、SYSAUX、TEMP 和 USER,默认情况下每个数据库都会包含这四种表空间。从 Oracle 12c 开始,还增加了 UNDO 表空间。
- SYSTEM 表空间包含系统表(如 sys 和 system 表)和其他 Oracle 系统对象,通常不应该用来存储用户数据。
- SYSAUX 表空间包含许多 Oracle 数据库的关键组件,它随着数据库升级和新功能添加而变化。因此,保持 SYSAUX 表空间有足够空间非常重要。
- TEMP 表空间用于存储临时表和排序操作的中间结果。TEMP 表空间中的数据在事务提交后自动删除。
- USER 表空间用于存储被普通用户创建的数据库对象,如数据库表、索引和视图等。
- UNDO 表空间用于实现 Oracle 数据库事务的撤消(undo)功能,使得当一个事务需要回滚时,所有已做的修改可以反向执行。UNDO 表空间的大小应该设置足够大,以免影响事务撤消和回滚的性能。
总之,表空间是一个用于管理数据的逻辑单元,并提供了很大的灵活性,以及更好的磁盘空间使用率和容错性。
二、表空间分类
2.1按照管理权限方面划分
按照管理权限来划分时,将其分为系统表空间和用户表空间两种类型。
2.1.1系统表空间
系统表空间是被 Oracle 管理员使用的特殊表空间,存储了数据库自身运行所需的数据和对象,以及系统元数据等。系统表空间包括 SYSTEM 表空间和 SYSAUX 表空间两种类型,主要包含如下的数据库对象:
- 数据库元数据:这些元数据包括系统表、系统视图以及一些其他的元数据定义,用于实现 Oracle 数据库自身的基本功能。
- 系统表:Oracle 自带的一些常见表,通常存储有关 Oracle 实例、用户、安全性、备用设备等信息。
- 系统索引:实际上是一个特殊类型的表,用于加快系统表查询,提高系统效率。
- 控制文件:Oracle 数据库控制文件,它保存了数据库名称、创建日期、日志序列号、当前数据库日志组数等关键信息。
2.1.2用户表空间
用户表空间是由用户创建的,用于存储用户数据和对象,如表、索引、视图等。用户表空间则是被普通用户使用的表空间,用于存储用户定义的表、索引、存储过程等数据库对象。一般情况下,一个 Oracle 数据库中可以存在多个用户表空间,这些用户表空间由用户创建或者由管理员代为创建。同时用户表空间中也包含如下的数据库对象:
- 数据表:是最常见的数据库对象类型之一。用户可以创建自己的数据表,并在其中存储数据。
- 索引:用于加快数据表中数据的检索速度,提高系统性能。
- 视图:类似于数据表,但是不能向其中直接插入新行或删除行。
- 序列:用于生成唯一标识符,常用于主键或其它数据列上。
- 存储过程和函数:由 PL/SQL 编写并编译为可执行代码的程序单元。
- Package: PL/SQL 中对存储过程和函数进行组合,在数据库中作为一个单独的对象存在。
- 用户定义类型:是用户自定义数据类型,可以像基本类型一样使用。
2.2按照分区策略方面划分
从分区策略方面考虑,Oracle 中表空间可以按照以下4种类型进行分类,包括 SYSTEM 表空间、SYSAUX 表空间、TEMP 表空间、UNDO 表空间等。
2.2.1SYSTEM 表空间
系统表空间的重要组成部分,存储数据库元数据和控制信息等,是整个数据库结构中必不可少的一环。包含了所有的系统元数据,例如系统数据字典,Oracle 内核代码等,这些元素都是 Oracle 系统负责维护并不提供给用户修改和访问的。
2.2.2SYSAUX 表空间
第二个重要的系统表空间,主要用于存储系统管理数据、高级队列、日志记录信息、数据挖掘模型等。也是存储Oracle数据库的一些辅助系统对象,如Oracle Enterprise Manager的性能监控数据、日志信息等。同时是环境数据的存放,当 Oracle 安装有更多的组件或者安装更多的应用程序时,使用 SYSAUX 表空间扩展系统表空间以支持 Oracle 11g 以后新的 Oracle 功能。
2.2.3TEMP 表空间
临时表空间,用于存放查询操作过程中生成的临时表或排序表等中间结果,执行完成后会自动清空。用于存储排序操作、合并 JOIN 操作产生的临时文件和表,在查询非常复杂,且需要大量的临时空间支持的情况下,会涉及到读写 TEMP 表空间。因此主要是用于存储临时数据,如排序操作、连接操作等。
2.2.4UNDO 表空间
撤销表空间,用于存储在事务执行过程中会被修改或删除的旧版数据,在回滚操作时可以用来恢复之前的状态。常用于处理数据库中的回滚段管理,当事务被回滚时,根据需要进行回滚以前完成的工作,并将撤消所需信息放入 UNDO 表空间中。这些信息保留在 UNDO 表空间中,以便在需要的时候恢复这些文档。因此主要用于存储回滚段数据,支持事务的回滚操作。
2.3按照功能类型方面划分
按照数据的持久性和功能类型来划分表空间,根据不同的功能需要和数据处理方式, Oracle 将表空间可分为永久表空间、撤销表空间和临时表空间三种类型。
2.3.1永久表空间(Permanent tablespace)
用于存储用户定义的数据库对象,如数据表、索引、视图等。这些数据是长期存放在硬盘上供日常业务使用的,不会随着会话或者事务的结束而消失,即永久表空间中的数据在提交后会被持久化到磁盘上。常用于存储永久性数据,如表、索引等,在数据库关闭之后仍会存在。
2.3.2撤销表空间(Undo tablespace)
撤销表空间用于实现事务的回撤和恢复功能。当事务处理过程中需要撤销某个事务时,Oracle 数据库就会从撤销表空间中获取相应的数据,并使用这些数据将撤销操作进行回退。因此常用于存放正在执行事务对数据所做的修改的详细信息。当事务需要回滚时,Oracle 回到这个表空间中找到 undo 数据,使用这些数据还原到之前的状态。它是与会话关联的表空间,每个活动的会话都会用到它。
2.3.3临时表空间(Temporary tablespace)
临时表空间用来存储对 SQL 查询操作进行排序和处理等临时需求所创建的对象。这些对象在查询结束后会被自动删除。临时表空间主要用于临时数据库对象的存储,如排序时存储的临时文件、Hash Join 操作时的临时表等,以支持 OLAP 和大型复杂查询等高级操作。当语句需要较大量的内存进行排序、转储到磁盘等操作时,会自动使用临时表空间。完成操作后其内数据也会相应地释放掉,即临时表空间中的数据在会话结束后会被自动删除。
通常情况下,一个完整的 Oracle 数据库都应该包含至少一个永久表空间和一个撤销表空间,默认情况下也会包含一个临时表空间。此外,永久表空间和临时表空间还可以根据其所处磁盘位置、大小、性能等因素进行细分,以更好地满足数据库应用程序的需求。
注意:
最好将永久表空间和撤销表空间分开使用,而不要将它们同时存储在同一个表空间中,这样可以避免由于一些操作(如大量数据删除)而导致撤销表空间被耗尽的情况。
可以通过以下SQL语句查询表空间的类型:
SELECT tablespace_name, contents FROM dba_tablespaces;
其中,contents列的值可以为PERMANENT、UNDO或TEMPORARY,分别对应永久表空间、撤销表空间和临时表空间。
三、表空间操作
3.1创建表空间
语法格式如下:
CREATE TABLESPACE tablespace_name
DATAFILE 'path/to/datafile' SIZE file_size [ REUSE ]
[ EXTENT MANAGEMENT <LOCAL | DICTIONARY> ]
[ AUTOEXTEND ON NEXT auto_extend_size MAXSIZE max_size ]
[ DEFAULT STORAGE (storage_clause)]
[ LOGGING | NOLOGGING]
[ ONLINE | OFFLINE]
[ PERMANENT | TEMPORARY]
[ SEGMENT SPACE MANAGEMENT { MANUAL | AUTO } ];
各个参数含义如下:
tablespace_name
:创建的表空间名称,即新表空间的名字。DATAFILE
: 物理文件路径及名称,这个文件将作为表空间的数据容器(可以有多个),用于指定数据文件的路径和文件名。SIZE
: 指定新创建的数据文件的初始大小,默认单位为 M。。REUSE
: 若数据文件已存在,可使用 REUSE 参数来重复利用该数据文件,不做任何命名修改操作。EXTENT MANAGEMENT
: 指定表空间的分配方式。DICTIONARY 表示使用数据字典管理, LOCAL 表示使用局部管理方式,可以继承 DEFAULT 数据库设置。AUTOEXTEND
: 对于需要自动扩展的数据文件,启用自动扩展功能。NEXT
: 指定自动扩展的下一个增量大小,默认单位为 M。MAXSIZE
: 数据文件最大允许的大小限制,默认也是以 M 作为单位。- DEFAULT STORAGE (storage_clause):指定表空间的默认存储属性。
LOGGING
:设置并激活日志记录,将数据更改所导致的事务记录在 Oracle 的重做日志文件中。NOLOGGING
:不启用日志记录,不写事务日志,提高性能。ONLINE
:允许并发连接到表空间中的对象,在创建表空间时,将其设置为在线状态。OFFLINE
:禁止对表空间的所有活动,在创建表空间时,将其设置为离线状态。- PERMANENT:创建永久表空间。
- TEMPORARY:创建临时表空间。
SEGMENT SPACE MANAGEMENT
: 指定表空间中的段管理方式,MANUAL 表示手动管理,AUTO 表示自动管理。
下面是一些创建表空间的示例:
例1.创建一个名为 USERS 的用户表空间,存储在目录 /u01/app/oracle/oradata/db1/
下的 users01.dbf
文件中,初始大小为 100MB,启用自动扩展功能,每次自动以 10MB 为单位增加文件的容量,最大不能超过 2GB,语法如下:
CREATE TABLESPACE users
DATAFILE '/u01/app/oracle/oradata/db1/users01.dbf' SIZE 100M
EXTENT MANAGEMENT LOCAL
AUTOEXTEND ON NEXT 10M MAXSIZE 2G;
我这里是启用局部扩展管理方式 ,可以使数据库管理更加高效,读写速度相对更快。
例2.创建具备自动扩展功能的数据文件,初始大小为 100 MB,每次增加 10 MB,最大值不超过 500 MB 的“my_datafile.dbf”路径下的表空间“my_tablespace”,语法如下:
CREATE TABLESPACE my_tablespace
DATAFILE 'C:\oracle\product\12.2.0\dbhome_1\database\my_datafile.dbf'
SIZE 100M
AUTOEXTEND ON NEXT 10M MAXSIZE 500M;
例3.创建一个名为 `my_tablespace` 的永久表空间,数据文件路径为 `/u01/app/oracle/oradata/mydb/my_tablespace.dbf`,大小为 100M,启用了自动扩展功能,每次自动扩展 50M,最大大小为 500M,使用默认的存储属性,设置为在线状态,语法如下:
CREATE TABLESPACE my_tablespace
DATAFILE '/u01/app/oracle/oradata/mydb/my_tablespace.dbf' SIZE 100M
AUTOEXTEND ON NEXT 50M MAXSIZE 500M
DEFAULT STORAGE (INITIAL 64K NEXT 64K)
ONLINE
PERMANENT;
例4.建立UNDO表空间的基本步骤
1). 创建一个临时表空间(temp tablespace)作为创建 UNDO 表空间时使用的临时表空间。该临时表空间可以选择默认的 `TEMP` 表空间,或者使用已有的其他合适的临时表空间。
ALTER DATABASE DEFAULT TEMPORARY TABLESPACE temp;
2). 创建 UNDO 表空间,并指定其属性配置,例如表空间的名称、文件路径和大小等。
CREATE UNDO TABLESPACE undo_tbs
DATAFILE '/u01/app/oracle/oradata/XE/undo_tbs01.dbf' SIZE 50M;
在创建过程中,可以根据实际需求对表空间的大小、存储位置等进行调整。
3). 将新创建的 UNDO 表空间设置为系统级别的默认 UNDO 表空间。
ALTER SYSTEM SET UNDO_TABLESPACE=undo_tbs SCOPE=BOTH;
这样,以后所有的回滚操作都将使用该 UNDO 表空间存储相应的回滚数据。如果需要更改默认的 UNDO 表空间,可以使用类似的 SQL 命令进行修改。
注意:
使用 UNDO 表空间必须确保数据库处于自动回滚模式下。否则就算创建了 UNDO 表空间,在事务回滚时仍然无法自动还原数据。
例5.建立临时表空间的基本步骤:
1). 创建一个新的数据文件(Datafile),用于存储该表空间的数据。可以使用如下 SQL 命令完成创建:
ALTER TABLESPACE temp ADD TEMPFILE '/u01/app/oracle/oradata/XE/temp02.dbf' SIZE 50M;
2). 创建新的临时表空间,指定文件及其大小:
CREATE TEMPORARY TABLESPACE temp02
TEMPFILE '/u01/app/oracle/oradata/XE/temp02.dbf' SIZE 50M;
3). 将新创建的临时表空间设置为默认临时表空间,默认的临时表空间用于所有需要使用临时表空间的会话上。可以使用如下 SQL 命令进行修改:
ALTER DATABASE DEFAULT TEMPORARY TABLESPACE temp02;
注意:
临时表空间只能保存临时数据。在数据库重启后,它将被清空。因此,在实际应用中,必须视情况而定,根据业务特点调整临时表空间的大小和数量,并对其进行定期维护和清理,确保数据库的正常运行。
3.2修改表空间
可以使用 ALTER TABLESPACE 语句来修改现有的表空间。ALTER TABLESPACE 语句的基本语法格式如下:
ALTER TABLESPACE tablespace_name {
[ ADD DATAFILE 'path/to/new_datafile' SIZE file_size ]
[ RESIZE DATAFILE 'path/to/datafile' SIZE file_size ]
[ AUTOEXTEND ON NEXT auto_extend_size integer[K|M|G|T] MAXSIZE max_size
integer[K|M|G|T] ]
[ RENAME TO new_tablespace_name ]--RENAME DATAFILE 'old_file_name' TO 'new_file_name'
[ RESIZE integer[K|M|G|T]
[ OFFLINE| OFFLINE | READ ONLY | READ WRITE NORMAL/IMMEDIATE ]
{BEGIN BACKUP | END BACKUP} |
{BEGIN/END} {BACKUP | COPY | RECOVER} [DATAFILE 'file_spec'] |
{BEGIN/END} {BACKUP | COPY | RECOVER} [TEMPFILE 'file_spec'] |
{BEGIN/END} {BACKUP | COPY | RECOVER} TABLESPACE tablespace_name |
{BEGIN/END} {BACKUP | COPY | RECOVER} DATABASE |
{BEGIN/END} {BACKUP | COPY | RECOVER} CONTROLFILE |
{BEGIN/END} {BACKUP | COPY | RECOVER} ARCHIVELOG |
{BEGIN/END} {BACKUP | COPY | RECOVER} LOGFILE 'file_spec' |
{BEGIN/END} {BACKUP | COPY | RECOVER} REDOLOG group integer |
{BEGIN/END} {BACKUP | COPY | RECOVER} ALL}};
各个参数含义如下:
tablespace_name
: 要修改的表空间名字。ADD DATAFILE
: 用来添加一个新的数据文件到该表空间中。RESIZE DATAFILE
: 用来调整已有数据文件的大小。AUTOEXTEND
: 对于需要自动扩展的数据文件,启用自动扩展功能。NEXT
: 指定自动扩展的下一个增量大小。MAXSIZE
: 数据文件最大允许的大小限制。RENAME TO
: 修改表空间的名字。OFFLINE
: 可以将表空间脱机,使其不再接收新事务,并允许执行 DBA 级别操作。- ONLINE:在线表空间。
- READ ONLY/READ WRITE:只读/读写表空间。
- RENAME DATAFILE:重命名数据文件。
- RESIZE:调整表空间大小。
- BEGIN/END BACKUP:开始/结束备份。
- BEGIN/END BACKUP/COPY/RECOVER:开始/结束备份/复制/恢复操作。
下面是一些修改表空间的示例:
例1.向 USERS 表空间添加一个名为 users02.dbf 的新数据文件,则可以使用以下示例代码:
ALTER TABLESPACE users
ADD DATAFILE '/u01/app/oracle/oradata/db1/users02.dbf' SIZE 100M;
如果要增加名为 my_tablespace
的表空间的容量,则可以使用以下示例代码:
ALTER TABLESPACE my_tablespace ADD DATAFILE '/u01/app/oracle/oradata/db1/users02.dbf' SIZE 200M;
例2.如果要调整 USERS 表空间中现有数据文件的大小为 200M,则可以使用以下示例代码:
ALTER TABLESPACE users
RESIZE DATAFILE '/u01/app/oracle/oradata/db1/users01.dbf' SIZE 200M;
例3.如果要重命名 USERS 表空间为 USERS_NEW,则可以使用以下示例代码:
ALTER TABLESPACE users
RENAME TO users_new;
例4.开启自动拓展,则可以使用以下示例代码:
ALTER TABLESPACE users AUTOEXTEND ON NEXT 100M MAXSIZE 500M;
例5.开始备份,则可以使用以下示例代码:
ALTER TABLESPACE users BEGIN BACKUP;
例6.增加表空间的两种方法,则可以使用以下示例代码:
1.)增加额外的数据文件到表空间中,例如
alter tablespace users add datafile '/u01/oradata/orcl/users02.dbf' size 25m;
2.)修改表空间当前的数据文件,例如
alter database datafile '/u01/oradata/orcl/users01.dbf' resize 50m;
注意:
对于某些数据库对象(如表和索引等),可能只能够在特定的表空间中进行创建或修改。因此,在修改表空间之前,最好先仔细阅读 文档以了解相应限制。
3.3删除表空间
可以使用 DROP TABLESPACE 语句来删除一个现有的表空间。DROP TABLESPACE 语句的基本语法格式如下:
DROP TABLESPACE tablespace_name
[ INCLUDING CONTENTS ]
[ AND DATAFILES [CASCADE|KEEP]];
各个参数含义如下:
tablespace_name
: 要删除的表空间名字。INCLUDING CONTENTS(可选)
: 如果带有此选项,则表空间中的所有对象都会被删除,即删除表空间中的所有对象和数据。AND DATAFILES
CASCADE(可选): 如果带有此选项,则与该表空间关联的数据文件也将被删除,即级联删除该表空间使用的所有数据文件。AND DATAFILES KEEP(
可选):保留该表空间使用的所有数据文件。
备注:
[CASCADE|KEEP]根据情况可选择是否添加。
下面是一些删除表空间的示例:
例1.删除 USERS 表空间(无论是否存在该表空间中的任何数据库对象)及其关联数据文件 users01.dbf,
DROP TABLESPACE users INCLUDING CONTENTS AND DATAFILES;
如果只想删除 USERS 表空间,但保留其中的数据库对象和数据文件不变,则可以省略上述语句中的 INCLUDING CONTENTS 和 AND DATAFILES 参数,如下所示:
DROP TABLESPACE users;
例2.如果要删除名为 my_tablespace
的表空间并且同时删除其中的所有对象和数据,
DROP TABLESPACE my_tablespace INCLUDING CONTENTS;
如果要删除该表空间并将其使用的所有数据文件级联删除,
DROP TABLESPACE my_tablespace INCLUDING CONTENTS AND DATAFILES CASCADE;
如果希望保留该表空间使用的数据文件而只删除表空间本身,
DROP TABLESPACE my_tablespace AND DATAFILES KEEP;
3.4查询表空间
1).通过查询相关系统视图,查看指定表空间的使用情况。以下是常用的两个查询语句:
①查询表空间使用率信息
SELECT tablespace_name,
ROUND((total_space - free_space) / total_space * 100, 2) "Used%",
ROUND(total_space / 1024 / 1024, 2) "Total(MB)",
ROUND(free_space / 1024 / 1024, 2) "Free(MB)",
ROUND((total_space - free_space) / 1024 / 1024, 2) "Used(MB)"
FROM (SELECT tablespace_name,
SUM(bytes) / 1024 / 1024 total_space,
SUM(DECODE(autoextensible, 'YES', maxbytes, bytes)) / 1024 / 1024 free_space
FROM dba_data_files
GROUP BY tablespace_name);
--或者使用下面语句
--使用外连接(等价于隐式内连接),以及 SELECT 子句中的运算符和函数(例如 ROUND、/)
select a.tablespace_name,
a.total/1024 total,
round(100-b.free/a.total*100,2) "%Used"
from
(select tablespace_name,sum(bytes) total
from dba_data_files
group by tablespace_name
) a,
(select tablespace_name,sum(bytes) free
from dba_free_space
group by tablespace_name
) b
where a.tablespace_name=b.tablespace_name;
解析第二个查询语句:
-
首先,从
dba_data_files
表中查询出每个表空间所占用的总空间大小,结果保存在名为a
的嵌套子查询中。 -
然后,从
dba_free_space
表中查询出每个表空间中当前可用空间的总大小,保存在名为b
的嵌套子查询中。 -
最后,将两个嵌套子查询连接起来,在主查询中计算出当前每个表空间已经使用了的百分比。具体来说,计算公式为:100 - (当前表空间中可用空间 / 当前表空间总空间) * 100,结果保留两位小数。同时,查询结果包括表空间名称(
tablespace_name
)、表空间总大小(total
)和表空间当前已使用的百分比(%Used
)。
②查询指定表空间内各数据文件的使用情况
SELECT file_id,
file_name,
tablespace_name,
autoextensible,
ceil(bytes / 1024 / 1024) "Size(MB)",
ceil(maxbytes / 1024 / 1024) "MaxSize(MB)",
ceil(((maxbytes - bytes) / allocate_extent) + 1) "Free Extents"
FROM dba_data_files
WHERE tablespace_name = '<tablespace_name>';
2).检查当前用户空间分配情况
SELECT *
FROM dba_segments
WHERE owner = '<username>'
<username>
部分应替换为实际的用户名。该 SQL 语句将从 dba_segments
视图中查询出属于特定用户的所有段(例如表、索引等),并显示它们的详细信息,包括名称、类型、大小、空间限制等。需要注意的是,如果不具备访问 dba_segments
等系统视图的权限,则无法查询到相关信息。
或者使用如下语句查询当前用户空间使用情况:
SELECT segment_type, sum(bytes)/1024/1024 MB_used
FROM user_segments
GROUP BY segment_type;
从 user_segments
表中查询属于当前用户的所有段信息,并按照段类型(例如表、索引等)进行分类汇总,计算出每种类型的段所占用的空间大小(单位为 MB)。
提示:
Oracle 数据库中,一般将表空间用于存储多个用户的数据,而不是一个用户单独占用一个表空间。因此,要想知道某个用户所占用的表空间空间大小,需要对该用户所使用的表和索引等对象所占用的空间进行求和。
再或者使用如下语句查询当前用户空间使用情况:
SELECT tablespace_name,SUM(extents),SUM(blocks),SUM(bytes)
FROM user_segments
GROUP BY tablespace_name
从 user_segments
表中查询出属于当前用户的所有段(例如表、索引等),并按照所在表空间进行分类汇总,计算出每个表空间中该用户所有段所占用的总扩展数、总块数和总字节数。最后,显示结果将按照表空间名称 (tablespace_name
) 进行分组,并分别显示三个汇总值,包括全角空格(
)作为千位分隔符的总扩展数 (SUM(extents)
)、总块数 (SUM(blocks)
) 和总字节数 (SUM(bytes)
)。
注意:
上述两个查询只能用于统计当前用户的表空间使用情况,无法获取其他用户或整个数据库的信息,且必须在具有访问
user_segments
表的权限下执行。此外,该查询结果所反映的表空间使用情况仅包括该用户拥有的对象(即user_segments
表中记录),不包括该用户对其他表空间已存在的对象的访问。如果需要了解更全局的表空间使用情况,则需要参考其他系统视图或动态性能视图。
3).检查各个用户的空间分配情况
SELECT username, default_tablespace, temporary_tablespace, profile FROM dba_users;
从 dba_users
视图中获取当前数据库中所有用户的信息,包括用户名 (username
)、默认表空间 (default_tablespace
)、临时表空间 (temporary_tablespace
) 和配置文件 (profile
) 等。其中,默认表空间表示该用户创建对象时使用的默认表空间,而临时表空间则表示该用户的临时表空间。
再或者使用如下语句查询各个用户的空间分配情况:
SELECT owner,tablespace_name,SUM(extents),SUM(blocks),SUM(bytes)
FROM dba_segments
GROUP BY owner,tablespace_name;
从 dba_segments
视图中查询出所有表空间中各个用户拥有的对象,并按照所属用户和表空间进行分类汇总,计算出每个用户在每个表空间中所有对象所占用的总扩展数、总块数和总字节数。最后,显示结果将按照用户名 (owner
) 和表空间名称 (tablespace_name
) 进行分组,并分别显示三个汇总值,包括全角空格(
)作为千位分隔符的总扩展数 (SUM(extents)
)、总块数 (SUM(blocks)
) 和总字节数 (SUM(bytes)
)。
注意:
该查询涉及
dba_segments
视图,因此需要以具有访问权限的特权用户身份执行。此外,在针对多个用户进行统计时,可能需要使用WHERE
子句先过滤掉某些不需要的用户,从而缩小统计范围。
使用以下命令检查指定用户已经占用了哪些空间:
SELECT segment_name, segment_type, tablespace_name, bytes, extents FROM user_segments;
从 user_segments
视图中获取当前用户拥有的所有段(例如表、索引等)所占用的空间信息,包括段名称 (segment_name
)、段类型 (segment_type
)、表空间名称 (tablespace_name
)、总字节数 (bytes
) 和总扩展数 (extents
) 等。这些信息可以用于检查指定用户已经占用的空间以及各个表空间的负载情况。
四、表空间常见问题
4.1表空间满了如何解决?
当 Oracle 数据库中的表空间满了时,一般需要采取以下措施:
1). 扩展数据文件:可以通过增加数据文件的大小来扩展表空间。具体步骤是使用 `ALTER TABLESPACE` 命令加上关键字 `ADD DATAFILE` 来添加一个或多个数据文件。详情可查看3.2的例6.
例如:
ALTER TABLESPACE tablespace_name ADD DATAFILE '/path/to/datafile.dbf' SIZE 50M;
这个命令会向指定的表空间中添加一个新的数据文件,其大小为 50MB。需要注意的是,在执行此操作前必须保证磁盘空间足够。
2). 压缩数据表:当表空间中存在不必要的数据时,可以考虑对数据表进行压缩,从而释放一些空间。一种常见的做法是删除一些不再使用的数据行,比如历史数据或者备份数据等。
3). 移动数据对象:可以将一些不常用到的数据对象移动到其他的表空间中。例如,将一些历史数据对象或者稀少使用的辅助表(如日志表)移动到硬盘速度较慢但容量较大的表空间中,从而腾出更多的存储空间。
4). 压缩重建索引:重建索引可以消除分裂的块并缩小存储区的碎片,从而释放一些空间。一般情况下,重建完索引后,表空间大小会被自动收缩。
注意:
在执行上述操作时,请务必备份好数据以防止意外丢失。同时,要根据实际情况选择对应的措施,并充分评估可能产生的风险和影响。
4.2表空间限额
创建一个用户,分配了400M的表空间,结果在用到13.3M时报错: ORA-01536: 超出表空间 '***' 的空间限额 。
在这种情况下,出现了 "ORA-01536: 超出表空间 '***' 的空间限额" 错误,原因可能是:
①. 分配的表空间大小不够:通过具体的错误信息 ORA-01536 可以看出,表空间 '***' 已经超出了分配的限额。因此,可能是在创建用户时分配未能考虑到数据增长所需的空间。
②. 数据集中存储在某个表/分区:数据量可能远远超过预期,或者存在数据密集型表,导致该表所占用的存储空间已达到表空间上限。可以通过查看使用了最多空间的对象来确认此问题是否存在。例如:
SELECT owner, segment_name, segment_type, bytes/1024/1024 MB
FROM dba_segments
WHERE tablespace_name = '***'
ORDER BY bytes DESC;
其中 "***" 要替换为实际的表空间名称。
要解决ORR-01536错误,可执行以下操作:
①. 增加表空间容量:根据实际需要,增加表空间中数据文件的数量或大小。
②. 检查表空间使用情况:对表空间及其包含的对象进行彻底检查,弄清楚哪些对象占用了大量空间,并采取相应有效措施来释放空间或重分配它们的存储位置。
注意:
无论采用哪种方法,都要进行充分的风险评估,并确认执行前已经备份了相关数据以防止意外丢失。
经过查询后我发现表空间跟表空间限额两个值是不一样的,推测按默认的话oracle应该会给每个用户分配一个默认的表空间限额,具体比例待查,但这比例肯定远小于100%,所以说分配了400M的表空间未必能存储400M的数据。
解决办法:
查看下用户表空间的限额 :
select * from user_ts_quotas;
max_bytes字段就是了 ,-1是代表没有限制,其它值多少就是多少了。
不对用户做表空间限额控制:
GRANT UNLIMITED TABLESPACE TO ***(用户);
这种方式是全局性的.
或者
alter user ***(用户名) quota unlimited on ***(表空间);
这种方式是针对特定的表空间的,可以分配自然也可以回收了;
revoke unlimited tablespace from ***(用户)
或者
alter user *** quota 0 on ***
五、表空间作用
主要有以下几个方面:
-
提供灵活性:通过将数据库对象分布到不同的表空间中,可以轻松地调整各个对象之间的位置关系,从而改变存储结构,以达到更加灵活的管理方式。
-
简化备份和恢复过程:数据库管理员可以针对不同的表空间执行备份和恢复操作,从而简化了备份和恢复的工作步骤。例如,在备份数据库时,可以先备份频繁更新的表空间,然后再备份较为静态的表空间,这样可以减少备份过程中的数据重复。
-
管理存储资源:通过在不同的表空间中设置不同的存储参数,管理员可以精细地控制存储资源的使用情况,从而有效地管理存储资源。
-
优化性能:根据不同的应用场景,将相关的数据库对象放置于不同的表空间中,以便给予不同的存取规则和存储特性。例如,可以将具有高读取频率的表置于磁盘速度较快的表空间中,以提高数据库的查询效率。
总之,Oracle的表空间是一个非常重要的概念,它对于数据库的性能和管理都有着重要的影响。