目录
一. 表空间概述
表空间是Oracle数据库的逻辑结构,在一个ORACLE数据库中,可以有一个或多个表空间,而一个表空间对应着的是一个或多个物理的数据库文件。如果要对Oracle数据库做数据恢复,需要以表空间作为最小单位,进行恢复。表空间种容纳的数据库实体有表、视图、索引、聚簇、回退段和临时段等。需要注意的是,在创建数据库用户之前,需要先创建表空间,这样才好在创建用户时,给用户分配默认的表空间。
二. 表空间创建
1. 创建格式
CREATE [UNDO|TEMPORARY] TABLESPACE tablespace_name
DATAFILE 'path/tbs_file_name' [SIZE INTEGER[K| M]] [REUSE]
[AUTOEXTEND [OFF | ON ] ]
[NEXT INTEGER[K | M]]
[MAXSIZE [UNLIMITED | INTEGER[K | M]]]
[MINIMUM EXTENT INTEGER[K | M]]
[BLOCKSIZE integer [k]]
[DEFAULT STORAGE storage_clause]
[ONLINE | OFFLINE]
[LOGGING | NOLOGGING]
[FORCE LOGGING]
[EXTENT MANAGEMENT [DICTIONARY | LOCAL]]
[AUTOALLOCATE | UNIFORM [SIZE INTEGER[K | M]]]
[SEGMENT SPACE MANAGEMENT [AUTO | MANUAL]]
说明:
- UNDO:创建一个回滚表空间,当没有指定回滚表空间时,使用system回滚段来进行事务管理。
- tablespace_name:遵循Oracle命名规范。
- DATAFILE 'path/tbs_file_name' [[SIZE|RESIZE] INTEGER[K|M|G]] [REUSE]:指定一个或多个数据文件路径和文件名;[[SIZE|RESIZE] INTEGER[K|M|G]]指定/更改表空间数据文件所占的空间大小,[K|M|G]是文件大小单位;[REUSE]表空间数据文件已经存在,则需要使用reuse注明。
- [AUTOEXTEND [OFF|ON]]:禁止或允许自动扩展数据文件,默认情况下为OFF
- [NEXT INTEGER[K|M]]:指定需拓展数据文件的磁盘空间大小,[K|M]为单位。
- [MAXSIZE [UNLIMITED|INTEGER[K|M]]]:指定允许拓展的最大磁盘空间大小,UNLIMITED指当磁盘空间满(32G)时,才不允许再扩展数据文件。
- [MINMUM EXTENT INTEGER[K|M]]:指定盘区大小是指定大小的整数倍,可以减小空间碎片。
- [BLOCKSIZE integer [k]]:设定一个不标准的块的大小。如果要设置这个参数,必须设置db_block_size,至少一个db_nk_block_size,并且声明的integer的值必须等于db_nk_block_size。在临时表空间不能设置这个参数。
- [DEFAULT STORAGE storage_clause]:该表空间创建的全部对象指定缺省的存储参数,没有指定时oracle将会为所有对象指定一些系统默认的存储参数。
- [ONLINE | OFFLINE]:ONLINE是指对授权访问该表空间的用户可用。OFFLINE是指未完成的事物可以提交或回滚,但不能发起新的事物,也不能进行查询。
- [LOGGING | NOLOGGING]:日志属性,它表示将来的表、索引等是否需要进行日志处理。默认值为LOGGING
- [FORCE LOGGING]:表空间进入强制日志模式。
- [PERMANENT | TEMPORARY]:指出表空间的属性,是永久表空间还是临时表空间,声明了这个参数后,不能声明block size
- [EXTENT MANAGEMENT [DICTIONARY | LOCAL]] [AUTOALLOCATE | UNIFORM [SIZE INTEGER[K | M]]]:这是最重要的子句,说明了表空间如何管理范围。一旦你声明了这个子句,只能通过移植的方式改变这些参数。如果希望表空间本地管理的话,声明local选项。本地管理表空间是通过位图管理的。autoallocate说明表空间自动分配范围,用户不能指定范围的大小。注意:本地管理表空间只能存储永久对象。如果你声明了local,将不能声明default storage_clause,mininum extent、temporary.
- [SEGMENT SPACE MANAGEMENT [AUTO | MANUAL]]:表空间段的管理方式,AUTO为系统自动管理,MANUAL为手工管理。默认为AUTO。
2. 创建实例
-
创建表空间需在SQL plus中,登陆sysdba用户创建
su - oracle
sqlplus /nolog
conn /as sysdba;
- 查看数据位置
查看Sql:select * from dba_data_files;
- 创建表空间
创建一个初始空间为8G且自增的表空间命令:create tablespace tbs_name datafile '/home/oracle/app/oradata/orcl/tbsname.dbf' size 8G autoextend on next 200M maxsize unlimited;
- 查看创建结果
查询表空间Sql:
SELECT t.tablespace_name, round(SUM(bytes / (1024 * 1024)), 0) ts_size
FROM dba_tablespaces t, dba_data_files d
WHERE t.tablespace_name = d.tablespace_name
GROUP BY t.tablespace_name;
三. 表空间拓展
1. 拓展原因
表空间无法自动拓展,主要有两个原因,一个是磁盘资源不足,一个是到了最大值。其中判断最大值需要知道表空间数据文件有两种,一种是固定大小的,最大值就是其设置大小;一种是可以自增的,自增的也可以设置一个最大值,如果不设置,那么就会默认一个最大值,默认最大值是32G。
当磁盘资源不足时,就需要通过拓展磁盘资源的手段,增加磁盘空间。如果是达到了数据文件的最大值,就需要通过以下方式进行表空间拓展。
2. 查看
查看表空间使用情况Sql:
SELECT b.tablespace_name AS "表空间",
b.file_name AS "物理文件名",
b.bytes / 1024 / 1024 AS "当前大小(M)",
(b.bytes - SUM(nvl(a.bytes, 0))) / 1024 / 1024 AS "已使用(M)",
substr((b.bytes - SUM(nvl(a.bytes, 0))) / (b.bytes) * 100, 1, 5) AS "使用率(%)",
CASE b.autoextensible
WHEN 'YES' THEN
'是'
ELSE
'否'
END AS "是否自增",
b.maxbytes / 1024 / 1024 AS "自增最大容量(M)"
FROM dba_free_space a, dba_data_files b
WHERE a.file_id = b.file_id
AND a.tablespace_name IN ('TBS_NAME')
GROUP BY b.tablespace_name, b.file_name, b.bytes, b.autoextensible, b.maxbytes
ORDER BY b.tablespace_name;
也可以在plsql查看
3. 拓展方式
- 首选为表空间增加数据文件(表空间达到32G上线,需增加表空间文件)
alter tablespace TBS_NAME
add datafile path/tbs_file_name1.dbf' --数据文件名
size 100M --初始大小
autoextend on next 1M maxsize 8192M; --自增,每次增加1M,最大为8192M(8192M可为)
- 更改表空间
alter database datafile 'path/tbs_file_name1.dbf' resize 1024m;
- 固定大小表空间,设置文件自动扩展
alter database datafile 'path/tbs_file_name1.dbf' autoextend on next 1M maxsize 8192M;
- 多个表空间可以切换Undo表空间
alter system set undo_tablespace = TBS_NAME;