但行好事
莫论前程❤

Oracle学习笔记–表空间

表空间概述

  1. Oracle表空间是一个逻辑的概念,它在物理上是不存在的

表空间属性:

  • 一个数据库可以包含多个表空间,一个表空间只能属于一个数据库

  • 一个表空间包含多个数据文件,一个数据文件只能属于一个表空间

img

  1. Oracle数据库存储结构

img

  • 从逻辑上看,一个数据库(database)下面可以分多个表空间(tablespace),一个表空间下可以分多个段(segment),一个表要占一个段,一个索引也要占一个段。一个段由多个区间(extent)组成,一个区间又有一组连续的数据块(data block)组成。这连续的数据库在逻辑上是连续的,有可能在物理磁盘上是分散的。

  • 从物理上看,一个表空间由多个数据文件组成,数据文件是实实在在的磁盘上的文件,这些文件是由Oracle数据库操作系统的block组成的。

操作示例

  1. 创建表空间

语法:

CREATE TABLESPACE 表空间名
DATAFILE '数据文件路径' SIZE 大小
[AUTOEXTEND ON] [NEXT 大小]
[MAXSIZE 大小];

说明:

  • [ ]里面内容可选项,数据文件路径中若包含目录需先创建
  • SIZE 为初始表空间大小,单位为K或者M。
  • AUTOEXTEND 是否自动扩展,值为ON或OFF 【此处的自动扩展是指再原有文件上自动扩展,可指定每次扩展的大小,也可不指定,当不指定时以实际为主】。
  • NEXT 为文件满了后扩展大小。
  • MAXSIZE 为文件最大大小,值为数值或UNLIMITED(表示不限大小)。

示例:

CREATE TABLESPACE ts_test
DATAFILE 'D:\oracle_tablespace\ts_test.dbf' SIZE 20M
AUTOEXTEND ON;
  1. 查询表空间

示例:

select a.tablespace_name,
       round(a.bytes_alloc / 1024 / 1024) megs_alloc,
       round(nvl(b.bytes_free, 0) / 1024 / 1024) megs_free,
       round((a.bytes_alloc - nvl(b.bytes_free, 0)) / 1024 / 1024) megs_used,
       round((nvl(b.bytes_free, 0) / a.bytes_alloc) * 100) Pct_Free,
       100 - round((nvl(b.bytes_free, 0) / a.bytes_alloc) * 100) Pct_used,
       round(maxbytes / 1048576) Max
  from (select f.tablespace_name,
               sum(f.bytes) bytes_alloc,
               sum(decode(f.autoextensible, 'YES', f.maxbytes, 'NO', f.bytes)) maxbytes
          from dba_data_files f
         group by tablespace_name) a,
       (select f.tablespace_name, sum(f.bytes) bytes_free
          from dba_free_space f
         group by tablespace_name) b
 where a.tablespace_name = b.tablespace_name(+)
union all
select h.tablespace_name,
       round(sum(h.bytes_free + h.bytes_used) / 1048576) megs_alloc,
       round(sum((h.bytes_free + h.bytes_used) - nvl(p.bytes_used, 0)) /1048576) megs_free,
       round(sum(nvl(p.bytes_used, 0)) / 1048576) megs_used,
       round((sum((h.bytes_free + h.bytes_used) - nvl(p.bytes_used, 0)) /
             sum(h.bytes_used + h.bytes_free)) * 100) Pct_Free,
       100 -round((sum((h.bytes_free + h.bytes_used) - nvl(p.bytes_used, 0)) /
             sum(h.bytes_used + h.bytes_free)) * 100) pct_used,
       round(sum(f.maxbytes) / 1048576) max
  from sys.v_$TEMP_SPACE_HEADER h,
       sys.v_$Temp_extent_pool  p,
       dba_temp_files           f
 where p.file_id(+) = h.file_id
   and p.tablespace_name(+) = h.tablespace_name
   and f.file_id = h.file_id
   and f.tablespace_name = h.tablespace_name
 group by h.tablespace_name
 ORDER BY 1
  1. 修改表空间

示例

# 1.修改表空间 
alter table TABLE_NAME move tablespace TABLESPACENAME 
# 查询当前用户下的所有表 
select 'alter table  '|| table_name ||'  move tablespace tablespacename;'  from user_all_tables; 
# 2.修改索引的表空间 
alter index INDEX_NAME rebuild tablespace TABLESPACENAME 
# 查询当前用户下的所有索引 
select 'alter index '|| index_name ||' rebuild tablespace tablespacename;' from user_indexes; 
  1. 删除表空间

语法:

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

示例:

--仅删除表空间
DROP TABLESPACE ts_test;
--删除表空间及数据文件
DROP TABLESPACE ts_test INCLUDING CONTENTS AND DATAFILES;
  1. 修改表空间大小

示例

alter database datafile
'D:\oracle_tablespace\ts_test2.dbf' RESIZE 80M;
  1. 表空间扩展
CREATE TABLESPACE EPRKDATA DATAFILE 'D:\oradata\EPRKDATA01.dbf' size 1g autoextend on;
ALTER TABLESPACE EPRKDATA ADD DATAFILE 'D:\oradata\EPRKDATA02.dbf' SIZE 1g AUTOEXTEND ON; 
ALTER TABLESPACE EPRKDATA ADD DATAFILE 'D:\oradata\EPRKDATA03.dbf' SIZE 1g AUTOEXTEND ON; 
...
赞(1) 打赏
未经允许不得转载:刘鹏博客 » Oracle学习笔记–表空间
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!

 

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏