天天看点

Oracle表空间扩展

使用oracle时可能遇到

无法通过8192在表空间中扩展

错误,原因是数据库的表空间不足。

oracle表空间数据文件容量与db_block_size有关,在初始建库时指定DB_BLOCK_SIZE值,后期修改需要重建库,默认值8k。oracle物理文件最大允许4194304个数据块(由操作系统决定),表空间数据文件的最大值为

4194304 × db_block_size

。因此db_block_size决定了数据文件最大容量:

4k最大表空间:  16384M
8K最大表空间:  32768M
16k最大表空间: 65536M
32K最大表空间: 131072M
64k最大表空间: 262144M           

oralce默认数据块大小为8k,这种情况下,单文件最大为32G,但是默认块大小不能更改,如需更改需要重建数据库。

因此当文件达到32g时,可以通过增加数据文件的方式进行表空间扩容。

查看所有表空间:

select tablespace_name, file_id, file_name,round(bytes/(1024*1024),0) total_space
from dba_data_files where tablespace_name='***' 
order by tablespace_name           

查看表空间统计量:

SELECT a.tablespace_name "表空间名", 
total "表空间大小", 
free "表空间剩余大小", 
(total - free) "表空间使用大小", 
total / (1024 * 1024 * 1024) "表空间大小(G)", 
free / (1024 * 1024 * 1024) "表空间剩余大小(G)", 
(total - free) / (1024 * 1024 * 1024) "表空间使用大小(G)", 
round((total - free) / total, 4) * 100 "使用率 %" 
FROM (SELECT tablespace_name, SUM(bytes) free 
FROM dba_free_space 
GROUP BY tablespace_name) a, 
(SELECT tablespace_name, SUM(bytes) total 
FROM dba_data_files 
GROUP BY tablespace_name) b 
WHERE a.tablespace_name = b.tablespace_name and a.tablespace_name='***';           

增加数据文件个数:

alter tablespace 表空间名称 add datafile '新的数据文件地址' size 数据文件大小

例如:

alter tablespace *** add datafile '/u01/app/oracle/oradata/***.dbf' size 34358689792;           

如果数据库表空间扩展较快,需要分析一下是哪些表占用空间过大,是否存在优化空间,查看占用量:

select t.owner,t.segment_name,t.tablespace_name,bytes / (1024 * 1024 * 1024) as "sizes(G)",q.num_rows,t.segment_type
  from dba_segments t
  left join dba_tables q
    on t.segment_name=q.table_name
   and t.owner=q.owner
 --where t.segment_type='TABLE'
   --and t.tablespace_name='***' 
 order by bytes desc           

如果表中使用了LOB类型字段,会发现以

$$

结尾的是LOBSEGMENT,其中保存的数据类型是CLOB或BLOB大数据对象。

当我们建表的时候,oracle对在对应的表空间分配一个segment存放数据,并且会因为数据量的增大而做扩展。但当所建立的表含有lob型的数据时,oracle会为每个lob字段生成一个独立的segment用来存放数据,同时也建立了独立的index segment,oracle对它们是单独管理的。

普通表只会新增一个或两个段对象,类型为TABLE和INDEX,数据存放在TABLE段,索引放在INDEX段。但是LOB列则额外新增了两个段对象,类型为LOBSEGMENT和LOBINDEX,LOBINDEX用于指向LOB段,找出其中的某一部分,所以表中LOB字段存储的是一个地址(或者说是一个指针),通过lobindex能找到在lobSegment存储的实际数据。

因此lobSegment保存了LOB列的真正的数据,所以会非常大,可能会造成无法忍受的表空间占用量,这时候,如果从业务上能避免使用LOB字段,会明显减少表空间占用量。